summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml19
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test53
-rw-r--r--llvm/tools/llvm-objcopy/ELF/Object.cpp7
-rw-r--r--llvm/tools/llvm-objcopy/ELF/Object.h2
4 files changed, 81 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml b/llvm/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml
index a3c607cc72b..15fb7fdf58c 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml
+++ b/llvm/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml
@@ -25,6 +25,23 @@ Sections:
- Name: .debug_bar
Type: SHT_PROGBITS
Content: 0000000000000000
+ - Name: .group
+ Type: SHT_GROUP
+ Link: .symtab
+ EntSize: 0x0000000000000004
+ Info: groupname
+ Members:
+ - SectionOrType: GRP_COMDAT
+ - SectionOrType: .text.in.group
+ - SectionOrType: .debug_in_group
+ - Name: .text.in.group
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
+ Content: '00'
+ - Name: .debug_in_group
+ Type: SHT_PROGBITS
+ Flags: [ SHF_GROUP ]
+ Content: '00'
Symbols:
Global:
- Name: .debug_foo
@@ -35,4 +52,6 @@ Symbols:
Section: .notdebug_foo
- Name: .Linfo_string0
Section: .debug_bar
+ - Name: groupname
+ Section: .group
...
diff --git a/llvm/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test b/llvm/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test
new file mode 100644
index 00000000000..a72ecbfc04c
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test
@@ -0,0 +1,53 @@
+# REQUIRES: zlib
+
+## In this test, we check how llvm-objcopy handles compression/decompression
+## of debug sections included in a COMDAT group.
+
+# RUN: yaml2obj %p/Inputs/compress-debug-sections.yaml -o %t.o
+
+## Check compression of debug sections.
+# RUN: llvm-objcopy --compress-debug-sections %t.o %t-compressed.o
+# RUN: llvm-readobj -s -elf-section-groups %t-compressed.o | \
+# RUN: FileCheck %s --check-prefixes=CHECK,COMPRESS
+
+## Check zlib-gnu compression of debug sections.
+# RUN: llvm-objcopy --compress-debug-sections=zlib-gnu %t.o %t-compressed-gnu.o
+# RUN: llvm-readobj -s -elf-section-groups %t-compressed-gnu.o | \
+# RUN: FileCheck %s --check-prefixes=CHECK,COMPRESSZLIB
+
+## Check decompression of debug sections.
+# RUN: llvm-objcopy --decompress-debug-sections %t-compressed.o %t-decompressed.o
+# RUN: llvm-readobj -elf-section-groups %t-decompressed.o | \
+# RUN: FileCheck %s --check-prefixes=CHECK,DECOMPRESS
+
+## Check decompression of zlib-gnu debug sections.
+# RUN: llvm-objcopy --decompress-debug-sections %t-compressed-gnu.o %t-decompressed-gnu.o
+# RUN: llvm-readobj -elf-section-groups %t-decompressed-gnu.o | \
+# RUN: FileCheck %s --check-prefixes=CHECK,DECOMPRESS
+
+# COMPRESSZLIB: Name: .zdebug_in_group
+# COMPRESSZLIB-NEXT: Type: SHT_PROGBITS
+# COMPRESSZLIB-NEXT: Flags [
+# COMPRESSZLIB-NEXT: SHF_GROUP
+# COMPRESSZLIB-NEXT: ]
+
+# COMPRESS: Name: .debug_in_group
+# COMPRESS-NEXT: Type: SHT_PROGBITS
+# COMPRESS-NEXT: Flags [
+# COMPRESS-NEXT: SHF_COMPRESSED
+# COMPRESS-NEXT: SHF_GROUP
+# COMPRESS-NEXT: ]
+
+# CHECK: Group {
+# CHECK-NEXT: Name: .group
+# CHECK-NEXT: Index:
+# CHECK-NEXT: Link:
+# CHECK-NEXT: Info:
+# CHECK-NEXT: Type: COMDAT
+# CHECK-NEXT: Signature: groupname
+# CHECK-NEXT: Section(s) in group [
+# CHECK-NEXT: .text.in.group
+# COMPRESSZLIB-NEXT: .zdebug_in_group
+# COMPRESS-NEXT: .debug_in_group
+# DECOMPRESS-NEXT: .debug_in_group
+# CHECK-NEXT: ]
diff --git a/llvm/tools/llvm-objcopy/ELF/Object.cpp b/llvm/tools/llvm-objcopy/ELF/Object.cpp
index ccc6efa5dbd..38cf3ad50a5 100644
--- a/llvm/tools/llvm-objcopy/ELF/Object.cpp
+++ b/llvm/tools/llvm-objcopy/ELF/Object.cpp
@@ -689,6 +689,13 @@ void GroupSection::markSymbols() {
Sym->Referenced = true;
}
+void GroupSection::replaceSectionReferences(
+ const DenseMap<SectionBase *, SectionBase *> &FromTo) {
+ for (SectionBase *&Sec : GroupMembers)
+ if (SectionBase *To = FromTo.lookup(Sec))
+ Sec = To;
+}
+
void Section::initialize(SectionTableRef SecTable) {
if (Link != ELF::SHN_UNDEF) {
LinkSection =
diff --git a/llvm/tools/llvm-objcopy/ELF/Object.h b/llvm/tools/llvm-objcopy/ELF/Object.h
index 732ff898ed5..e892d066a6c 100644
--- a/llvm/tools/llvm-objcopy/ELF/Object.h
+++ b/llvm/tools/llvm-objcopy/ELF/Object.h
@@ -633,6 +633,8 @@ public:
void finalize() override;
Error removeSymbols(function_ref<bool(const Symbol &)> ToRemove) override;
void markSymbols() override;
+ void replaceSectionReferences(
+ const DenseMap<SectionBase *, SectionBase *> &FromTo) override;
static bool classof(const SectionBase *S) {
return S->Type == ELF::SHT_GROUP;
OpenPOWER on IntegriCloud