From d33d5ac7aaba9618f06a1887081b2f9ded0466e4 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Sun, 24 Mar 2019 14:41:45 +0000 Subject: [PATCH] Recommit r356738 "[llvm-objcopy] - Implement replaceSectionReferences for GroupSection class." 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356856 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../ELF/Inputs/compress-debug-sections.yaml | 20 +++++++ .../ELF/compress-debug-sections-groups.test | 53 +++++++++++++++++++ tools/llvm-objcopy/ELF/Object.cpp | 7 +++ tools/llvm-objcopy/ELF/Object.h | 2 + 4 files changed, 82 insertions(+) create mode 100644 test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test diff --git a/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml b/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml index a3c607cc72b..8da77b36a37 100644 --- a/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml +++ b/test/tools/llvm-objcopy/ELF/Inputs/compress-debug-sections.yaml @@ -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/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test b/test/tools/llvm-objcopy/ELF/compress-debug-sections-groups.test new file mode 100644 index 00000000000..a72ecbfc04c --- /dev/null +++ b/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/tools/llvm-objcopy/ELF/Object.cpp b/tools/llvm-objcopy/ELF/Object.cpp index 39bee857945..4639d905394 100644 --- a/tools/llvm-objcopy/ELF/Object.cpp +++ b/tools/llvm-objcopy/ELF/Object.cpp @@ -689,6 +689,13 @@ void GroupSection::markSymbols() { Sym->Referenced = true; } +void GroupSection::replaceSectionReferences( + const DenseMap &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/tools/llvm-objcopy/ELF/Object.h b/tools/llvm-objcopy/ELF/Object.h index 732ff898ed5..e892d066a6c 100644 --- a/tools/llvm-objcopy/ELF/Object.h +++ b/tools/llvm-objcopy/ELF/Object.h @@ -633,6 +633,8 @@ public: void finalize() override; Error removeSymbols(function_ref ToRemove) override; void markSymbols() override; + void replaceSectionReferences( + const DenseMap &FromTo) override; static bool classof(const SectionBase *S) { return S->Type == ELF::SHT_GROUP; -- 2.40.0