diff options
| author | 2011-09-11 15:25:43 -0700 | |
|---|---|---|
| committer | 2011-09-11 18:14:46 -0700 | |
| commit | ec5adf351879cb6235faf2c6c068c2553d85a7d2 (patch) | |
| tree | f3f8e9ab69690e729a523188468d7150ede27bf7 /src/compiler/codegen/RallocUtil.cc | |
| parent | 005ab2eb9e9ab4762c00e73c7028de2850bd5108 (diff) | |
Mark top of managed stack on helper transitions
To assist with unwind from a helper function, store current SP prior
to helper call in Thread. NOTE: we may wish to push this into a
trampoline to reduce code expansion. NOTE #2: Because any helper
function which can throw will be non-leaf, it will spill lr at the saved
address - 4 (the word immediately below caller's Method*). To identify
the callsite, load the spilled lr, clear the low bit, subtract 2, and use
that address in the native <-> dalvik mapping to identify the callsite.
Also in this CL are a ralloc fix and some extra SSA logging.
Change-Id: Idd442f0c55413a5146c24709b1db1150604f4554
Diffstat (limited to 'src/compiler/codegen/RallocUtil.cc')
| -rw-r--r-- | src/compiler/codegen/RallocUtil.cc | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/src/compiler/codegen/RallocUtil.cc b/src/compiler/codegen/RallocUtil.cc index 1fe680f2d8..76cff17648 100644 --- a/src/compiler/codegen/RallocUtil.cc +++ b/src/compiler/codegen/RallocUtil.cc @@ -833,7 +833,11 @@ static void copyRegInfo(CompilationUnit* cUnit, int newReg, int oldReg) { RegisterInfo* newInfo = getRegInfo(cUnit, newReg); RegisterInfo* oldInfo = getRegInfo(cUnit, oldReg); + // Target temp status must not change + bool isTemp = newInfo->isTemp; *newInfo = *oldInfo; + // Restore target's temp status + newInfo->isTemp = isTemp; newInfo->reg = newReg; } @@ -1011,7 +1015,12 @@ extern RegLocation oatGetDest(CompilationUnit* cUnit, MIR* mir, int num) { RegLocation res = cUnit->regLocation[mir->ssaRep->defs[num]]; #ifdef SSA_WORKAROUND - res.wide = false; + if (res.wide) { + LOG(WARNING) << "Invalid SSA renaming: " << PrettyMethod(cUnit->method); + cUnit->printMe = true; + cUnit->dumpCFG = true; + res.wide = false; + } #endif assert(!res.wide); return res; @@ -1020,7 +1029,12 @@ extern RegLocation oatGetSrc(CompilationUnit* cUnit, MIR* mir, int num) { RegLocation res = cUnit->regLocation[mir->ssaRep->uses[num]]; #ifdef SSA_WORKAROUND - res.wide = false; + if (res.wide) { + LOG(WARNING) << "Invalid SSA renaming: " << PrettyMethod(cUnit->method); + cUnit->printMe = true; + cUnit->dumpCFG = true; + res.wide = false; + } #endif assert(!res.wide); return res; @@ -1035,7 +1049,12 @@ extern RegLocation oatGetDestWide(CompilationUnit* cUnit, MIR* mir, { RegLocation res = cUnit->regLocation[mir->ssaRep->defs[low]]; #ifdef SSA_WORKAROUND - res.wide = true; + if (!res.wide) { + LOG(WARNING) << "Invalid SSA renaming: " << PrettyMethod(cUnit->method); + cUnit->printMe = true; + cUnit->dumpCFG = true; + res.wide = true; + } #endif assert(res.wide); return res; @@ -1046,7 +1065,12 @@ extern RegLocation oatGetSrcWide(CompilationUnit* cUnit, MIR* mir, { RegLocation res = cUnit->regLocation[mir->ssaRep->uses[low]]; #ifdef SSA_WORKAROUND - res.wide = true; + if (!res.wide) { + LOG(WARNING) << "Invalid SSA renaming: " << PrettyMethod(cUnit->method); + cUnit->printMe = true; + cUnit->dumpCFG = true; + res.wide = true; + } #endif assert(res.wide); return res; |