1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[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
This commit is contained in:
George Rimar 2019-03-22 10:24:37 +00:00
parent 797cb8f639
commit c70312a254
4 changed files with 81 additions and 0 deletions

View File

@ -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
...

View File

@ -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: ]

View 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 =

View 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;