Using gcmap instead of shadow frame.
Fix misuse of TBAAJRuntime & TBAARuntimeInfo. Now, the TBAAJRuntime is
only for runtime support function.
Update DexPC before lock object and suspend.
Change-Id: I40fa37f4863fe6e127328a8413285ee3c62e8505
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc
index 8c217c7..5aa4c2d 100644
--- a/src/interpreter/interpreter.cc
+++ b/src/interpreter/interpreter.cc
@@ -377,7 +377,7 @@
if (type == kStatic) {
receiver = NULL;
} else {
- receiver = shadow_frame.GetReference(dec_insn.vC);
+ receiver = shadow_frame.GetVRegReference(dec_insn.vC);
if (UNLIKELY(receiver == NULL)) {
ThrowNullPointerExceptionForMethodAccess(shadow_frame.GetMethod(), dec_insn.vB, type);
result->SetJ(0);
@@ -426,7 +426,7 @@
if (is_static) {
obj = f->GetDeclaringClass();
} else {
- obj = shadow_frame.GetReference(dec_insn.vB);
+ obj = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(obj == NULL)) {
ThrowNullPointerExceptionForFieldAccess(f, true);
return;
@@ -452,7 +452,7 @@
shadow_frame.SetVRegLong(dec_insn.vA, f->GetLong(obj));
break;
case Primitive::kPrimNot:
- shadow_frame.SetReferenceAndVReg(dec_insn.vA, f->GetObject(obj));
+ shadow_frame.SetVRegReference(dec_insn.vA, f->GetObject(obj));
break;
default:
LOG(FATAL) << "Unreachable: " << field_type;
@@ -473,7 +473,7 @@
if (is_static) {
obj = f->GetDeclaringClass();
} else {
- obj = shadow_frame.GetReference(dec_insn.vB);
+ obj = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(obj == NULL)) {
ThrowNullPointerExceptionForFieldAccess(f, false);
return;
@@ -499,7 +499,7 @@
f->SetLong(obj, shadow_frame.GetVRegLong(dec_insn.vA));
break;
case Primitive::kPrimNot:
- f->SetObj(obj, shadow_frame.GetReference(dec_insn.vA));
+ f->SetObj(obj, shadow_frame.GetVRegReference(dec_insn.vA));
break;
default:
LOG(FATAL) << "Unreachable: " << field_type;
@@ -567,8 +567,8 @@
LOG(INFO) << PrettyMethod(shadow_frame.GetMethod())
<< StringPrintf("\n0x%x: %s\nReferences:",
inst->GetDexPc(insns), inst->DumpString(&mh.GetDexFile()).c_str());
- for (size_t i = 0; i < shadow_frame.NumberOfReferences(); ++i) {
- Object* o = shadow_frame.GetReference(i);
+ for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) {
+ Object* o = shadow_frame.GetVRegReference(i);
if (o != NULL) {
if (o->GetClass()->IsStringClass() && o->AsString()->GetCharArray() != NULL) {
LOG(INFO) << i << ": java.lang.String " << static_cast<void*>(o)
@@ -581,7 +581,7 @@
}
}
LOG(INFO) << "vregs:";
- for (size_t i = 0; i < shadow_frame.NumberOfReferences(); ++i) {
+ for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) {
LOG(INFO) << StringPrintf("%d: %08x", i, shadow_frame.GetVReg(i));
}
}
@@ -602,8 +602,7 @@
case Instruction::MOVE_OBJECT:
case Instruction::MOVE_OBJECT_FROM16:
case Instruction::MOVE_OBJECT_16:
- shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
- shadow_frame.SetReference(dec_insn.vA, shadow_frame.GetReference(dec_insn.vB));
+ shadow_frame.SetVRegReference(dec_insn.vA, shadow_frame.GetVRegReference(dec_insn.vB));
break;
case Instruction::MOVE_RESULT:
shadow_frame.SetVReg(dec_insn.vA, result_register.GetI());
@@ -612,12 +611,12 @@
shadow_frame.SetVRegLong(dec_insn.vA, result_register.GetJ());
break;
case Instruction::MOVE_RESULT_OBJECT:
- shadow_frame.SetReferenceAndVReg(dec_insn.vA, result_register.GetL());
+ shadow_frame.SetVRegReference(dec_insn.vA, result_register.GetL());
break;
case Instruction::MOVE_EXCEPTION: {
Throwable* exception = self->GetException();
self->ClearException();
- shadow_frame.SetReferenceAndVReg(dec_insn.vA, exception);
+ shadow_frame.SetVRegReference(dec_insn.vA, exception);
break;
}
case Instruction::RETURN_VOID: {
@@ -639,14 +638,14 @@
case Instruction::RETURN_OBJECT: {
JValue result;
result.SetJ(0);
- result.SetL(shadow_frame.GetReference(dec_insn.vA));
+ result.SetL(shadow_frame.GetVRegReference(dec_insn.vA));
return result;
}
case Instruction::CONST_4: {
int32_t val = static_cast<int32_t>(dec_insn.vB << 28) >> 28;
shadow_frame.SetVReg(dec_insn.vA, val);
if (val == 0) {
- shadow_frame.SetReference(dec_insn.vA, NULL);
+ shadow_frame.SetVRegReference(dec_insn.vA, NULL);
}
break;
}
@@ -654,7 +653,7 @@
int32_t val = static_cast<int16_t>(dec_insn.vB);
shadow_frame.SetVReg(dec_insn.vA, val);
if (val == 0) {
- shadow_frame.SetReference(dec_insn.vA, NULL);
+ shadow_frame.SetVRegReference(dec_insn.vA, NULL);
}
break;
}
@@ -662,7 +661,7 @@
int32_t val = dec_insn.vB;
shadow_frame.SetVReg(dec_insn.vA, val);
if (val == 0) {
- shadow_frame.SetReference(dec_insn.vA, NULL);
+ shadow_frame.SetVRegReference(dec_insn.vA, NULL);
}
break;
}
@@ -670,7 +669,7 @@
int32_t val = dec_insn.vB << 16;
shadow_frame.SetVReg(dec_insn.vA, val);
if (val == 0) {
- shadow_frame.SetReference(dec_insn.vA, NULL);
+ shadow_frame.SetVRegReference(dec_insn.vA, NULL);
}
break;
}
@@ -693,16 +692,16 @@
true, true);
}
String* s = mh.ResolveString(dec_insn.vB);
- shadow_frame.SetReferenceAndVReg(dec_insn.vA, s);
+ shadow_frame.SetVRegReference(dec_insn.vA, s);
break;
}
case Instruction::CONST_CLASS: {
Class* c = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true);
- shadow_frame.SetReferenceAndVReg(dec_insn.vA, c);
+ shadow_frame.SetVRegReference(dec_insn.vA, c);
break;
}
case Instruction::MONITOR_ENTER: {
- Object* obj = shadow_frame.GetReference(dec_insn.vA);
+ Object* obj = shadow_frame.GetVRegReference(dec_insn.vA);
if (UNLIKELY(obj == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
} else {
@@ -711,7 +710,7 @@
break;
}
case Instruction::MONITOR_EXIT: {
- Object* obj = shadow_frame.GetReference(dec_insn.vA);
+ Object* obj = shadow_frame.GetVRegReference(dec_insn.vA);
if (UNLIKELY(obj == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
} else {
@@ -724,7 +723,7 @@
if (UNLIKELY(c == NULL)) {
CHECK(self->IsExceptionPending());
} else {
- Object* obj = shadow_frame.GetReference(dec_insn.vA);
+ Object* obj = shadow_frame.GetVRegReference(dec_insn.vA);
if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) {
self->ThrowNewExceptionF("Ljava/lang/ClassCastException;",
"%s cannot be cast to %s",
@@ -739,13 +738,13 @@
if (UNLIKELY(c == NULL)) {
CHECK(self->IsExceptionPending());
} else {
- Object* obj = shadow_frame.GetReference(dec_insn.vB);
+ Object* obj = shadow_frame.GetVRegReference(dec_insn.vB);
shadow_frame.SetVReg(dec_insn.vA, (obj != NULL && obj->InstanceOf(c)) ? 1 : 0);
}
break;
}
case Instruction::ARRAY_LENGTH: {
- Object* array = shadow_frame.GetReference(dec_insn.vB);
+ Object* array = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(array == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -755,13 +754,13 @@
}
case Instruction::NEW_INSTANCE: {
Object* obj = AllocObjectFromCode(dec_insn.vB, shadow_frame.GetMethod(), self, true);
- shadow_frame.SetReferenceAndVReg(dec_insn.vA, obj);
+ shadow_frame.SetVRegReference(dec_insn.vA, obj);
break;
}
case Instruction::NEW_ARRAY: {
int32_t length = shadow_frame.GetVReg(dec_insn.vB);
Object* obj = AllocArrayFromCode(dec_insn.vC, shadow_frame.GetMethod(), length, self, true);
- shadow_frame.SetReferenceAndVReg(dec_insn.vA, obj);
+ shadow_frame.SetVRegReference(dec_insn.vA, obj);
break;
}
case Instruction::FILLED_NEW_ARRAY:
@@ -861,7 +860,7 @@
break;
}
case Instruction::THROW: {
- Throwable* t = shadow_frame.GetReference(dec_insn.vA)->AsThrowable();
+ Throwable* t = shadow_frame.GetVRegReference(dec_insn.vA)->AsThrowable();
self->DeliverException(t);
break;
}
@@ -918,7 +917,7 @@
break;
}
case Instruction::FILL_ARRAY_DATA: {
- Object* obj = shadow_frame.GetReference(dec_insn.vA);
+ Object* obj = shadow_frame.GetVRegReference(dec_insn.vA);
if (UNLIKELY(obj == NULL)) {
Thread::Current()->ThrowNewExceptionF("Ljava/lang/NullPointerException;",
"null array in FILL_ARRAY_DATA");
@@ -1024,7 +1023,7 @@
break;
}
case Instruction::AGET_BOOLEAN: {
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1034,7 +1033,7 @@
break;
}
case Instruction::AGET_BYTE: {
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1044,7 +1043,7 @@
break;
}
case Instruction::AGET_CHAR: {
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1054,7 +1053,7 @@
break;
}
case Instruction::AGET_SHORT: {
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1064,7 +1063,7 @@
break;
}
case Instruction::AGET: {
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1074,7 +1073,7 @@
break;
}
case Instruction::AGET_WIDE: {
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1084,18 +1083,18 @@
break;
}
case Instruction::AGET_OBJECT: {
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
}
int32_t index = shadow_frame.GetVReg(dec_insn.vC);
- shadow_frame.SetReferenceAndVReg(dec_insn.vA, a->AsObjectArray<Object>()->Get(index));
+ shadow_frame.SetVRegReference(dec_insn.vA, a->AsObjectArray<Object>()->Get(index));
break;
}
case Instruction::APUT_BOOLEAN: {
uint8_t val = shadow_frame.GetVReg(dec_insn.vA);
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1106,7 +1105,7 @@
}
case Instruction::APUT_BYTE: {
int8_t val = shadow_frame.GetVReg(dec_insn.vA);
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1117,7 +1116,7 @@
}
case Instruction::APUT_CHAR: {
uint16_t val = shadow_frame.GetVReg(dec_insn.vA);
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1128,7 +1127,7 @@
}
case Instruction::APUT_SHORT: {
int16_t val = shadow_frame.GetVReg(dec_insn.vA);
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1139,7 +1138,7 @@
}
case Instruction::APUT: {
int32_t val = shadow_frame.GetVReg(dec_insn.vA);
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1150,7 +1149,7 @@
}
case Instruction::APUT_WIDE: {
int64_t val = shadow_frame.GetVRegLong(dec_insn.vA);
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1160,8 +1159,8 @@
break;
}
case Instruction::APUT_OBJECT: {
- Object* val = shadow_frame.GetReference(dec_insn.vA);
- Object* a = shadow_frame.GetReference(dec_insn.vB);
+ Object* val = shadow_frame.GetVRegReference(dec_insn.vA);
+ Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
if (UNLIKELY(a == NULL)) {
ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
break;
@@ -1777,14 +1776,14 @@
}
// Set up shadow frame with matching number of reference slots to vregs.
ShadowFrame* last_shadow_frame = self->GetManagedStack()->GetTopShadowFrame();
- UniquePtr<ShadowFrame> shadow_frame(ShadowFrame::Create(num_regs, num_regs,
+ UniquePtr<ShadowFrame> shadow_frame(ShadowFrame::Create(num_regs,
(last_shadow_frame == NULL) ? NULL : last_shadow_frame->GetLink(),
method, 0));
self->PushShadowFrame(shadow_frame.get());
size_t cur_reg = num_regs - num_ins;
if (!method->IsStatic()) {
CHECK(receiver != NULL);
- shadow_frame->SetReferenceAndVReg(cur_reg, receiver);
+ shadow_frame->SetVRegReference(cur_reg, receiver);
++cur_reg;
} else if (!method->GetDeclaringClass()->IsInitializing()) {
if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(method->GetDeclaringClass(),
@@ -1801,7 +1800,7 @@
switch (shorty[arg_pos + 1]) {
case 'L': {
Object* o = args[arg_pos].GetL();
- shadow_frame->SetReferenceAndVReg(cur_reg, o);
+ shadow_frame->SetVRegReference(cur_reg, o);
break;
}
case 'J': case 'D':