diff options
| author | 2016-03-18 12:37:03 +0000 | |
|---|---|---|
| committer | 2016-03-18 12:37:03 +0000 | |
| commit | e943c3b831dc0da4a6b09e940ae25c3285850e96 (patch) | |
| tree | b4756bbc16f49d50087a881b40722657451e6eac /compiler/optimizing/code_generator.cc | |
| parent | 7c06aef061fa176331b77a88c1ff2c6ae401a5f0 (diff) | |
| parent | d28f4a00933a4a3b8d5e9db73b8532924d0f989d (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.cc | 14 |
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); } } |