From c684f337eae6bd3d77fa44cb568d2bab113e4cee Mon Sep 17 00:00:00 2001 From: David Srbecky Date: Fri, 19 Jan 2018 17:38:06 +0000 Subject: Refactor jit debugger interface and its ELF creation. Make it possible to store more then one method per entry, and ref-count the number of live methods per entry. Test: m test-art-host-gtest Change-Id: I45d69185e85e47fbee88a8d1f549ede9875a3c0a --- compiler/debug/elf_debug_writer.cc | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'compiler/debug/elf_debug_writer.cc') diff --git a/compiler/debug/elf_debug_writer.cc b/compiler/debug/elf_debug_writer.cc index bb2a214ecd..df5bb37358 100644 --- a/compiler/debug/elf_debug_writer.cc +++ b/compiler/debug/elf_debug_writer.cc @@ -137,10 +137,17 @@ static std::vector MakeElfFileForJITInternal( InstructionSet isa, const InstructionSetFeatures* features, bool mini_debug_info, - const MethodDebugInfo& mi) { - CHECK_EQ(mi.is_code_address_text_relative, false); + ArrayRef method_infos) { + CHECK_GT(method_infos.size(), 0u); + uint64_t min_address = std::numeric_limits::max(); + uint64_t max_address = 0; + for (const MethodDebugInfo& mi : method_infos) { + CHECK_EQ(mi.is_code_address_text_relative, false); + min_address = std::min(min_address, mi.code_address); + max_address = std::max(max_address, mi.code_address + mi.code_size); + } DebugInfo debug_info{}; - debug_info.compiled_methods = ArrayRef(&mi, 1); + debug_info.compiled_methods = method_infos; std::vector buffer; buffer.reserve(KB); linker::VectorOutputStream out("Debug ELF file", &buffer); @@ -151,14 +158,14 @@ static std::vector MakeElfFileForJITInternal( if (mini_debug_info) { std::vector mdi = MakeMiniDebugInfo(isa, features, - mi.code_address, - mi.code_size, + min_address, + max_address - min_address, /* dex_section_address */ 0, /* dex_section_size */ 0, debug_info); builder->WriteSection(".gnu_debugdata", &mdi); } else { - builder->GetText()->AllocateVirtualMemory(mi.code_address, mi.code_size); + builder->GetText()->AllocateVirtualMemory(min_address, max_address - min_address); WriteDebugInfo(builder.get(), debug_info, dwarf::DW_DEBUG_FRAME_FORMAT, @@ -173,11 +180,11 @@ std::vector MakeElfFileForJIT( InstructionSet isa, const InstructionSetFeatures* features, bool mini_debug_info, - const MethodDebugInfo& method_info) { + ArrayRef method_infos) { if (Is64BitInstructionSet(isa)) { - return MakeElfFileForJITInternal(isa, features, mini_debug_info, method_info); + return MakeElfFileForJITInternal(isa, features, mini_debug_info, method_infos); } else { - return MakeElfFileForJITInternal(isa, features, mini_debug_info, method_info); + return MakeElfFileForJITInternal(isa, features, mini_debug_info, method_infos); } } -- cgit v1.2.3-59-g8ed1b