summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-03-22 10:24:37 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-03-22 10:24:37 +0000
commit73e1c4a0309d3c81ad21f2c769d33222f6615abb (patch)
tree66ca70e86fda2ffc0f78950da1f6209f1312731b
parentc040d5de25f50887170e056dc854fe0a82e04640 (diff)
downloadbcm5719-llvm-73e1c4a0309d3c81ad21f2c769d33222f6615abb.tar.gz
bcm5719-llvm-73e1c4a0309d3c81ad21f2c769d33222f6615abb.zip
[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 llvm-svn: 356738
-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