From d16c162c9453db855503134fe29ae4a3c0bec936 Mon Sep 17 00:00:00 2001 From: Yuanfang Chen Date: Tue, 2 Jul 2019 18:38:17 +0000 Subject: [PATCH] [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 --- .../tools/llvm-objdump/warn-missing-section.test | 73 ++++++++++++++++++++++ llvm/tools/llvm-objdump/llvm-objdump.cpp | 29 ++++++++- 2 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 llvm/test/tools/llvm-objdump/warn-missing-section.test 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 0000000..178315c --- /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 f45559b..8045b94 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> SectionSymbolsTy; @@ -343,11 +344,15 @@ typedef std::vector> 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 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; } -- 2.7.4