Skip to content

Commit

Permalink
[llvm-objcopy] - Implement replaceSectionReferences for GroupSection …
Browse files Browse the repository at this point in the history
…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
  • Loading branch information
George Rimar committed Mar 22, 2019
1 parent c040d5d commit 73e1c4a
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 0 deletions.
Expand Up @@ -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
Expand All @@ -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: ]
7 changes: 7 additions & 0 deletions llvm/tools/llvm-objcopy/ELF/Object.cpp
Expand Up @@ -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 =
Expand Down
2 changes: 2 additions & 0 deletions llvm/tools/llvm-objcopy/ELF/Object.h
Expand Up @@ -633,6 +633,8 @@ class GroupSection : public SectionBase {
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;
Expand Down

0 comments on commit 73e1c4a

Please sign in to comment.