summaryrefslogtreecommitdiffstats
path: root/compiler/debug/elf_debug_writer.cc
diff options
context:
space:
mode:
authorDavid Srbecky <dsrbecky@google.com>2018-06-03 12:00:27 +0100
committerDavid Srbecky <dsrbecky@google.com>2018-07-17 14:45:51 +0100
commit154c57fc97e5fa343d97b5e7c6bb993ecb4e6e34 (patch)
treecaa390f67ad733872fda06e46fc9f5d516f4c9c2 /compiler/debug/elf_debug_writer.cc
parent2449d6d006dcb685d3b386edcf624e67ef37e12c (diff)
downloadart-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.cc35
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,