You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/04/19 05:52:31 UTC
svn commit: r530253 -
/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCSafePoints.cpp
Author: varlax
Date: Wed Apr 18 20:52:30 2007
New Revision: 530253
URL: http://svn.apache.org/viewvc?view=rev&rev=530253
Log:
Applied HARMONY-3642 [drlvm][jit][opt] assertion failure in Ia32GCSafePoints.cpp in debug builds
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCSafePoints.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCSafePoints.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCSafePoints.cpp?view=diff&rev=530253&r1=530252&r2=530253
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCSafePoints.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCSafePoints.cpp Wed Apr 18 20:52:30 2007
@@ -456,10 +456,16 @@
pair->base = opnd;
}
} else { //def of mptr
+ // detect which operand is base
Opnd* fromOpnd = inst->getOpnd(useIndex1);
- int32 offset = MPTR_OFFSET_UNKNOWN;
- assert(fromOpnd->getType()->isObject() || fromOpnd->getType()->isManagedPtr());
uint32 useIndex2 = opnds.next(useIndex1);
+ Opnd* fromOpnd2 = useIndex2!=opnds.end() ? inst->getOpnd(useIndex2) : NULL;
+ if (!(fromOpnd->getType()->isObject() || fromOpnd->getType()->isManagedPtr())) {
+ assert(fromOpnd2!=NULL);
+ Opnd* tmp = fromOpnd; fromOpnd = fromOpnd2; fromOpnd2 = tmp;
+ }
+ assert(fromOpnd->getType()->isObject() || fromOpnd->getType()->isManagedPtr());
+ int32 offset = MPTR_OFFSET_UNKNOWN;
if (inst->getMnemonic() == Mnemonic_LEA) {
assert(fromOpnd->isPlacedIn(OpndKind_Memory));
Opnd* scaleOpnd = fromOpnd->getMemOpndSubOpnd(MemOpndSubOpndKind_Scale);
@@ -469,8 +475,8 @@
offset = (int32)displOpnd->getImmValue();
}
fromOpnd = fromOpnd->getMemOpndSubOpnd(MemOpndSubOpndKind_Base);
- } else if (useIndex2 < opnds.end()) {
- Opnd* offsetOpnd = inst->getOpnd(useIndex2);
+ } else if (fromOpnd2!=NULL) {
+ Opnd* offsetOpnd = fromOpnd2;
offset = getOffsetFromImmediate(offsetOpnd);
}
updateMptrInfoInPairs(res, opnd, fromOpnd, offset, fromOpnd->getType()->isObject());