Simple debugging support for portable path.
Change-Id: Ibdc33b8d7f644c091fdb3ba3ce2ba45804bc4078
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index fea0c72..f09553c 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -175,7 +175,7 @@
#if !defined(NDEBUG)
name = StringPrintf("%u", r);
#endif
- regs_[r] = new DalvikReg(*this, name);
+ regs_[r] = new DalvikReg(*this, name, GetVRegEntry(r));
// Cache shadow frame entry address
shadow_frame_entries_[r] = GetShadowFrameEntry(r);
@@ -185,7 +185,7 @@
#if !defined(NDEBUG)
name = "_res";
#endif
- retval_reg_.reset(new DalvikReg(*this, name));
+ retval_reg_.reset(new DalvikReg(*this, name, NULL));
// Store argument to dalvik register
irb_.SetInsertPoint(basic_block_reg_arg_init_);
@@ -284,7 +284,8 @@
}
}
- llvm::StructType* shadow_frame_type = irb_.getShadowFrameTy(num_shadow_frame_refs_);
+ llvm::StructType* shadow_frame_type = irb_.getShadowFrameTy(num_shadow_frame_refs_,
+ code_item_->registers_size_);
shadow_frame_ = irb_.CreateAlloca(shadow_frame_type);
// Alloca a pointer to old shadow frame
@@ -3802,6 +3803,43 @@
}
+// TODO: We will remove ShadowFrameEntry later, so I just copy/paste from ShadowFrameEntry.
+llvm::Value* MethodCompiler::GetVRegEntry(uint32_t reg_idx) {
+ if (!compiler_->IsDebuggingSupported()) {
+ return NULL;
+ }
+
+ if (!method_info_.need_shadow_frame_entry) {
+ return NULL;
+ }
+
+ std::string reg_name;
+
+#if !defined(NDEBUG)
+ StringAppendF(®_name, "v%u", reg_idx);
+#endif
+
+ // Save current IR builder insert point
+ llvm::IRBuilderBase::InsertPoint irb_ip_original = irb_.saveIP();
+
+ irb_.SetInsertPoint(basic_block_shadow_frame_);
+
+ llvm::Value* gep_index[] = {
+ irb_.getInt32(0), // No pointer displacement
+ irb_.getInt32(2), // VRegs
+ irb_.getInt32(reg_idx) // Pointer field
+ };
+
+ llvm::Value* reg_addr = irb_.CreateGEP(shadow_frame_, gep_index, reg_name);
+
+ // Restore IRBuilder insert point
+ irb_.restoreIP(irb_ip_original);
+
+ DCHECK_NE(reg_addr, static_cast<llvm::Value*>(NULL));
+ return reg_addr;
+}
+
+
void MethodCompiler::EmitPushShadowFrame(bool is_inline) {
if (!method_info_.need_shadow_frame) {
return;
@@ -3819,11 +3857,13 @@
llvm::Value* result;
if (is_inline) {
result = irb_.Runtime().EmitPushShadowFrame(shadow_frame_upcast, method_object_addr,
- num_shadow_frame_refs_, 0);
+ num_shadow_frame_refs_,
+ code_item_->registers_size_);
} else {
DCHECK(num_shadow_frame_refs_ == 0);
result = irb_.Runtime().EmitPushShadowFrameNoInline(shadow_frame_upcast, method_object_addr,
- num_shadow_frame_refs_, 0);
+ num_shadow_frame_refs_,
+ code_item_->registers_size_);
}
irb_.CreateStore(result, old_shadow_frame_, kTBAARegister);
}