diff options
| author | Yuanfang Chen <yuanfang.chen@sony.com> | 2019-07-02 18:38:17 +0000 |
|---|---|---|
| committer | Yuanfang Chen <yuanfang.chen@sony.com> | 2019-07-02 18:38:17 +0000 |
| commit | d16c162c9453db855503134fe29ae4a3c0bec936 (patch) | |
| tree | 7001de08035406756f971c28b712aeca36571b07 /llvm | |
| parent | eee944e7f9e60df44714eb547d0b876ee5dc7290 (diff) | |
| download | bcm5719-llvm-d16c162c9453db855503134fe29ae4a3c0bec936.tar.gz bcm5719-llvm-d16c162c9453db855503134fe29ae4a3c0bec936.zip | |
[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
llvm-svn: 364955
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/test/tools/llvm-objdump/warn-missing-section.test | 73 | ||||
| -rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 29 |
2 files changed, 99 insertions, 3 deletions
diff --git a/llvm/test/tools/llvm-objdump/warn-missing-section.test b/llvm/test/tools/llvm-objdump/warn-missing-section.test new file mode 100644 index 00000000000..178315c305b --- /dev/null +++ b/llvm/test/tools/llvm-objdump/warn-missing-section.test @@ -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 diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index f45559b5497..8045b942402 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -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; } |

