1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00

[llvm-readelf/readobj] - Fix the behavior when a sections is included in two groups at the same time.

The current behavior was introduced by me in D37567 and it is a bit strange. It prints the
"Error: ...." message to the errs() manually and stops dumping the group section which has this error.
This behavior is consistent with GNU though, but it is very inconsistent with what the regular llvm-readelf
code usually does/prints, so I suggest to change the implementation:

1) Instead of printing "Error: ...." to errs() - just report a warning.
2) Try to continue dumping the section.
3) Merge broken-group.test to group.text.

This is what this patch does.

Differential revision: https://reviews.llvm.org/D84170
This commit is contained in:
Georgii Rymar 2020-07-20 16:28:17 +03:00
parent 14caa2a593
commit b979a82ecf
3 changed files with 59 additions and 99 deletions

View File

@ -1,80 +0,0 @@
# RUN: yaml2obj %s -o %t.o
# RUN: llvm-readelf --elf-section-groups \
# RUN: %t.o >%tout.log 2>%terr.log
# RUN: FileCheck %s -check-prefix=GNU-STDERR < %terr.log
# GNU-STDERR: Error: section [ 3] in group section [ 4] already in group section [ 2]
# RUN: FileCheck %s -check-prefix=GNU-STDOUT < %tout.log
# GNU-STDOUT: COMDAT group section [ 2] `.group' [bar] contains 1 sections:
# GNU-STDOUT-NEXT: [Index] Name
# GNU-STDOUT-NEXT: [ 3] .foo
# GNU-STDOUT: COMDAT group section [ 4] `.group1' [zed] contains 1 sections:
# GNU-STDOUT-NEXT: [Index] Name
# RUN: llvm-readobj --elf-section-groups \
# RUN: %t.o >%t2out.log 2>%t2err.log %t.o
# RUN: FileCheck %s -check-prefix=LLVM-STDERR < %t2err.log
# LLVM-STDERR: Error: .foo (3) in a group .group1 (4) is already in a group .group (2)
# RUN: FileCheck %s -check-prefix=LLVM-STDOUT < %t2out.log
# LLVM-STDOUT: Groups {
# LLVM-STDOUT-NEXT: Group {
# LLVM-STDOUT-NEXT: Name: .group
# LLVM-STDOUT-NEXT: Index: 2
# LLVM-STDOUT-NEXT: Link: 5
# LLVM-STDOUT-NEXT: Info: 1
# LLVM-STDOUT-NEXT: Type: COMDAT
# LLVM-STDOUT-NEXT: Signature: bar
# LLVM-STDOUT-NEXT: Section(s) in group [
# LLVM-STDOUT-NEXT: .foo (3)
# LLVM-STDOUT-NEXT: ]
# LLVM-STDOUT-NEXT: }
# LLVM-STDOUT-NEXT: Group {
# LLVM-STDOUT-NEXT: Name: .group1
# LLVM-STDOUT-NEXT: Index: 4
# LLVM-STDOUT-NEXT: Link: 5
# LLVM-STDOUT-NEXT: Info: 2
# LLVM-STDOUT-NEXT: Type: COMDAT
# LLVM-STDOUT-NEXT: Signature: zed
# LLVM-STDOUT-NEXT: Section(s) in group [
# LLVM-STDOUT-NEXT: ]
# LLVM-STDOUT-NEXT: }
# LLVM-STDOUT-NEXT: }
!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
AddressAlign: 0x0000000000000004
Content: ''
- Name: .group
Type: SHT_GROUP
Link: .symtab
AddressAlign: 0x0000000000000004
Info: bar
Members:
- SectionOrType: GRP_COMDAT
- SectionOrType: .foo
- Name: .foo
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
AddressAlign: 0x0000000000000001
Content: ''
- Name: .group1
Type: SHT_GROUP
Link: .symtab
AddressAlign: 0x0000000000000004
Info: zed
Members:
- SectionOrType: GRP_COMDAT
- SectionOrType: .foo
Symbols:
- Name: bar
Section: .group
- Name: zed
Section: .group1

View File

