From d28f4a00933a4a3b8d5e9db73b8532924d0f989d Mon Sep 17 00:00:00 2001 From: David Srbecky Date: Mon, 14 Mar 2016 17:14:24 +0000 Subject: [PATCH] Generate native debug stackmaps before calls as well. The debugger looks up PC of the call instruction, so the runtime's stackmap is not sufficient since it is at PC after the instruction. Change-Id: I0dd06c0b52e8079ea5d064ea10beb12c93584092 --- compiler/optimizing/code_generator.cc | 14 +++++++++++--- compiler/optimizing/code_generator.h | 8 +++++++- compiler/optimizing/code_generator_arm.cc | 4 ++-- compiler/optimizing/code_generator_arm64.cc | 4 ++-- compiler/optimizing/code_generator_mips.cc | 4 ++-- compiler/optimizing/code_generator_mips64.cc | 4 ++-- compiler/optimizing/code_generator_x86.cc | 4 ++-- compiler/optimizing/code_generator_x86_64.cc | 4 ++-- 8 files changed, 30 insertions(+), 16 deletions(-) diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc index af50363e3..f1bd1b757 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); } } diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h index 9297fc956..3cb0d534f 100644 --- a/compiler/optimizing/code_generator.h +++ b/compiler/optimizing/code_generator.h @@ -106,6 +106,10 @@ class SlowPathCode : public ArenaObject { Label* GetEntryLabel() { return &entry_label_; } Label* GetExitLabel() { return &exit_label_; } + HInstruction* GetInstruction() const { + return instruction_; + } + uint32_t GetDexPc() const { return instruction_ != nullptr ? instruction_->GetDexPc() : kNoDexPc; } @@ -274,7 +278,9 @@ class CodeGenerator { // Check whether we have already recorded mapping at this PC. bool HasStackMapAtCurrentPc(); // Record extra stack maps if we support native debugging. - void MaybeRecordNativeDebugInfo(HInstruction* instruction, uint32_t dex_pc); + void MaybeRecordNativeDebugInfo(HInstruction* instruction, + uint32_t dex_pc, + SlowPathCode* slow_path = nullptr); bool CanMoveNullCheckToUser(HNullCheck* null_check); void MaybeRecordImplicitNullCheck(HInstruction* instruction); diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 0b7fefafd..16436579d 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -1543,8 +1543,8 @@ void LocationsBuilderARM::VisitNativeDebugInfo(HNativeDebugInfo* info) { new (GetGraph()->GetArena()) LocationSummary(info); } -void InstructionCodeGeneratorARM::VisitNativeDebugInfo(HNativeDebugInfo* info) { - codegen_->MaybeRecordNativeDebugInfo(info, info->GetDexPc()); +void InstructionCodeGeneratorARM::VisitNativeDebugInfo(HNativeDebugInfo*) { + // MaybeRecordNativeDebugInfo is already called implicitly in CodeGenerator::Compile. } void CodeGeneratorARM::GenerateNop() { diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index 89b9e2c59..b5b104eff 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -3084,8 +3084,8 @@ void LocationsBuilderARM64::VisitNativeDebugInfo(HNativeDebugInfo* info) { new (GetGraph()->GetArena()) LocationSummary(info); } -void InstructionCodeGeneratorARM64::VisitNativeDebugInfo(HNativeDebugInfo* info) { - codegen_->MaybeRecordNativeDebugInfo(info, info->GetDexPc()); +void InstructionCodeGeneratorARM64::VisitNativeDebugInfo(HNativeDebugInfo*) { + // MaybeRecordNativeDebugInfo is already called implicitly in CodeGenerator::Compile. } void CodeGeneratorARM64::GenerateNop() { diff --git a/compiler/optimizing/code_generator_mips.cc b/compiler/optimizing/code_generator_mips.cc index f3c12efd8..85dd061d7 100644 --- a/compiler/optimizing/code_generator_mips.cc +++ b/compiler/optimizing/code_generator_mips.cc @@ -3393,8 +3393,8 @@ void LocationsBuilderMIPS::VisitNativeDebugInfo(HNativeDebugInfo* info) { new (GetGraph()->GetArena()) LocationSummary(info); } -void InstructionCodeGeneratorMIPS::VisitNativeDebugInfo(HNativeDebugInfo* info) { - codegen_->MaybeRecordNativeDebugInfo(info, info->GetDexPc()); +void InstructionCodeGeneratorMIPS::VisitNativeDebugInfo(HNativeDebugInfo*) { + // MaybeRecordNativeDebugInfo is already called implicitly in CodeGenerator::Compile. } void CodeGeneratorMIPS::GenerateNop() { diff --git a/compiler/optimizing/code_generator_mips64.cc b/compiler/optimizing/code_generator_mips64.cc index c2b84b433..e2116effe 100644 --- a/compiler/optimizing/code_generator_mips64.cc +++ b/compiler/optimizing/code_generator_mips64.cc @@ -2718,8 +2718,8 @@ void LocationsBuilderMIPS64::VisitNativeDebugInfo(HNativeDebugInfo* info) { new (GetGraph()->GetArena()) LocationSummary(info); } -void InstructionCodeGeneratorMIPS64::VisitNativeDebugInfo(HNativeDebugInfo* info) { - codegen_->MaybeRecordNativeDebugInfo(info, info->GetDexPc()); +void InstructionCodeGeneratorMIPS64::VisitNativeDebugInfo(HNativeDebugInfo*) { + // MaybeRecordNativeDebugInfo is already called implicitly in CodeGenerator::Compile. } void CodeGeneratorMIPS64::GenerateNop() { diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index 6b4a18c68..92d2b1236 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -1636,8 +1636,8 @@ void LocationsBuilderX86::VisitNativeDebugInfo(HNativeDebugInfo* info) { new (GetGraph()->GetArena()) LocationSummary(info); } -void InstructionCodeGeneratorX86::VisitNativeDebugInfo(HNativeDebugInfo* info) { - codegen_->MaybeRecordNativeDebugInfo(info, info->GetDexPc()); +void InstructionCodeGeneratorX86::VisitNativeDebugInfo(HNativeDebugInfo*) { + // MaybeRecordNativeDebugInfo is already called implicitly in CodeGenerator::Compile. } void CodeGeneratorX86::GenerateNop() { diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index c13266301..fd9cf4d25 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -1617,8 +1617,8 @@ void LocationsBuilderX86_64::VisitNativeDebugInfo(HNativeDebugInfo* info) { new (GetGraph()->GetArena()) LocationSummary(info); } -void InstructionCodeGeneratorX86_64::VisitNativeDebugInfo(HNativeDebugInfo* info) { - codegen_->MaybeRecordNativeDebugInfo(info, info->GetDexPc()); +void InstructionCodeGeneratorX86_64::VisitNativeDebugInfo(HNativeDebugInfo*) { + // MaybeRecordNativeDebugInfo is already called implicitly in CodeGenerator::Compile. } void CodeGeneratorX86_64::GenerateNop() { -- 2.11.0