diff --git a/llvm/test/tools/llvm-readobj/ELF/broken-group.test b/llvm/test/tools/llvm-readobj/ELF/broken-group.test deleted file mode 100644 --- a/llvm/test/tools/llvm-readobj/ELF/broken-group.test +++ /dev/null @@ -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 diff --git a/llvm/test/tools/llvm-readobj/ELF/groups.test b/llvm/test/tools/llvm-readobj/ELF/groups.test --- a/llvm/test/tools/llvm-readobj/ELF/groups.test +++ b/llvm/test/tools/llvm-readobj/ELF/groups.test @@ -61,7 +61,7 @@ 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 @@ 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 diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -3605,15 +3605,13 @@ << " [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 @@ 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"; } }