mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01: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:
parent
797cb8f639
commit
c70312a254
@ -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
|
||||
...
|
||||
|
@ -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: ]
|
@ -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 =
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user