mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
[llvm-objdump] Warn if no user specified sections (-j) are not found.
Match GNU objdump. https://bugs.llvm.org/show_bug.cgi?id=41898 Reviewers: jhenderson, grimar, MaskRay, rupprecht Reviewed by: jhenderson, grimar, MaskRay Differential Revision: https://reviews.llvm.org/D63779 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364955 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
## This test checks the warning message when no user specified sections are
|
||||
## found in the object file.
|
||||
|
||||
## Test relocatable file.
|
||||
# RUN: yaml2obj --docnum=1 %s -o %t.1.o
|
||||
# RUN: yaml2obj --docnum=2 %s -o %t.2.o
|
||||
|
||||
## - Warn for one section is found case.
|
||||
# RUN: llvm-objdump --reloc --section=single %t.2.o 2>&1 \
|
||||
# RUN: | FileCheck --check-prefix=SINGLE-WARN %s
|
||||
|
||||
## - Don't warn twice for duplicate missing sections.
|
||||
# RUN: llvm-objdump --reloc --section=single --section=single %t.2.o 2>&1 \
|
||||
# RUN: | FileCheck --check-prefixes=SINGLE-WARN --implicit-check-not=warning: %s
|
||||
|
||||
## - Don't warn if any user specified section is found.
|
||||
# RUN: llvm-objdump --reloc --section=.text1 --section=.text2 %t.2.o \
|
||||
# RUN: | FileCheck --implicit-check-not=warning: %s
|
||||
|
||||
## - Warn for each specified section if none of them are found.
|
||||
# RUN: llvm-objdump --reloc --section=multi1 --section=multi2 %t.2.o 2>&1 \
|
||||
# RUN: | FileCheck --check-prefix=MULTI-WARN %s
|
||||
|
||||
## - Don't warn if the specified section has no name.
|
||||
# RUN: llvm-objdump --reloc --section="" %t.2.o 2>&1 \
|
||||
# RUN: | FileCheck --implicit-check-not=warning: %s
|
||||
|
||||
## - Warning for --section is applicable for various other options.
|
||||
# RUN: llvm-objdump --section-headers --section=single %t.2.o 2>&1 \
|
||||
# RUN: | FileCheck --check-prefix=SINGLE-WARN %s
|
||||
# RUN: llvm-objdump --full-contents --section=single %t.2.o 2>&1 \
|
||||
# RUN: | FileCheck --check-prefix=SINGLE-WARN %s
|
||||
|
||||
## Test archive file.
|
||||
# RUN: rm -f %t.a
|
||||
# RUN: llvm-ar rc %t.a %t.1.o %t.2.o
|
||||
|
||||
## - Warn for one section is found case.
|
||||
# RUN: llvm-objdump --reloc --section=single %t.a 2>&1 \
|
||||
# RUN: | FileCheck --check-prefix=SINGLE-WARN %s
|
||||
|
||||
## - Don't warn if any user specified section is found.
|
||||
# RUN: llvm-objdump --reloc --section=.text1 %t.a \
|
||||
# RUN: | FileCheck --implicit-check-not=warning: %s
|
||||
|
||||
## - Warn for each specified section if none of them are found.
|
||||
# RUN: llvm-objdump --reloc --section=multi1 --section=multi2 %t.a 2>&1 \
|
||||
# RUN: | FileCheck --check-prefix=MULTI-WARN %s
|
||||
|
||||
|
||||
# SINGLE-WARN: warning: section 'single' mentioned in a -j/--section option, but not found in any input file
|
||||
# MULTI-WARN: warning: section 'multi1' mentioned in a -j/--section option, but not found in any input file
|
||||
# MULTI-WARN-NEXT: warning: section 'multi2' mentioned in a -j/--section option, but not found in any input file
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_REL
|
||||
Machine: EM_X86_64
|
||||
Sections:
|
||||
- Name: .text1
|
||||
Type: SHT_PROGBITS
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_REL
|
||||
Machine: EM_X86_64
|
||||
Sections:
|
||||
- Name: .text2
|
||||
Type: SHT_PROGBITS
|
||||
@@ -336,6 +336,7 @@ static cl::extrahelp
|
||||
HelpResponse("\nPass @FILE as argument to read options from FILE.\n");
|
||||
|
||||
static StringSet<> DisasmFuncsSet;
|
||||
static StringSet<> FoundSectionSet;
|
||||
static StringRef ToolName;
|
||||
|
||||
typedef std::vector<std::tuple<uint64_t, StringRef, uint8_t>> SectionSymbolsTy;
|
||||
@@ -343,11 +344,15 @@ typedef std::vector<std::tuple<uint64_t, StringRef, uint8_t>> SectionSymbolsTy;
|
||||
static bool shouldKeep(object::SectionRef S) {
|
||||
if (FilterSections.empty())
|
||||
return true;
|
||||
StringRef String;
|
||||
std::error_code error = S.getName(String);
|
||||
StringRef SecName;
|
||||
std::error_code error = S.getName(SecName);
|
||||
if (error)
|
||||
return false;
|
||||
return is_contained(FilterSections, String);
|
||||
// StringSet does not allow empty key so avoid adding sections with
|
||||
// no name (such as the section with index 0) here.
|
||||
if (!SecName.empty())
|
||||
FoundSectionSet.insert(SecName);
|
||||
return is_contained(FilterSections, SecName);
|
||||
}
|
||||
|
||||
SectionFilter ToolSectionFilter(object::ObjectFile const &O) {
|
||||
@@ -434,6 +439,22 @@ LLVM_ATTRIBUTE_NORETURN void report_error(Error E, StringRef ArchiveName,
|
||||
report_error(std::move(E), ArchiveName, NameOrErr.get(), ArchitectureName);
|
||||
}
|
||||
|
||||
static void warnOnNoMatchForSections() {
|
||||
SetVector<StringRef> MissingSections;
|
||||
for (StringRef S : FilterSections) {
|
||||
if (FoundSectionSet.count(S))
|
||||
return;
|
||||
// User may specify a unnamed section. Don't warn for it.
|
||||
if (!S.empty())
|
||||
MissingSections.insert(S);
|
||||
}
|
||||
|
||||
// Warn only if no section in FilterSections is matched.
|
||||
for (StringRef S : MissingSections)
|
||||
warn("section '" + S + "' mentioned in a -j/--section option, but not "
|
||||
"found in any input file");
|
||||
}
|
||||
|
||||
static const Target *getTarget(const ObjectFile *Obj = nullptr) {
|
||||
// Figure out the target triple.
|
||||
Triple TheTriple("unknown-unknown-unknown");
|
||||
@@ -2157,5 +2178,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
llvm::for_each(InputFilenames, dumpInput);
|
||||
|
||||
warnOnNoMatchForSections();
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user