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();