From 0b21e41260bea6c078c18eba745d43e549230fd0 Mon Sep 17 00:00:00 2001 From: David Srbecky Date: Wed, 5 Dec 2018 13:24:06 +0000 Subject: Pack JIT mini-debug-infos together. We currently produce one in-memory ELF file per JITed method, which has significant overheads due to the ELF file headers. Pack several of those files together regularly to save space. Similarly, prune information about methods which were GCed. This reduces the size of JIT mini-debug-info by factor of 10. The final overhead is 5% to 10% relative to the JIT code size. Test: ./art/test.py -b -r -t 137 Change-Id: Idfaff8ed9a209e871e815e527f24f36c63a57bbf --- compiler/debug/dwarf/headers.h | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'compiler/debug/dwarf/headers.h') diff --git a/compiler/debug/dwarf/headers.h b/compiler/debug/dwarf/headers.h index 28f108423e..4a27178146 100644 --- a/compiler/debug/dwarf/headers.h +++ b/compiler/debug/dwarf/headers.h @@ -107,7 +107,9 @@ void WriteFDE(bool is64bit, } else { DCHECK(format == DW_DEBUG_FRAME_FORMAT); // Relocate code_address if it has absolute value. - patch_locations->push_back(buffer_address + buffer->size() - section_address); + if (patch_locations != nullptr) { + patch_locations->push_back(buffer_address + buffer->size() - section_address); + } } if (is64bit) { writer.PushUint64(code_address); @@ -122,6 +124,30 @@ void WriteFDE(bool is64bit, writer.UpdateUint32(fde_header_start, writer.data()->size() - fde_header_start - 4); } +// Read singe FDE entry from 'data' (which is advanced). +template +bool ReadFDE(const uint8_t** data, Addr* addr, Addr* size, ArrayRef* opcodes) { + struct Header { + uint32_t length; + int32_t cie_pointer; + Addr addr; + Addr size; + uint8_t augmentaion; + uint8_t opcodes[]; + } PACKED(1); + const Header* header = reinterpret_cast(*data); + const size_t length = 4 + header->length; + *data += length; + if (header->cie_pointer == -1) { + return false; // Not an FDE entry. + } + DCHECK_EQ(header->cie_pointer, 0); // Expects single CIE. Assumes DW_DEBUG_FRAME_FORMAT. + *addr = header->addr; + *size = header->size; + *opcodes = ArrayRef(header->opcodes, length - offsetof(Header, opcodes)); + return true; +} + // Write compilation unit (CU) to .debug_info section. template void WriteDebugInfoCU(uint32_t debug_abbrev_offset, -- cgit v1.2.3-59-g8ed1b