summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Labath <pavel@labath.sk>2019-07-10 16:10:43 +0000
committerPavel Labath <pavel@labath.sk>2019-07-10 16:10:43 +0000
commit0ace98c9df70200bdcd5af296f5172a49b3988e5 (patch)
tree23ac9c73daba10110e7b6f178a010e56482f259e
parent58426a3707dcae151134b56688135da32f83e5bf (diff)
downloadbcm5719-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.yaml13
-rw-r--r--lldb/lit/SymbolFile/DWARF/gnu-style-compression.cpp14
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp59
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(
OpenPOWER on IntegriCloud