diff options
| author | 2012-06-18 14:49:45 -0700 | |
|---|---|---|
| committer | 2012-06-20 15:12:44 -0700 | |
| commit | ad8f15e0b13383b2eaa2486b230debeae7a55661 (patch) | |
| tree | 0939aa6dee5f24dc4ae21dd2c06db0265d4682ca /src | |
| parent | 83c26f9c7ee42b0037d2679f6f37dd28a3f13af7 (diff) | |
Milestone: close Quick side channel communication
This CL elminates side-channel communication between the Quick
Compiler's Dex->MIR->LLVM-IR and LLVM-IR->LIR lowering stages by clearing
key data structures between the two stages.
The purpose if to flush out any hidden information transfer, and thus
ensure that the GreenlandIR representation of the program is sufficient.
Note that as of this change, we've lost all register promotion info
so the Quick compiler will generate non-promoted code. A near-future
CL will restore that info from the MethodInfo intrinsic.
Change-Id: I797845f1fc029bc03aac3ec20f8cd81f917817ca
Diffstat (limited to 'src')
| -rw-r--r-- | src/compiler/Compiler.h | 4 | ||||
| -rw-r--r-- | src/compiler/CompilerIR.h | 1 | ||||
| -rw-r--r-- | src/compiler/Frontend.cc | 47 | ||||
| -rw-r--r-- | src/compiler/Ralloc.cc | 24 | ||||
| -rw-r--r-- | src/compiler/SSATransformation.cc | 1 | ||||
| -rw-r--r-- | src/compiler/codegen/CodegenFactory.cc | 6 | ||||
| -rw-r--r-- | src/compiler/codegen/GenInvoke.cc | 10 | ||||
| -rw-r--r-- | src/compiler/codegen/MethodBitcode.cc | 151 | ||||
| -rw-r--r-- | src/compiler/codegen/MethodCodegenDriver.cc | 4 | ||||
| -rw-r--r-- | src/compiler/codegen/Ralloc.h | 1 | ||||
| -rw-r--r-- | src/compiler/codegen/RallocUtil.cc | 11 | ||||
| -rw-r--r-- | src/compiler/codegen/arm/ArchFactory.cc | 5 | ||||
| -rw-r--r-- | src/compiler/codegen/mips/ArchFactory.cc | 5 | ||||
| -rw-r--r-- | src/compiler/codegen/x86/ArchFactory.cc | 5 |
14 files changed, 194 insertions, 81 deletions
diff --git a/src/compiler/Compiler.h b/src/compiler/Compiler.h index 2f95be2311..4d749ce241 100644 --- a/src/compiler/Compiler.h +++ b/src/compiler/Compiler.h @@ -127,6 +127,9 @@ enum debugControlVector { kDebugShowMemoryUsage, kDebugShowNops, kDebugCountOpcodes, +#if defined(ART_USE_QUICK_COMPILER) + kDebugDumpBitcodeFile, +#endif }; enum OatMethodAttributes { @@ -193,6 +196,7 @@ void oatDumpCFG(CompilationUnit* cUnit, const char* dirPrefix); void oatProcessSwitchTables(CompilationUnit* cUnit); bool oatIsFpReg(int reg); uint32_t oatFpRegMask(void); +void oatReplaceSpecialChars(std::string& str); } // namespace art diff --git a/src/compiler/CompilerIR.h b/src/compiler/CompilerIR.h index b1c7427ee5..ba997158ff 100644 --- a/src/compiler/CompilerIR.h +++ b/src/compiler/CompilerIR.h @@ -504,6 +504,7 @@ struct CompilationUnit { /* SSA name for Method* */ int methodSReg; + RegLocation methodLoc; // Describes location of method* /* * Set to the Dalvik PC of the switch instruction if it has more than diff --git a/src/compiler/Frontend.cc b/src/compiler/Frontend.cc index d5e6b124c5..3d6e98369e 100644 --- a/src/compiler/Frontend.cc +++ b/src/compiler/Frontend.cc @@ -52,6 +52,9 @@ static uint32_t kCompilerDebugFlags = 0 | // Enable debug/testing modes //(1 << kDebugShowMemoryUsage) | //(1 << kDebugShowNops) | //(1 << kDebugCountOpcodes) | +#if defined(ART_USE_QUICK_COMPILER) + //(1 << kDebugDumpBitcodeFile) | +#endif 0; inline bool contentIsInsn(const u2* codePtr) { @@ -243,37 +246,26 @@ BasicBlock *findBlock(CompilationUnit* cUnit, unsigned int codeOffset, return bb; } +/* Turn method name into a legal Linux file name */ +void oatReplaceSpecialChars(std::string& str) +{ + static const struct { const char before; const char after; } match[] = + {{'/','-'}, {';','#'}, {' ','#'}, {'$','+'}, + {'(','@'}, {')','@'}, {'<','='}, {'>','='}}; + for (unsigned int i = 0; i < sizeof(match)/sizeof(match[0]); i++) { + std::replace(str.begin(), str.end(), match[i].before, match[i].after); + } +} + /* Dump the CFG into a DOT graph */ void oatDumpCFG(CompilationUnit* cUnit, const char* dirPrefix) { FILE* file; - std::string name(PrettyMethod(cUnit->method_idx, *cUnit->dex_file)); - char startOffset[80]; - sprintf(startOffset, "_%x", cUnit->entryBlock->fallThrough->startOffset); - char* fileName = (char*) oatNew(cUnit, strlen(dirPrefix) + - name.length() + strlen(".dot") + 1, - true, kAllocDebugInfo); - sprintf(fileName, "%s%s%s.dot", dirPrefix, name.c_str(), startOffset); - - /* - * Convert the special characters into a filesystem- and shell-friendly - * format. - */ - int i; - for (i = strlen(dirPrefix); fileName[i]; i++) { - if (fileName[i] == '/') { - fileName[i] = '_'; - } else if (fileName[i] == ';') { - fileName[i] = '#'; - } else if (fileName[i] == '$') { - fileName[i] = '+'; - } else if (fileName[i] == '(' || fileName[i] == ')') { - fileName[i] = '@'; - } else if (fileName[i] == '<' || fileName[i] == '>') { - fileName[i] = '='; - } - } - file = fopen(fileName, "w"); + std::string fname(PrettyMethod(cUnit->method_idx, *cUnit->dex_file)); + oatReplaceSpecialChars(fname); + fname = StringPrintf("%s%s%x.dot", dirPrefix, fname.c_str(), + cUnit->entryBlock->fallThrough->startOffset); + file = fopen(fname.c_str(), "w"); if (file == NULL) { return; } @@ -788,6 +780,7 @@ CompiledMethod* oatCompileMethod(Compiler& compiler, #if defined(ART_USE_QUICK_COMPILER) if (cUnit->genBitcode) { cUnit->printMe = true; + cUnit->enableDebug |= (1 << kDebugDumpBitcodeFile); } #endif if (cUnit->instructionSet == kX86) { diff --git a/src/compiler/Ralloc.cc b/src/compiler/Ralloc.cc index 29766e0ec3..0062f53414 100644 --- a/src/compiler/Ralloc.cc +++ b/src/compiler/Ralloc.cc @@ -339,6 +339,17 @@ static const RegLocation freshLoc = {kLocDalvikFrame, 0, 0, 0, 0, 0, 0, 0, 0, INVALID_REG, INVALID_REG, INVALID_SREG, INVALID_SREG}; +int oatComputeFrameSize(CompilationUnit* cUnit) { + /* Figure out the frame size */ + static const uint32_t kAlignMask = kStackAlignment - 1; + uint32_t size = (cUnit->numCoreSpills + cUnit->numFPSpills + + 1 /* filler word */ + cUnit->numRegs + cUnit->numOuts + + cUnit->numCompilerTemps + 1 /* curMethod* */) + * sizeof(uint32_t); + /* Align and set */ + return (size + kAlignMask) & ~(kAlignMask); +} + /* * Simple register allocation. Some Dalvik virtual registers may * be promoted to physical registers. Most of the work for temp @@ -459,19 +470,16 @@ void oatSimpleRegAlloc(CompilationUnit* cUnit) oatDoPromotion(cUnit); + /* Get easily-accessable post-promotion copy of RegLocation for Method* */ + cUnit->methodLoc = cUnit->regLocation[cUnit->methodSReg]; + if (cUnit->printMe && !(cUnit->disableOpt & (1 << kPromoteRegs))) { LOG(INFO) << "After Promotion"; oatDumpRegLocTable(cUnit->regLocation, cUnit->numSSARegs); } - /* Figure out the frame size */ - static const uint32_t kAlignMask = kStackAlignment - 1; - uint32_t size = (cUnit->numCoreSpills + cUnit->numFPSpills + - 1 /* filler word */ + cUnit->numRegs + cUnit->numOuts + - cUnit->numCompilerTemps + 1 /* curMethod* */) - * sizeof(uint32_t); - /* Align and set */ - cUnit->frameSize = (size + kAlignMask) & ~(kAlignMask); + /* Set the frame size */ + cUnit->frameSize = oatComputeFrameSize(cUnit); } } // namespace art diff --git a/src/compiler/SSATransformation.cc b/src/compiler/SSATransformation.cc index 6eb0415329..7d6a733277 100644 --- a/src/compiler/SSATransformation.cc +++ b/src/compiler/SSATransformation.cc @@ -206,7 +206,6 @@ void computeDFSOrders(CompilationUnit* cUnit) if (mismatch) { LOG(INFO) << "Mismatch for " << PrettyMethod(cUnit->method_idx, *cUnit->dex_file); - oatDumpCFG(cUnit, "/tmp/"); LOG(INFO) << "New dfs"; for (unsigned int i = 0; i < cUnit->dfsOrder.numUsed; i++) { LOG(INFO) << i << " - " << cUnit->dfsOrder.elemList[i]; diff --git a/src/compiler/codegen/CodegenFactory.cc b/src/compiler/codegen/CodegenFactory.cc index 71b557c0d8..9d380c7e36 100644 --- a/src/compiler/codegen/CodegenFactory.cc +++ b/src/compiler/codegen/CodegenFactory.cc @@ -292,17 +292,17 @@ void markGCCard(CompilationUnit* cUnit, int valReg, int tgtAddrReg) /* Utilities to load the current Method* */ void loadCurrMethodDirect(CompilationUnit *cUnit, int rTgt) { - loadValueDirectFixed(cUnit, cUnit->regLocation[cUnit->methodSReg], rTgt); + loadValueDirectFixed(cUnit, cUnit->methodLoc, rTgt); } RegLocation loadCurrMethod(CompilationUnit *cUnit) { - return loadValue(cUnit, cUnit->regLocation[cUnit->methodSReg], kCoreReg); + return loadValue(cUnit, cUnit->methodLoc, kCoreReg); } bool methodStarInReg(CompilationUnit* cUnit) { - return (cUnit->regLocation[cUnit->methodSReg].location == kLocPhysReg); + return (cUnit->methodLoc.location == kLocPhysReg); } diff --git a/src/compiler/codegen/GenInvoke.cc b/src/compiler/codegen/GenInvoke.cc index bcc9067fd7..7c2cf1cba3 100644 --- a/src/compiler/codegen/GenInvoke.cc +++ b/src/compiler/codegen/GenInvoke.cc @@ -33,16 +33,18 @@ LIR* opCondBranch(CompilationUnit* cUnit, ConditionCode cc, LIR* target); * If there are any ins passed in registers that have not been promoted * to a callee-save register, flush them to the frame. Perform intial * assignment of promoted arguments. + * + * argLocs is an array of location records describing the incoming arguments + * with one location record per word of argument. */ -void flushIns(CompilationUnit* cUnit) +void flushIns(CompilationUnit* cUnit, RegLocation* argLocs, RegLocation rlMethod) { /* * Dummy up a RegLocation for the incoming Method* * It will attempt to keep rARG0 live (or copy it to home location * if promoted). */ - RegLocation rlSrc = cUnit->regLocation[cUnit->methodSReg]; - RegLocation rlMethod = cUnit->regLocation[cUnit->methodSReg]; + RegLocation rlSrc = rlMethod; rlSrc.location = kLocPhysReg; rlSrc.lowReg = rARG0; rlSrc.home = false; @@ -75,7 +77,7 @@ void flushIns(CompilationUnit* cUnit) if (i < numArgRegs) { // If arriving in register bool needFlush = true; - RegLocation* tLoc = &cUnit->regLocation[startVReg + i]; + RegLocation* tLoc = &argLocs[i]; if ((vMap->coreLocation == kLocPhysReg) && !tLoc->fp) { opRegCopy(cUnit, vMap->coreReg, argRegs[i]); needFlush = false; diff --git a/src/compiler/codegen/MethodBitcode.cc b/src/compiler/codegen/MethodBitcode.cc index f13a473be5..66823c2313 100644 --- a/src/compiler/codegen/MethodBitcode.cc +++ b/src/compiler/codegen/MethodBitcode.cc @@ -27,6 +27,7 @@ #include <llvm/Type.h> #include <llvm/Instructions.h> #include <llvm/Support/Casting.h> +#include <llvm/Support/InstIterator.h> const char* labelFormat = "L0x%x_%d"; @@ -75,6 +76,50 @@ llvm::Type* llvmTypeFromLocRec(CompilationUnit* cUnit, RegLocation loc) return res; } +/* Create an in-memory RegLocation from an llvm Value. */ +void createLocFromValue(CompilationUnit* cUnit, llvm::Value* val) +{ + // NOTE: llvm takes shortcuts with c_str() - get to std::string firstt + std::string s(val->getName().str()); + const char* valName = s.c_str(); + if (cUnit->printMe) { + LOG(INFO) << "Processing llvm Value " << valName; + } + SafeMap<llvm::Value*, RegLocation>::iterator it = cUnit->locMap.find(val); + DCHECK(it == cUnit->locMap.end()) << " - already defined: " << valName; + int baseSReg = INVALID_SREG; + int subscript = -1; + sscanf(valName, "v%d_%d", &baseSReg, &subscript); + if ((baseSReg == INVALID_SREG) && (!strcmp(valName, "method"))) { + baseSReg = SSA_METHOD_BASEREG; + subscript = 0; + } + if (cUnit->printMe) { + LOG(INFO) << "Base: " << baseSReg << ", Sub: " << subscript; + } + DCHECK_NE(baseSReg, INVALID_SREG); + DCHECK_NE(subscript, -1); + // TODO: redo during C++'ification + RegLocation loc = {kLocDalvikFrame, 0, 0, 0, 0, 0, 0, 0, 0, INVALID_REG, + INVALID_REG, INVALID_SREG, INVALID_SREG}; + llvm::Type* ty = val->getType(); + loc.wide = ((ty == cUnit->irb->getInt64Ty()) || + (ty == cUnit->irb->getDoubleTy())); + loc.defined = true; + if ((ty == cUnit->irb->getFloatTy()) || + (ty == cUnit->irb->getDoubleTy())) { + loc.fp = true; + } else if (ty == cUnit->irb->GetJObjectTy()) { + loc.ref = true; + } else { + loc.core = true; + } + loc.home = false; // Will change during promotion + loc.sRegLow = baseSReg; + loc.origSReg = cUnit->locMap.size(); + cUnit->locMap.Put(val, loc); +} + void initIR(CompilationUnit* cUnit) { cUnit->context = new llvm::LLVMContext(); @@ -1372,19 +1417,25 @@ void oatMethodMIR2Bitcode(CompilationUnit* cUnit) llvm::verifyFunction(*cUnit->func, llvm::PrintMessageAction); - // Write bitcode to file - std::string errmsg; + if (cUnit->enableDebug & (1 << kDebugDumpBitcodeFile)) { + // Write bitcode to file + std::string errmsg; + std::string fname(PrettyMethod(cUnit->method_idx, *cUnit->dex_file)); + oatReplaceSpecialChars(fname); + // TODO: make configurable + fname = StringPrintf("/tmp/%s.bc", fname.c_str()); - llvm::OwningPtr<llvm::tool_output_file> out_file( - new llvm::tool_output_file("/tmp/foo.bc", errmsg, - llvm::raw_fd_ostream::F_Binary)); + llvm::OwningPtr<llvm::tool_output_file> out_file( + new llvm::tool_output_file(fname.c_str(), errmsg, + llvm::raw_fd_ostream::F_Binary)); - if (!errmsg.empty()) { - LOG(ERROR) << "Failed to create bitcode output file: " << errmsg; - } + if (!errmsg.empty()) { + LOG(ERROR) << "Failed to create bitcode output file: " << errmsg; + } - llvm::WriteBitcodeToFile(cUnit->module, out_file->os()); - out_file->keep(); + llvm::WriteBitcodeToFile(cUnit->module, out_file->os()); + out_file->keep(); + } } RegLocation getLoc(CompilationUnit* cUnit, llvm::Value* val) { @@ -1575,11 +1626,6 @@ void cvtCall(CompilationUnit* cUnit, llvm::CallInst* callInst, UNIMPLEMENTED(FATAL); } -void setMethodInfo(CompilationUnit* cUnit, llvm::CallInst* callInst) -{ - UNIMPLEMENTED(WARNING) << "Net setMethodInfo"; -} - void cvtCopy(CompilationUnit* cUnit, llvm::CallInst* callInst) { DCHECK(callInst->getNumArgOperands() == 1); @@ -1670,6 +1716,14 @@ void cvtInvoke(CompilationUnit* cUnit, llvm::CallInst* callInst, genInvoke(cUnit, info); } +/* Look up the RegLocation associated with a Value. Must already be defined */ +RegLocation valToLoc(CompilationUnit* cUnit, llvm::Value* val) +{ + SafeMap<llvm::Value*, RegLocation>::iterator it = cUnit->locMap.find(val); + DCHECK(it != cUnit->locMap.end()) << "Missing definition"; + return it->second; +} + bool methodBitcodeBlockCodeGen(CompilationUnit* cUnit, llvm::BasicBlock* bb) { bool isEntry = (bb == &cUnit->func->getEntryBlock()); @@ -1697,7 +1751,19 @@ bool methodBitcodeBlockCodeGen(CompilationUnit* cUnit, llvm::BasicBlock* bb) if (isEntry) { cUnit->currentDalvikOffset = 0; - genEntrySequence(cUnit); + RegLocation* argLocs = (RegLocation*) + oatNew(cUnit, sizeof(RegLocation) * cUnit->numIns, true, kAllocMisc); + llvm::Function::arg_iterator it(cUnit->func->arg_begin()); + llvm::Function::arg_iterator it_end(cUnit->func->arg_end()); + for (unsigned i = 0; it != it_end; ++it) { + llvm::Value* val = it; + argLocs[i++] = valToLoc(cUnit, val); + llvm::Type* ty = val->getType(); + if ((ty == cUnit->irb->getInt64Ty()) || (ty == cUnit->irb->getDoubleTy())) { + argLocs[i++].sRegLow = INVALID_SREG; + } + } + genEntrySequence(cUnit, argLocs, cUnit->methodLoc); } // Visit all of the instructions in the block @@ -1779,7 +1845,7 @@ bool methodBitcodeBlockCodeGen(CompilationUnit* cUnit, llvm::BasicBlock* bb) cvtConst(cUnit, callInst); break; case greenland::IntrinsicHelper::MethodInfo: - setMethodInfo(cUnit, callInst); + // Already dealt with - just ignore it here. break; case greenland::IntrinsicHelper::CheckSuspend: genSuspendTest(cUnit, 0 /* optFlags already applied */); @@ -1891,17 +1957,62 @@ bool methodBitcodeBlockCodeGen(CompilationUnit* cUnit, llvm::BasicBlock* bb) */ void oatMethodBitcode2LIR(CompilationUnit* cUnit) { - int numBasicBlocks = cUnit->func->getBasicBlockList().size(); + llvm::Function* func = cUnit->func; + int numBasicBlocks = func->getBasicBlockList().size(); // Allocate a list for LIR basic block labels cUnit->blockLabelList = (void*)oatNew(cUnit, sizeof(LIR) * numBasicBlocks, true, kAllocLIR); LIR* labelList = (LIR*)cUnit->blockLabelList; int nextLabel = 0; - for (llvm::Function::iterator i = cUnit->func->begin(), - e = cUnit->func->end(); i != e; ++i) { + for (llvm::Function::iterator i = func->begin(), + e = func->end(); i != e; ++i) { cUnit->blockToLabelMap.Put(static_cast<llvm::BasicBlock*>(i), &labelList[nextLabel++]); } + + /* + * Keep honest - clear regLocations, Value => RegLocation, + * promotion map and VmapTables. + */ + cUnit->locMap.clear(); // Start fresh + cUnit->regLocation = NULL; + for (int i = 0; i < cUnit->numDalvikRegisters + cUnit->numCompilerTemps + 1; + i++) { + cUnit->promotionMap[i].coreLocation = kLocDalvikFrame; + cUnit->promotionMap[i].fpLocation = kLocDalvikFrame; + } + cUnit->coreSpillMask = 0; + cUnit->numCoreSpills = 0; + cUnit->fpSpillMask = 0; + cUnit->numFPSpills = 0; + cUnit->coreVmapTable.clear(); + cUnit->fpVmapTable.clear(); + oatAdjustSpillMask(cUnit); + cUnit->frameSize = oatComputeFrameSize(cUnit); + + /* + * At this point, we've lost all knowledge of register promotion. + * Rebuild that info from the MethodInfo intrinsic (if it + * exists - not required for correctness). + */ + // TODO: find and recover MethodInfo. + + // Create RegLocations for arguments + llvm::Function::arg_iterator it(cUnit->func->arg_begin()); + llvm::Function::arg_iterator it_end(cUnit->func->arg_end()); + for (; it != it_end; ++it) { + llvm::Value* val = it; + createLocFromValue(cUnit, val); + } + // Create RegLocations for all non-argument defintions + for (llvm::inst_iterator i = llvm::inst_begin(func), + e = llvm::inst_end(func); i != e; ++i) { + llvm::Value* val = &*i; + if (val->hasName() && (val->getName().str().c_str()[0] == 'v')) { + createLocFromValue(cUnit, val); + } + } + // Walk the blocks, generating code. for (llvm::Function::iterator i = cUnit->func->begin(), e = cUnit->func->end(); i != e; ++i) { diff --git a/src/compiler/codegen/MethodCodegenDriver.cc b/src/compiler/codegen/MethodCodegenDriver.cc index aab323b582..7898ddb7be 100644 --- a/src/compiler/codegen/MethodCodegenDriver.cc +++ b/src/compiler/codegen/MethodCodegenDriver.cc @@ -904,7 +904,9 @@ bool methodBlockCodeGen(CompilationUnit* cUnit, BasicBlock* bb) LIR* headLIR = NULL; if (bb->blockType == kEntryBlock) { - genEntrySequence(cUnit); + int startVReg = cUnit->numDalvikRegisters - cUnit->numIns; + genEntrySequence(cUnit, &cUnit->regLocation[startVReg], + cUnit->regLocation[cUnit->methodSReg]); } else if (bb->blockType == kExitBlock) { genExitSequence(cUnit); } diff --git a/src/compiler/codegen/Ralloc.h b/src/compiler/codegen/Ralloc.h index 8c3887a944..ec47e22963 100644 --- a/src/compiler/codegen/Ralloc.h +++ b/src/compiler/codegen/Ralloc.h @@ -229,6 +229,7 @@ extern uint32_t oatFPRegMask(void); extern void oatAdjustSpillMask(CompilationUnit* cUnit); void oatMarkPreservedSingle(CompilationUnit* cUnit, int vReg, int reg); void oatRegCopy(CompilationUnit* cUnit, int rDest, int rSrc); +int oatComputeFrameSize(CompilationUnit* cUnit); } // namespace art diff --git a/src/compiler/codegen/RallocUtil.cc b/src/compiler/codegen/RallocUtil.cc index e2f2cd683b..074fd26ca0 100644 --- a/src/compiler/codegen/RallocUtil.cc +++ b/src/compiler/codegen/RallocUtil.cc @@ -29,17 +29,6 @@ namespace art { -#define SREG(c, s) ((c)->regLocation[(s)].sRegLow) -/* - * Get the "real" sreg number associated with an sReg slot. In general, - * sReg values passed through codegen are the SSA names created by - * dataflow analysis and refer to slot numbers in the cUnit->regLocation - * array. However, renaming is accomplished by simply replacing RegLocation - * entries in the cUnit->reglocation[] array. Therefore, when location - * records for operands are first created, we need to ask the locRecord - * identified by the dataflow pass what it's new name is. - */ - /* * Free all allocated temps in the temp pools. Note that this does * not affect the "liveness" of a temp register, which will stay diff --git a/src/compiler/codegen/arm/ArchFactory.cc b/src/compiler/codegen/arm/ArchFactory.cc index c0d91a454a..ba49277a3f 100644 --- a/src/compiler/codegen/arm/ArchFactory.cc +++ b/src/compiler/codegen/arm/ArchFactory.cc @@ -56,7 +56,8 @@ int loadHelper(CompilationUnit* cUnit, int offset) return rLR; } -void genEntrySequence(CompilationUnit* cUnit) +void genEntrySequence(CompilationUnit* cUnit, RegLocation* argLocs, + RegLocation rlMethod) { int spillCount = cUnit->numCoreSpills + cUnit->numFPSpills; /* @@ -101,7 +102,7 @@ void genEntrySequence(CompilationUnit* cUnit) opRegImm(cUnit, kOpSub, rSP, cUnit->frameSize - (spillCount * 4)); } - flushIns(cUnit); + flushIns(cUnit, argLocs, rlMethod); if (cUnit->genDebugger) { // Refresh update debugger callout diff --git a/src/compiler/codegen/mips/ArchFactory.cc b/src/compiler/codegen/mips/ArchFactory.cc index bf4c8a6186..4a61efb4a0 100644 --- a/src/compiler/codegen/mips/ArchFactory.cc +++ b/src/compiler/codegen/mips/ArchFactory.cc @@ -144,7 +144,8 @@ void unSpillCoreRegs(CompilationUnit* cUnit) opRegImm(cUnit, kOpAdd, rSP, cUnit->frameSize); } -void genEntrySequence(CompilationUnit* cUnit) +void genEntrySequence(CompilationUnit* cUnit, RegLocation* argLocs, + RegLocation rlMethod) { int spillCount = cUnit->numCoreSpills + cUnit->numFPSpills; /* @@ -183,7 +184,7 @@ void genEntrySequence(CompilationUnit* cUnit) opRegImm(cUnit, kOpSub, rSP, cUnit->frameSize - (spillCount * 4)); } - flushIns(cUnit); + flushIns(cUnit, argLocs, rlMethod); if (cUnit->genDebugger) { // Refresh update debugger callout diff --git a/src/compiler/codegen/x86/ArchFactory.cc b/src/compiler/codegen/x86/ArchFactory.cc index b3cebdce19..1620044069 100644 --- a/src/compiler/codegen/x86/ArchFactory.cc +++ b/src/compiler/codegen/x86/ArchFactory.cc @@ -163,7 +163,8 @@ void opRegThreadMem(CompilationUnit* cUnit, OpKind op, int rDest, int threadOffs newLIR2(cUnit, opcode, rDest, threadOffset); } -void genEntrySequence(CompilationUnit* cUnit) +void genEntrySequence(CompilationUnit* cUnit, RegLocation* argLocs, + RegLocation rlMethod) { /* * On entry, rARG0, rARG1, rARG2 are live. Let the register @@ -199,7 +200,7 @@ void genEntrySequence(CompilationUnit* cUnit) oatInsertGrowableList(cUnit, &cUnit->throwLaunchpads, (intptr_t)tgt); } - flushIns(cUnit); + flushIns(cUnit, argLocs, rlMethod); if (cUnit->genDebugger) { // Refresh update debugger callout |