Recommit r356738 "[llvm-objcopy] - Implement replaceSectionReferences for GroupSectio...
authorGeorge Rimar <grimar@accesssoftek.com>
Sun, 24 Mar 2019 14:41:45 +0000 (14:41 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Sun, 24 Mar 2019 14:41:45 +0000 (14:41 +0000)
Fix: r356853 + set AddressAlign to 4 in
Inputs/compress-debug-sections.yaml for the new group section introduced.

Original commit message:

Currently, llvm-objcopy incorrectly handles compression and decompression of the
sections from COMDAT groups, because we do not implement the
replaceSectionReferences for this type of the sections.

The patch does that.

Differential revision: https://reviews.llvm.org/D59638

llvm-svn: 356856

llvm/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml
llvm/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test [new file with mode: 0644]
llvm/tools/llvm-objcopy/ELF/Object.cpp
llvm/tools/llvm-objcopy/ELF/Object.h

index a3c607cc72bca8516d3ebe309b2738a5ccc8ff83..8da77b36a3756f501282e1c45ea9d8bfc1d52215 100644 (file)
@@ -25,6 +25,24 @@ Sections:
   - Name:            .debug_bar
     Type:            SHT_PROGBITS
     Content:         0000000000000000
+  - Name:            .group
+    Type:            SHT_GROUP
+    Link:            .symtab
+    AddressAlign:    4
+    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 +53,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 (file)
index 0000000..a72ecbf
--- /dev/null
@@ -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:        ]
index 39bee8579459cb5f0da84cdc8d42216c6aeb707c..4639d9053943ee797ceaefebeedb891430d4ed28 100644 (file)
@@ -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 =
index 732ff898ed5b463d81df0d40d4f4ab620d688230..e892d066a6cd19e7b44ea5ff63ba10432ea58b5c 100644 (file)
@@ -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;