[llvm] r356738 - [llvm-objcopy] - Implement replaceSectionReferences for GroupSection class.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 22 03:24:38 PDT 2019


Author: grimar
Date: Fri Mar 22 03:24:37 2019
New Revision: 356738

URL: http://llvm.org/viewvc/llvm-project?rev=356738&view=rev
Log:
[llvm-objcopy] - Implement replaceSectionReferences for GroupSection class.

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

Added:
    llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test
Modified:
    llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml
    llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
    llvm/trunk/tools/llvm-objcopy/ELF/Object.h

Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml?rev=356738&r1=356737&r2=356738&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml Fri Mar 22 03:24:37 2019
@@ -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
 ...

Added: llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test?rev=356738&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test Fri Mar 22 03:24:37 2019
@@ -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:        ]

Modified: llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp?rev=356738&r1=356737&r2=356738&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/ELF/Object.cpp Fri Mar 22 03:24:37 2019
@@ -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 =

Modified: llvm/trunk/tools/llvm-objcopy/ELF/Object.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/Object.h?rev=356738&r1=356737&r2=356738&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/ELF/Object.h (original)
+++ llvm/trunk/tools/llvm-objcopy/ELF/Object.h Fri Mar 22 03:24:37 2019
@@ -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;




More information about the llvm-commits mailing list