Use dex_pc instead of line_number.
Change-Id: I3759319562428bccabccc66d7afd691682ecca55
diff --git a/src/compiler_llvm/jni_compiler.cc b/src/compiler_llvm/jni_compiler.cc
index 198cd1a..99f2d21 100644
--- a/src/compiler_llvm/jni_compiler.cc
+++ b/src/compiler_llvm/jni_compiler.cc
@@ -125,10 +125,10 @@
irb_.getJObjectTy()->getPointerTo());
irb_.CreateStore(method_object_addr, method_field_addr);
- // Store the line number
+ // Store the dex pc
irb_.StoreToObjectOffset(shadow_frame_,
- ShadowFrame::LineNumOffset(),
- irb_.getInt32(dex_file_->GetLineNumFromPC(method_, 0)));
+ ShadowFrame::DexPCOffset(),
+ irb_.getInt32(0));
// Store the number of the pointer slots
irb_.StoreToObjectOffset(shadow_frame_,
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 556dd51..e16d522 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -1267,7 +1267,7 @@
llvm::Value* exception_addr =
EmitLoadDalvikReg(dec_insn.vA, kObject, kAccurate);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall(irb_.GetRuntime(ThrowException), exception_addr);
@@ -1280,7 +1280,7 @@
DecodedInstruction dec_insn(insn);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
llvm::Value* kind_value = irb_.getInt32(dec_insn.vA);
@@ -1419,7 +1419,7 @@
llvm::Value* string_idx_value = irb_.getInt32(string_idx);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
string_addr = irb_.CreateCall2(runtime_func, method_object_addr,
string_idx_value);
@@ -1445,7 +1445,7 @@
llvm::Function* runtime_func =
irb_.GetRuntime(InitializeTypeAndVerifyAccess);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
llvm::Value* type_object_addr =
irb_.CreateCall2(runtime_func, type_idx_value, method_object_addr);
@@ -1488,7 +1488,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
llvm::Value* loaded_type_object_addr =
irb_.CreateCall2(runtime_func, type_idx_value, method_object_addr);
@@ -1535,7 +1535,7 @@
// TODO: Slow path always. May not need NullPointerException check.
EmitGuard_NullPointerException(dex_pc, object_addr);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall(irb_.GetRuntime(LockObject), object_addr);
EmitGuard_ExceptionLandingPad(dex_pc);
@@ -1554,7 +1554,7 @@
EmitGuard_NullPointerException(dex_pc, object_addr);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall(irb_.GetRuntime(UnlockObject), object_addr);
EmitGuard_ExceptionLandingPad(dex_pc);
@@ -1607,7 +1607,7 @@
// Test: Is the object instantiated from the subclass of the given class?
irb_.SetInsertPoint(block_test_sub_class);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall2(irb_.GetRuntime(CheckCast),
type_object_addr, object_type_object_addr);
@@ -1738,7 +1738,7 @@
llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
llvm::Value* object_addr =
irb_.CreateCall3(runtime_func, type_index_value, method_object_addr, thread_object_addr);
@@ -1781,7 +1781,7 @@
llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
llvm::Value* object_addr =
irb_.CreateCall4(runtime_func, type_index_value, method_object_addr,
@@ -2281,7 +2281,7 @@
irb_.SetInsertPoint(block_exception);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall2(irb_.GetRuntime(ThrowIndexOutOfBounds), index, array_len);
EmitBranchExceptionLandingPad(dex_pc);
@@ -2415,7 +2415,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
field_value = irb_.CreateCall3(runtime_func, field_idx_value,
method_object_addr, object_addr);
@@ -2479,7 +2479,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall4(runtime_func, field_idx_value,
method_object_addr, object_addr, new_value);
@@ -2541,7 +2541,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
llvm::Value* loaded_storage_object_addr =
irb_.CreateCall2(runtime_func, type_idx_value, method_object_addr);
@@ -2598,7 +2598,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
static_field_value =
irb_.CreateCall2(runtime_func, field_idx_value, method_object_addr);
@@ -2680,7 +2680,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall3(runtime_func, field_idx_value,
method_object_addr, new_value);
@@ -2908,7 +2908,7 @@
#if 0
// Invoke callee
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
llvm::Value* retval = irb_.CreateCall(code_addr, args);
EmitGuard_ExceptionLandingPad(dex_pc);
@@ -2928,7 +2928,7 @@
char ret_shorty = callee_oat_compilation_unit->GetShorty()[0];
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
llvm::BasicBlock* block_normal = CreateBasicBlockWithDexPC(dex_pc, "normal");
@@ -3080,7 +3080,7 @@
llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
llvm::Value* callee_method_object_addr =
irb_.CreateCall4(runtime_func,
@@ -3596,7 +3596,7 @@
irb_.CreateCondBr(equal_zero, block_exception, block_continue);
irb_.SetInsertPoint(block_exception);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall(irb_.GetRuntime(ThrowDivZeroException));
EmitBranchExceptionLandingPad(dex_pc);
@@ -3617,7 +3617,7 @@
irb_.CreateCondBr(equal_null, block_exception, block_continue);
irb_.SetInsertPoint(block_exception);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall(irb_.GetRuntime(ThrowNullPointerException), irb_.getInt32(dex_pc));
EmitBranchExceptionLandingPad(dex_pc);
@@ -3747,7 +3747,7 @@
void MethodCompiler::EmitGuard_GarbageCollectionSuspend(uint32_t dex_pc) {
llvm::Value* runtime_func = irb_.GetRuntime(TestSuspend);
- EmitUpdateLineNumFromDexPC(dex_pc);
+ EmitUpdateDexPC(dex_pc);
irb_.CreateCall(runtime_func);
EmitGuard_ExceptionLandingPad(dex_pc);
@@ -4013,21 +4013,10 @@
}
-void MethodCompiler::EmitUpdateLineNum(int32_t line_num) {
- llvm::Value* line_num_field_addr =
- irb_.CreatePtrDisp(shadow_frame_,
- irb_.getPtrEquivInt(ShadowFrame::LineNumOffset()),
- irb_.getJIntTy()->getPointerTo());
-
- llvm::ConstantInt* line_num_value = irb_.getInt32(line_num);
- irb_.CreateStore(line_num_value, line_num_field_addr);
-}
-
-
-void MethodCompiler::EmitUpdateLineNumFromDexPC(uint32_t dex_pc) {
- EmitUpdateLineNum(
- dex_file_->GetLineNumFromPC(oat_compilation_unit_->IsStatic(),
- method_idx_, code_item_, dex_pc));
+void MethodCompiler::EmitUpdateDexPC(uint32_t dex_pc) {
+ irb_.StoreToObjectOffset(shadow_frame_,
+ ShadowFrame::DexPCOffset(),
+ irb_.getInt32(dex_pc));
}
diff --git a/src/compiler_llvm/method_compiler.h b/src/compiler_llvm/method_compiler.h
index 7a5d66f..7dded33 100644
--- a/src/compiler_llvm/method_compiler.h
+++ b/src/compiler_llvm/method_compiler.h
@@ -265,8 +265,7 @@
// Shadow frame helper function
void EmitPopShadowFrame();
- void EmitUpdateLineNum(int32_t line_number);
- void EmitUpdateLineNumFromDexPC(uint32_t dex_pc);
+ void EmitUpdateDexPC(uint32_t dex_pc);
// Dex cache code generation helper function
diff --git a/src/dex_file.cc b/src/dex_file.cc
index a054849..85dafee 100644
--- a/src/dex_file.cc
+++ b/src/dex_file.cc
@@ -586,18 +586,12 @@
return -2;
}
- return GetLineNumFromPC(method->IsStatic(), method->GetDexMethodIndex(),
- GetCodeItem(method->GetCodeItemOffset()), rel_pc);
-}
-
-int32_t DexFile::GetLineNumFromPC(bool is_static, uint32_t method_idx,
- const CodeItem* code_item,
- uint32_t rel_pc) const {
+ const CodeItem* code_item = GetCodeItem(method->GetCodeItemOffset());
DCHECK(code_item != NULL) << GetLocation();
// A method with no line number info should return -1
LineNumFromPcContext context(rel_pc, -1);
- DecodeDebugInfo(code_item, is_static, method_idx, LineNumForPcCb,
+ DecodeDebugInfo(code_item, method->IsStatic(), method->GetDexMethodIndex(), LineNumForPcCb,
NULL, &context);
return context.line_num_;
}
diff --git a/src/dex_file.h b/src/dex_file.h
index 2f315a9..9c16440 100644
--- a/src/dex_file.h
+++ b/src/dex_file.h
@@ -755,9 +755,6 @@
// This is used by runtime; therefore use art::Method not art::DexFile::Method.
int32_t GetLineNumFromPC(const Method* method, uint32_t rel_pc) const;
- int32_t GetLineNumFromPC(bool is_static, uint32_t method_idx,
- const CodeItem* code_item, uint32_t rel_pc) const;
-
void DecodeDebugInfo(const CodeItem* code_item, bool is_static, uint32_t method_idx,
DexDebugNewPositionCb position_cb, DexDebugNewLocalCb local_cb,
void* context) const;
diff --git a/src/exception_test.cc b/src/exception_test.cc
index 4d4ffd4..23a437a 100644
--- a/src/exception_test.cc
+++ b/src/exception_test.cc
@@ -146,15 +146,14 @@
fake_stack.push_back(0);
fake_stack.push_back(0);
fake_stack.push_back(reinterpret_cast<uintptr_t>(method_g_));
- // LLVM compiler will do this in the MethodCompiler
- fake_stack.push_back(dex_->GetLineNumFromPC(method_g_, 3));
+ fake_stack.push_back(3);
fake_stack.push_back(0);
// Create/push fake 20-byte shadow frame for method f
fake_stack.push_back(0);
fake_stack.push_back(0);
fake_stack.push_back(reinterpret_cast<uintptr_t>(method_f_));
- fake_stack.push_back(dex_->GetLineNumFromPC(method_f_, 3));
+ fake_stack.push_back(3);
fake_stack.push_back(0);
Thread* thread = Thread::Current();
diff --git a/src/object.cc b/src/object.cc
index 8c101ba..5413194 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -468,6 +468,7 @@
}
uint32_t Method::ToDexPC(const uintptr_t pc) const {
+#if !defined(ART_USE_LLVM_COMPILER)
const uint32_t* mapping_table = GetMappingTable();
if (mapping_table == NULL) {
DCHECK(IsNative() || IsCalleeSaveMethod() || IsProxyMethod()) << PrettyMethod(this);
@@ -491,6 +492,10 @@
}
}
return best_dex_offset;
+#else
+ // Compiler LLVM doesn't use the machine pc, we just use dex pc instead.
+ return static_cast<uint32_t>(pc);
+#endif
}
uintptr_t Method::ToNativePC(const uint32_t dex_pc) const {
diff --git a/src/shadow_frame.h b/src/shadow_frame.h
index 261875e..b1ec81f 100644
--- a/src/shadow_frame.h
+++ b/src/shadow_frame.h
@@ -32,9 +32,9 @@
return number_of_references_;
}
- // Caller line number
- uint32_t GetLineNumber() const {
- return line_num_;
+ // Caller dex pc
+ uint32_t GetDexPC() const {
+ return dex_pc_;
}
// Link to previous shadow frame or NULL
@@ -82,9 +82,9 @@
return OFFSETOF_MEMBER(ShadowFrame, method_);
}
- // Offset of line number within shadow frame
- static size_t LineNumOffset() {
- return OFFSETOF_MEMBER(ShadowFrame, line_num_);
+ // Offset of dex pc within shadow frame
+ static size_t DexPCOffset() {
+ return OFFSETOF_MEMBER(ShadowFrame, dex_pc_);
}
// Offset of length within shadow frame
@@ -105,7 +105,7 @@
uint32_t number_of_references_;
ShadowFrame* link_;
Method* method_;
- uint32_t line_num_;
+ uint32_t dex_pc_;
Object* references_[];
DISALLOW_IMPLICIT_CONSTRUCTORS(ShadowFrame);
diff --git a/src/thread.cc b/src/thread.cc
index e839d36..d7a9b98 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -574,7 +574,6 @@
}
const int kMaxRepetition = 3;
Method* m = frame.GetMethod();
-#if !defined(ART_USE_LLVM_COMPILER)
Class* c = m->GetDeclaringClass();
ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
const DexCache* dex_cache = c->GetDexCache();
@@ -583,10 +582,6 @@
const DexFile& dex_file = class_linker->FindDexFile(dex_cache);
line_number = dex_file.GetLineNumFromPC(m, m->ToDexPC(pc));
}
-#else
- // Compiler_LLVM stores line_number in the ShadowFrame, and passes it to visitor.
- int line_number = static_cast<int>(pc);
-#endif
if (line_number == last_line_number && last_method == m) {
repetition_count++;
} else {
@@ -1321,7 +1316,7 @@
Frame frame;
frame.SetSP(reinterpret_cast<Method**>(reinterpret_cast<byte*>(cur) +
ShadowFrame::MethodOffset()));
- bool should_continue = visitor->VisitFrame(frame, cur->GetLineNumber());
+ bool should_continue = visitor->VisitFrame(frame, cur->GetDexPC());
if (!should_continue) {
return;
}
@@ -1427,11 +1422,7 @@
Method* method = down_cast<Method*>(method_trace->Get(i));
mh.ChangeMethod(method);
uint32_t native_pc = pc_trace->Get(i);
-#if !defined(ART_USE_LLVM_COMPILER)
int32_t line_number = mh.GetLineNumFromNativePC(native_pc);
-#else
- int32_t line_number = native_pc; // LLVM stored line_number in the ShadowFrame
-#endif
// Allocate element, potentially triggering GC
// TODO: reuse class_name_object via Class::name_?
const char* descriptor = mh.GetDeclaringClassDescriptor();