diff options
author | Pavel Labath <pavel@labath.sk> | 2019-07-10 16:10:43 +0000 |
---|---|---|
committer | Pavel Labath <pavel@labath.sk> | 2019-07-10 16:10:43 +0000 |
commit | 0ace98c9df70200bdcd5af296f5172a49b3988e5 (patch) | |
tree | 23ac9c73daba10110e7b6f178a010e56482f259e | |
parent | 58426a3707dcae151134b56688135da32f83e5bf (diff) | |
download | bcm5719-llvm-0ace98c9df70200bdcd5af296f5172a49b3988e5.tar.gz bcm5719-llvm-0ace98c9df70200bdcd5af296f5172a49b3988e5.zip |
ObjectFileELF: Add support for gnu-style compressed sections
With this style, a compressed section is indicated by a "z" in the section
name, instead of a section header flag. This patch consists of two small tweaks:
- use an llvm Decompressor method in order to properly detect compressed sections
- make sure we recognise .zdebug_info (and friends) when classifying section types.
llvm-svn: 365654
-rw-r--r-- | lldb/lit/Modules/ELF/compressed-sections.yaml | 13 | ||||
-rw-r--r-- | lldb/lit/SymbolFile/DWARF/gnu-style-compression.cpp | 14 | ||||
-rw-r--r-- | lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 59 |
3 files changed, 57 insertions, 29 deletions
diff --git a/lldb/lit/Modules/ELF/compressed-sections.yaml b/lldb/lit/Modules/ELF/compressed-sections.yaml index df070a2d53d..f8c31d52bb8 100644 --- a/lldb/lit/Modules/ELF/compressed-sections.yaml +++ b/lldb/lit/Modules/ELF/compressed-sections.yaml @@ -16,14 +16,18 @@ Sections: Type: SHT_PROGBITS Flags: [ SHF_COMPRESSED ] Content: deadbeefbaadf00d + - Name: .zdebug_info + Type: SHT_PROGBITS + Content: 5A4C49420000000000000008789c5330700848286898000009c802c1 # CHECK: Name: .hello_elf # CHECK-NEXT: Type: regular # CHECK: VM address: 0 # CHECK-NEXT: VM size: 0 # CHECK-NEXT: File size: 28 -# CHECK-NEXT: Data: +# CHECK-NEXT: Data: ( # CHECK-NEXT: 20304050 60708090 +# CHECK-NEXT: ) # CHECK: Name: .bogus # CHECK-NEXT: Type: regular @@ -31,3 +35,10 @@ Sections: # CHECK-NEXT: VM size: 0 # CHECK-NEXT: File size: 8 # CHECK-NEXT: Data: () + +# CHECK: Name: .zdebug_info +# CHECK: dwarf-info +# CHECK: File size: 28 +# CHECK: Data: ( +# CHECK-NEXT: 20304050 60708090 +# CHECK-NEXT: ) diff --git a/lldb/lit/SymbolFile/DWARF/gnu-style-compression.cpp b/lldb/lit/SymbolFile/DWARF/gnu-style-compression.cpp new file mode 100644 index 00000000000..9dc87303ba9 --- /dev/null +++ b/lldb/lit/SymbolFile/DWARF/gnu-style-compression.cpp @@ -0,0 +1,14 @@ +// REQUIRES: zlib + +// RUN: %clang %s -target x86_64-pc-linux -g -gsplit-dwarf -c -o %t \ +// RUN: -Wa,--compress-debug-sections=zlib-gnu +// RUN: %lldb %t -o "target var s a" -b | FileCheck %s + +// CHECK: (const short) s = 47 +// CHECK: (const A) a = (a = 42) + +struct A { + long a = 42; +}; +extern constexpr short s = 47; +extern constexpr A a{}; diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 47d5664700d..d62afa34bbe 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -1674,38 +1674,40 @@ lldb::user_id_t ObjectFileELF::GetSectionIndexByName(const char *name) { } static SectionType GetSectionTypeFromName(llvm::StringRef Name) { + if (Name.consume_front(".debug_") || Name.consume_front(".zdebug_")) { + return llvm::StringSwitch<SectionType>(Name) + .Case("abbrev", eSectionTypeDWARFDebugAbbrev) + .Case("abbrev.dwo", eSectionTypeDWARFDebugAbbrevDwo) + .Case("addr", eSectionTypeDWARFDebugAddr) + .Case("aranges", eSectionTypeDWARFDebugAranges) + .Case("cu_index", eSectionTypeDWARFDebugCuIndex) + .Case("frame", eSectionTypeDWARFDebugFrame) + .Case("info", eSectionTypeDWARFDebugInfo) + .Case("info.dwo", eSectionTypeDWARFDebugInfoDwo) + .Cases("line", "line.dwo", eSectionTypeDWARFDebugLine) + .Cases("line_str", "line_str.dwo", eSectionTypeDWARFDebugLineStr) + .Cases("loc", "loc.dwo", eSectionTypeDWARFDebugLoc) + .Cases("loclists", "loclists.dwo", eSectionTypeDWARFDebugLocLists) + .Case("macinfo", eSectionTypeDWARFDebugMacInfo) + .Cases("macro", "macro.dwo", eSectionTypeDWARFDebugMacro) + .Case("names", eSectionTypeDWARFDebugNames) + .Case("pubnames", eSectionTypeDWARFDebugPubNames) + .Case("pubtypes", eSectionTypeDWARFDebugPubTypes) + .Case("ranges", eSectionTypeDWARFDebugRanges) + .Case("rnglists", eSectionTypeDWARFDebugRngLists) + .Case("str", eSectionTypeDWARFDebugStr) + .Case("str.dwo", eSectionTypeDWARFDebugStrDwo) + .Case("str_offsets", eSectionTypeDWARFDebugStrOffsets) + .Case("str_offsets.dwo", eSectionTypeDWARFDebugStrOffsetsDwo) + .Case("types", eSectionTypeDWARFDebugTypes) + .Case("types.dwo", eSectionTypeDWARFDebugTypesDwo) + .Default(eSectionTypeOther); + } return llvm::StringSwitch<SectionType>(Name) .Case(".ARM.exidx", eSectionTypeARMexidx) .Case(".ARM.extab", eSectionTypeARMextab) .Cases(".bss", ".tbss", eSectionTypeZeroFill) .Cases(".data", ".tdata", eSectionTypeData) - .Case(".debug_abbrev", eSectionTypeDWARFDebugAbbrev) - .Case(".debug_abbrev.dwo", eSectionTypeDWARFDebugAbbrevDwo) - .Case(".debug_addr", eSectionTypeDWARFDebugAddr) - .Case(".debug_aranges", eSectionTypeDWARFDebugAranges) - .Case(".debug_cu_index", eSectionTypeDWARFDebugCuIndex) - .Case(".debug_frame", eSectionTypeDWARFDebugFrame) - .Case(".debug_info", eSectionTypeDWARFDebugInfo) - .Case(".debug_info.dwo", eSectionTypeDWARFDebugInfoDwo) - .Cases(".debug_line", ".debug_line.dwo", eSectionTypeDWARFDebugLine) - .Cases(".debug_line_str", ".debug_line_str.dwo", - eSectionTypeDWARFDebugLineStr) - .Cases(".debug_loc", ".debug_loc.dwo", eSectionTypeDWARFDebugLoc) - .Cases(".debug_loclists", ".debug_loclists.dwo", - eSectionTypeDWARFDebugLocLists) - .Case(".debug_macinfo", eSectionTypeDWARFDebugMacInfo) - .Cases(".debug_macro", ".debug_macro.dwo", eSectionTypeDWARFDebugMacro) - .Case(".debug_names", eSectionTypeDWARFDebugNames) - .Case(".debug_pubnames", eSectionTypeDWARFDebugPubNames) - .Case(".debug_pubtypes", eSectionTypeDWARFDebugPubTypes) - .Case(".debug_ranges", eSectionTypeDWARFDebugRanges) - .Case(".debug_rnglists", eSectionTypeDWARFDebugRngLists) - .Case(".debug_str", eSectionTypeDWARFDebugStr) - .Case(".debug_str.dwo", eSectionTypeDWARFDebugStrDwo) - .Case(".debug_str_offsets", eSectionTypeDWARFDebugStrOffsets) - .Case(".debug_str_offsets.dwo", eSectionTypeDWARFDebugStrOffsetsDwo) - .Case(".debug_types", eSectionTypeDWARFDebugTypes) - .Case(".debug_types.dwo", eSectionTypeDWARFDebugTypesDwo) .Case(".eh_frame", eSectionTypeEHFrame) .Case(".gnu_debugaltlink", eSectionTypeDWARFGNUDebugAltLink) .Case(".gosymtab", eSectionTypeGoSymtab) @@ -3302,7 +3304,8 @@ size_t ObjectFileELF::ReadSectionData(Section *section, return section->GetObjectFile()->ReadSectionData(section, section_data); size_t result = ObjectFile::ReadSectionData(section, section_data); - if (result == 0 || !section->Test(SHF_COMPRESSED)) + if (result == 0 || !llvm::object::Decompressor::isCompressedELFSection( + section->Get(), section->GetName().GetStringRef())) return result; auto Decompressor = llvm::object::Decompressor::create( |