diff options
| author | David Srbecky <dsrbecky@google.com> | 2018-06-03 12:00:27 +0100 |
|---|---|---|
| committer | David Srbecky <dsrbecky@google.com> | 2018-07-17 14:45:51 +0100 |
| commit | 154c57fc97e5fa343d97b5e7c6bb993ecb4e6e34 (patch) | |
| tree | caa390f67ad733872fda06e46fc9f5d516f4c9c2 /compiler/debug/elf_debug_writer.cc | |
| parent | 2449d6d006dcb685d3b386edcf624e67ef37e12c (diff) | |
| download | art-154c57fc97e5fa343d97b5e7c6bb993ecb4e6e34.tar.gz art-154c57fc97e5fa343d97b5e7c6bb993ecb4e6e34.tar.bz2 art-154c57fc97e5fa343d97b5e7c6bb993ecb4e6e34.zip | |
Compress mini-debug-info in small chunks.
Compress the mini-debug-info in small independent parts.
This still results in standard compressed data stream.
However, by dividing into chunks, the compressed data
can be random accessed - that is, it makes it possible
to decompressed only the data that is needed.
This increases size of .oat files by 1.2%.
Bug: 110133331
Test: test.py --host -b -t 137
Change-Id: I9d1d4f1971b3c072d45ca4289f8c15f44da4036a
Diffstat (limited to 'compiler/debug/elf_debug_writer.cc')
| -rw-r--r-- | compiler/debug/elf_debug_writer.cc | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/compiler/debug/elf_debug_writer.cc b/compiler/debug/elf_debug_writer.cc index 59a080fc21..71422d48a5 100644 --- a/compiler/debug/elf_debug_writer.cc +++ b/compiler/debug/elf_debug_writer.cc @@ -26,9 +26,9 @@ #include "debug/elf_debug_info_writer.h" #include "debug/elf_debug_line_writer.h" #include "debug/elf_debug_loc_writer.h" -#include "debug/elf_gnu_debugdata_writer.h" #include "debug/elf_symtab_writer.h" #include "debug/method_debug_info.h" +#include "debug/xz_utils.h" #include "linker/elf_builder.h" #include "linker/vector_output_stream.h" #include "oat.h" @@ -105,6 +105,39 @@ void WriteDebugInfo(linker::ElfBuilder<ElfTypes>* builder, } } +template <typename ElfTypes> +static std::vector<uint8_t> MakeMiniDebugInfoInternal( + InstructionSet isa, + const InstructionSetFeatures* features, + typename ElfTypes::Addr text_section_address, + size_t text_section_size, + typename ElfTypes::Addr dex_section_address, + size_t dex_section_size, + const DebugInfo& debug_info) { + std::vector<uint8_t> buffer; + buffer.reserve(KB); + linker::VectorOutputStream out("Mini-debug-info ELF file", &buffer); + std::unique_ptr<linker::ElfBuilder<ElfTypes>> builder( + new linker::ElfBuilder<ElfTypes>(isa, features, &out)); + builder->Start(false /* write_program_headers */); + // Mirror ELF sections as NOBITS since the added symbols will reference them. + builder->GetText()->AllocateVirtualMemory(text_section_address, text_section_size); + if (dex_section_size != 0) { + builder->GetDex()->AllocateVirtualMemory(dex_section_address, dex_section_size); + } + WriteDebugSymbols(builder.get(), true /* mini-debug-info */, debug_info); + WriteCFISection(builder.get(), + debug_info.compiled_methods, + dwarf::DW_DEBUG_FRAME_FORMAT, + false /* write_oat_paches */); + builder->End(); + CHECK(builder->Good()); + std::vector<uint8_t> compressed_buffer; + compressed_buffer.reserve(buffer.size() / 4); + XzCompress(ArrayRef<uint8_t>(buffer), &compressed_buffer); + return compressed_buffer; +} + std::vector<uint8_t> MakeMiniDebugInfo( InstructionSet isa, const InstructionSetFeatures* features, |
