summaryrefslogtreecommitdiff
path: root/compiler/optimizing/code_generator.cc
diff options
context:
space:
mode:
author David Srbecky <dsrbecky@google.com> 2016-03-18 12:37:03 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2016-03-18 12:37:03 +0000
commite943c3b831dc0da4a6b09e940ae25c3285850e96 (patch)
treeb4756bbc16f49d50087a881b40722657451e6eac /compiler/optimizing/code_generator.cc
parent7c06aef061fa176331b77a88c1ff2c6ae401a5f0 (diff)
parentd28f4a00933a4a3b8d5e9db73b8532924d0f989d (diff)
Merge "Generate native debug stackmaps before calls as well."
Diffstat (limited to 'compiler/optimizing/code_generator.cc')
-rw-r--r--compiler/optimizing/code_generator.cc14
1 files changed, 11 insertions, 3 deletions
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc
index f19872722c..d64a786a9e 100644
--- a/compiler/optimizing/code_generator.cc
+++ b/compiler/optimizing/code_generator.cc
@@ -196,7 +196,7 @@ void CodeGenerator::GenerateSlowPaths() {
code_start = GetAssembler()->CodeSize();
}
// Record the dex pc at start of slow path (required for java line number mapping).
- MaybeRecordNativeDebugInfo(nullptr /* instruction */, slow_path->GetDexPc());
+ MaybeRecordNativeDebugInfo(slow_path->GetInstruction(), slow_path->GetDexPc(), slow_path);
slow_path->EmitNativeCode(this);
if (disasm_info_ != nullptr) {
disasm_info_->AddSlowPathInterval(slow_path, code_start, GetAssembler()->CodeSize());
@@ -234,6 +234,12 @@ void CodeGenerator::Compile(CodeAllocator* allocator) {
MaybeRecordNativeDebugInfo(nullptr /* instruction */, block->GetDexPc());
for (HInstructionIterator it(block->GetInstructions()); !it.Done(); it.Advance()) {
HInstruction* current = it.Current();
+ if (current->HasEnvironment()) {
+ // Create stackmap for HNativeDebugInfo or any instruction which calls native code.
+ // Note that we need correct mapping for the native PC of the call instruction,
+ // so the runtime's stackmap is not sufficient since it is at PC after the call.
+ MaybeRecordNativeDebugInfo(current, block->GetDexPc());
+ }
DisassemblyScope disassembly_scope(current, *this);
DCHECK(CheckTypeConsistency(current));
current->Accept(instruction_visitor);
@@ -823,13 +829,15 @@ bool CodeGenerator::HasStackMapAtCurrentPc() {
return count > 0 && stack_map_stream_.GetStackMap(count - 1).native_pc_offset == pc;
}
-void CodeGenerator::MaybeRecordNativeDebugInfo(HInstruction* instruction, uint32_t dex_pc) {
+void CodeGenerator::MaybeRecordNativeDebugInfo(HInstruction* instruction,
+ uint32_t dex_pc,
+ SlowPathCode* slow_path) {
if (GetCompilerOptions().GetNativeDebuggable() && dex_pc != kNoDexPc) {
if (HasStackMapAtCurrentPc()) {
// Ensure that we do not collide with the stack map of the previous instruction.
GenerateNop();
}
- RecordPcInfo(instruction, dex_pc);
+ RecordPcInfo(instruction, dex_pc, slow_path);
}
}