From 81d8e5d40b58c453fe67123bdbb3f2e96e480506 Mon Sep 17 00:00:00 2001 From: Michael Pozulp Date: Fri, 7 Jun 2019 20:34:31 +0000 Subject: [PATCH] [llvm-objdump] Add warning if --disassemble-functions specifies an unknown symbol Summary: Fixes Bug 41904 https://bugs.llvm.org/show_bug.cgi?id=41904 Re-land r362768 after it was reverted in r362826. Reviewers: jhenderson, rupprecht, grimar, MaskRay Reviewed By: jhenderson, rupprecht, MaskRay Subscribers: dexonsmith, rupprecht, kristina, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D62275 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362838 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/llvm-objdump/X86/warn-missing-disasm-func.test | 11 +++++++++++ tools/llvm-objdump/llvm-objdump.cpp | 12 ++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 test/tools/llvm-objdump/X86/warn-missing-disasm-func.test diff --git a/test/tools/llvm-objdump/X86/warn-missing-disasm-func.test b/test/tools/llvm-objdump/X86/warn-missing-disasm-func.test new file mode 100644 index 00000000000..14d18a3feea --- /dev/null +++ b/test/tools/llvm-objdump/X86/warn-missing-disasm-func.test @@ -0,0 +1,11 @@ +## Warn if --disassemble-functions specifies an unknown symbol. +# RUN: yaml2obj %s | llvm-objdump - --disassemble-functions=foo 2>&1 | FileCheck %s + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 + +# CHECK: warning: failed to disassemble missing function foo diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 8d9001170b8..bbd65d9a9a7 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -18,6 +18,7 @@ #include "llvm-objdump.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SetOperations.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSet.h" #include "llvm/ADT/Triple.h" @@ -375,6 +376,10 @@ void warn(StringRef Message) { errs().flush(); } +void warn(Twine Message) { + WithColor::warning(errs(), ToolName) << Message << "\n"; +} + LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File, Twine Message) { WithColor::error(errs(), ToolName) << "'" << File << "': " << Message << ".\n"; @@ -1091,6 +1096,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, // Sort all the symbols, this allows us to use a simple binary search to find // a symbol near an address. + StringSet<> FoundDisasmFuncsSet; for (std::pair &SecSyms : AllSymbols) array_pod_sort(SecSyms.second.begin(), SecSyms.second.end()); array_pod_sort(AbsoluteSymbols.begin(), AbsoluteSymbols.end()); @@ -1182,6 +1188,8 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, uint64_t Start = std::get<0>(Symbols[SI]); if (Start < SectionAddr || StopAddress <= Start) continue; + else + FoundDisasmFuncsSet.insert(std::get<1>(Symbols[SI])); // The end is the section end, the beginning of the next symbol, or // --stop-address. @@ -1402,6 +1410,10 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, } } } + StringSet<> MissingDisasmFuncsSet = + set_difference(DisasmFuncsSet, FoundDisasmFuncsSet); + for (StringRef MissingDisasmFunc : MissingDisasmFuncsSet.keys()) + warn("failed to disassemble missing function " + MissingDisasmFunc); } static void disassembleObject(const ObjectFile *Obj, bool InlineRelocs) { -- 2.11.0