@ -61,7 +61,7 @@ Sections:
Info: bar
Members:
- SectionOrType: GRP_COMDAT
- SectionOrType: .text.bar
- SectionOrType: [[TEXTBARNAME=.text.bar]]
- SectionOrType: .rela.text.bar
- Name: .text.foo
Type: SHT_PROGBITS
@ -80,3 +80,47 @@ Symbols:
Section: .text.foo
- Name: bar
Section: .text.bar
## Check that we report a warning and continue dumping when a section is included
## in two group sections at the same time.
# RUN: yaml2obj %s -DTEXTBARNAME=.text.foo -o %t.dup.o
# RUN: llvm-readobj --elf-section-groups %t.dup.o 2>&1 | FileCheck %s -DFILE=%t.dup.o --check-prefix=DUP-LLVM
# RUN: llvm-readelf --elf-section-groups %t.dup.o 2>&1 | FileCheck %s -DFILE=%t.dup.o --check-prefix=DUP-GNU
# DUP-LLVM: Group {
# DUP-LLVM-NEXT: Name: .group
# DUP-LLVM-NEXT: Index: 1
# DUP-LLVM-NEXT: Link: 7
# DUP-LLVM-NEXT: Info: 1
# DUP-LLVM-NEXT: Type: COMDAT
# DUP-LLVM-NEXT: Signature: foo
# DUP-LLVM-NEXT: Section(s) in group [
# DUP-LLVM-NEXT: .text.foo (3)
# DUP-LLVM-NEXT: .rela.text.foo (4)
# DUP-LLVM-NEXT: ]
# DUP-LLVM-NEXT: }
# DUP-LLVM: Group {
# DUP-LLVM-NEXT: Name: .group1
# DUP-LLVM-NEXT: Index: 2
# DUP-LLVM-NEXT: Link: 7
# DUP-LLVM-NEXT: Info: 2
# DUP-LLVM-NEXT: Type: COMDAT
# DUP-LLVM-NEXT: Signature: bar
# DUP-LLVM-NEXT: Section(s) in group [
# DUP-LLVM-NEXT: warning: '[[FILE]]': section with index 3, included in the group section with index 1, was also found in the group section with index 2
# DUP-LLVM-NEXT: .text.foo (3)
# DUP-LLVM-NEXT: .rela.text.bar (6)
# DUP-LLVM-NEXT: ]
# DUP-LLVM-NEXT: }
# DUP-GNU: COMDAT group section [ 1] `.group' [foo] contains 2 sections:
# DUP-GNU-NEXT: [Index] Name
# DUP-GNU-NEXT: [ 3] .text.foo
# DUP-GNU-NEXT: [ 4] .rela.text.foo
# DUP-GNU: COMDAT group section [ 2] `.group1' [bar] contains 2 sections:
# DUP-GNU-NEXT: [Index] Name
# DUP-GNU-NEXT: warning: '[[FILE]]': section with index 3, included in the group section with index 1, was also found in the group section with index 2
# DUP-GNU-NEXT: [ 3] .text.foo
# DUP-GNU-NEXT: [ 6] .rela.text.bar

View File

@ -3605,15 +3605,13 @@ template <class ELFT> void GNUStyle<ELFT>::printGroupSections(const ELFO *Obj) {
<< " [Index] Name\n";
for (const GroupMember &GM : G.Members) {
const GroupSection *MainGroup = Map[GM.Index];
if (MainGroup != &G) {
OS.flush();
errs() << "Error: section [" << format_decimal(GM.Index, 5)
<< "] in group section [" << format_decimal(G.Index, 5)
<< "] already in group section ["
<< format_decimal(MainGroup->Index, 5) << "]";
errs().flush();
continue;
}
if (MainGroup != &G)
this->reportUniqueWarning(
createError("section with index " + Twine(GM.Index) +
", included in the group section with index " +
Twine(MainGroup->Index) +
", was also found in the group section with index " +
Twine(G.Index)));
OS << " [" << format_decimal(GM.Index, 5) << "] " << GM.Name << "\n";
}
}
@ -6197,15 +6195,13 @@ void LLVMStyle<ELFT>::printGroupSections(const ELFO *Obj) {
ListScope L(W, "Section(s) in group");
for (const GroupMember &GM : G.Members) {
const GroupSection *MainGroup = Map[GM.Index];
if (MainGroup != &G) {
W.flush();
errs() << "Error: " << GM.Name << " (" << GM.Index
<< ") in a group " + G.Name + " (" << G.Index
<< ") is already in a group " + MainGroup->Name + " ("
<< MainGroup->Index << ")\n";
errs().flush();
continue;
}
if (MainGroup != &G)
this->reportUniqueWarning(
createError("section with index " + Twine(GM.Index) +
", included in the group section with index " +
Twine(MainGroup->Index) +
", was also found in the group section with index " +
Twine(G.Index)));
W.startLine() << GM.Name << " (" << GM.Index << ")\n";
}
}