diff options
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 af50363e31..f1bd1b7573 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); } } |