[llvm-objcopy] - Reimplement strip-dwo-groups.test to stop using the precompiled object.

When llvm-copy removes .dwo sections the index of symbol table,
the indices of the symbols and the indices of the sections which go
after the removed ones changes. That affects on SHT_GROUP sections,
which needs to be updated.

Initially this test used a precompiled object, I rewrote it to use YAML
and improved a bit.

Differential revision: https://reviews.llvm.org/D65273

llvm-svn: 367202
This commit is contained in:
George Rimar 2019-07-29 07:55:39 +00:00
parent 822c58704b
commit 99f73ebe5c
2 changed files with 71 additions and 35 deletions

View File

@ -1,40 +1,76 @@
# RUN: cp %p/Inputs/groups.o %t
# RUN: yaml2obj %s -o %t
# RUN: llvm-objcopy --strip-dwo %t
# RUN: llvm-readobj --elf-section-groups %t | FileCheck %s
# RUN: llvm-readobj --symbols -S --elf-section-groups %t | FileCheck %s --implicit-check-not=debug_
// Source code of groups.o:
//
// template <class T>
// struct S {
// static constexpr T X = T(1);
// T getX() { return X; }
// };
// void f() {
// S<int> A;
// S<double> B;
// int a = A.getX();
// int b = B.getX();
// }
//
// clang -g -gsplit-dwarf -std=c++11 -c groups.cpp -o groups.o
## `llvm-objcopy --strip-dwo` strips out dwo sections, as a result, the index of
## the symbol table, the indices of the symbols and the indices of the sections
## which go after the removed ones will change. Consequently, the fields
## Link, Info and the content of .group need to be updated.
// `llvm-objcopy --strip-dwo` strips out dwo sections, as a result, the index of
// the symbol table, the indices of the symbols and the indices of the sections
// which go after the removed ones will change. Consequently, the fields
// Link, Info and the content of .group need to be updated. In the past
// `llvm-objcopy --strip-dwo` used to produce invalid binaries with
// broken .group section, this test verifies the correctness of
// Link, Info and the content of this section.
# CHECK: Groups {
# CHECK: Name: .group (1)
# CHECK-NEXT: Index: 1{{$}}
# CHECK-NEXT: Link: 6
# CHECK-NEXT: Info: 2
# CHECK-NEXT: Type: COMDAT (0x1)
# CHECK-NEXT: Signature: group1
# CHECK-NEXT: Section(s) in group [
# CHECK-NEXT: .text.group1 (3)
# CHECK-NEXT: ]
CHECK: Name: .group (179)
CHECK-NEXT: Index: 1{{$}}
CHECK-NEXT: Link: 19
CHECK-NEXT: Info: 14
CHECK: .text._ZN1SIiE4getXEv
# CHECK: Name: .group (1)
# CHECK-NEXT: Index: 2{{$}}
# CHECK-NEXT: Link: 6
# CHECK-NEXT: Info: 1
# CHECK-NEXT: Type: COMDAT (0x1)
# CHECK-NEXT: Signature: group2
# CHECK-NEXT: Section(s) in group [
# CHECK-NEXT: .text.group2 (4)
# CHECK-NEXT: .rela.text.group2 (5)
# CHECK-NEXT: ]
CHECK: Name: .group (179)
CHECK-NEXT: Index: 2{{$}}
CHECK-NEXT: Link: 19
CHECK-NEXT: Info: 13
CHECK: .text._ZN1SIdE4getXEv
CHECK-NEXT: .rela.text._ZN1SIdE4getXEv
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .debug_before.dwo
Type: SHT_PROGBITS
- Name: .group
Type: SHT_GROUP
Link: .symtab
Info: group1
Members:
- SectionOrType: GRP_COMDAT
- SectionOrType: .text.group1
- Name: .text.group1
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
- Name: '.group [1]'
Type: SHT_GROUP
Link: .symtab
Info: group2
Members:
- SectionOrType: GRP_COMDAT
- SectionOrType: .text.group2
- SectionOrType: .rela.text.group2
- Name: .text.group2
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
- Name: .rela.text.group2
Type: SHT_RELA
Flags: [ SHF_GROUP ]
Info: .text.group2
- Name: .debug_after.dwo
Type: SHT_PROGBITS
Symbols:
- Name: debug_before
Section: .debug_before.dwo
- Name: group2
Section: .text.group2
- Name: group1
Section: .text.group1
- Name: debug_after
Section: .debug_after.dwo