Skip to content

Commit

Permalink
Merge pull request #4185 from cathyzhyi/query
Browse files Browse the repository at this point in the history
Query node property to catch loads in runFEMacro
  • Loading branch information
andrewcraik committed Jan 9, 2019
2 parents ba36fc7 + 4cee32b commit a7c7fb8
Showing 1 changed file with 20 additions and 22 deletions.
42 changes: 20 additions & 22 deletions runtime/compiler/env/j9method.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8516,31 +8516,29 @@ TR_J9ByteCodeIlGenerator::walkReferenceChain(TR::Node *node, uintptrj_t receiver
{
TR_J9VMBase *fej9 = (TR_J9VMBase *)(comp()->fe());
uintptrj_t result = 0;
switch (node->getOpCodeValue())
if (node->getOpCode().isLoadDirect() && node->getType() == TR::Address)
{
case TR::aload:
TR_ASSERT(node->getSymbolReference()->getCPIndex() == 0, "walkReferenceChain expecting aload of 'this'; found aload of %s", comp()->getDebug()->getName(node->getSymbolReference()));
result = receiver;
break;
case TR::aloadi:
TR_ASSERT(node->getSymbolReference()->getCPIndex() == 0, "walkReferenceChain expecting aload of 'this'; found aload of %s", comp()->getDebug()->getName(node->getSymbolReference()));
result = receiver;
}
else if (node->getOpCode().isLoadIndirect() && node->getType() == TR::Address)
{
TR::SymbolReference *symRef = node->getSymbolReference();
if (symRef->isUnresolved())
{
TR::SymbolReference *symRef = node->getSymbolReference();
if (symRef->isUnresolved())
{
if (comp()->getOption(TR_TraceILGen))
traceMsg(comp(), " walkReferenceChain hit unresolved symref %s; aborting\n", symRef->getName(comp()->getDebug()));
comp()->failCompilation<TR::ILGenFailure>("Symbol reference is unresolved");
}
TR::Symbol *sym = symRef->getSymbol();
TR_ASSERT(sym->isShadow() && symRef->getCPIndex() > 0, "walkReferenceChain expecting field load; found load of %s", comp()->getDebug()->getName(symRef));
uintptrj_t fieldOffset = symRef->getOffset() - sizeof(J9Object); // blah
result = fej9->getReferenceFieldAt(walkReferenceChain(node->getFirstChild(), receiver), fieldOffset);
if (comp()->getOption(TR_TraceILGen))
traceMsg(comp(), " walkReferenceChain hit unresolved symref %s; aborting\n", symRef->getName(comp()->getDebug()));
comp()->failCompilation<TR::ILGenFailure>("Symbol reference is unresolved");
}
break;
default:
TR_ASSERT(0, "Unexpected opcode in walkReferenceChain: %s", node->getOpCode().getName());
comp()->failCompilation<TR::ILGenFailure>("Unexpected opcode in walkReferenceChain");
break;
TR::Symbol *sym = symRef->getSymbol();
TR_ASSERT(sym->isShadow() && symRef->getCPIndex() > 0, "walkReferenceChain expecting field load; found load of %s", comp()->getDebug()->getName(symRef));
uintptrj_t fieldOffset = symRef->getOffset() - sizeof(J9Object); // blah
result = fej9->getReferenceFieldAt(walkReferenceChain(node->getFirstChild(), receiver), fieldOffset);
}
else
{
TR_ASSERT(0, "Unexpected opcode in walkReferenceChain: %s", node->getOpCode().getName());
comp()->failCompilation<TR::ILGenFailure>("Unexpected opcode in walkReferenceChain");
}

if (comp()->getOption(TR_TraceILGen))
Expand Down

0 comments on commit a7c7fb8

Please sign in to comment.