diff --git a/llvm/test/tools/llvm-objdump/X86/source-interleave-no-debug-info.test b/llvm/test/tools/llvm-objdump/X86/source-interleave-no-debug-info.test --- a/llvm/test/tools/llvm-objdump/X86/source-interleave-no-debug-info.test +++ b/llvm/test/tools/llvm-objdump/X86/source-interleave-no-debug-info.test @@ -1,15 +1,13 @@ ## Test that if an object has no debug information, only the disassembly is -## printed when --source is specified, and that we emit a warning. +## printed when --source is specified, and that we do not emit a warning. # RUN: sed -e "s,SRC_COMPDIR,%/p/Inputs,g" %p/Inputs/source-interleave.ll > %t.ll # RUN: llc -o %t.o -filetype=obj -mtriple=x86_64-pc-linux %t.ll # RUN: llvm-objcopy --strip-debug %t.o %t2.o # RUN: llvm-objdump --source %t.o | FileCheck %s --check-prefixes=CHECK,SOURCE -# RUN: llvm-objdump --source %t2.o 2> %t2.e | FileCheck %s --check-prefixes=CHECK --implicit-check-not='main()' -# RUN: FileCheck %s --input-file %t2.e --check-prefixes=WARN +# RUN: llvm-objdump --source %t2.o 2>&1 | FileCheck %s --check-prefixes=CHECK --implicit-check-not='main()' --implicit-check-not=warning: -# WARN: warning: '{{.*}}2.o': failed to parse debug information # CHECK: 0000000000000010
: # SOURCE-NEXT: ; int main() { # CHECK-NEXT: 10: 55 pushq %rbp diff --git a/llvm/test/tools/llvm-objdump/X86/source-interleave-prefix.test b/llvm/test/tools/llvm-objdump/X86/source-interleave-prefix.test --- a/llvm/test/tools/llvm-objdump/X86/source-interleave-prefix.test +++ b/llvm/test/tools/llvm-objdump/X86/source-interleave-prefix.test @@ -24,15 +24,6 @@ ; RUN: llvm-objdump --prefix myprefix --source %t-correct-prefix.o 2>&1 | \ ; RUN: FileCheck %s --check-prefix=CHECK-BROKEN-PREFIX -DFILE=%t-correct-prefix.o -DPREFIX=myprefix%/p -;; Test malformed input. - -; RUN: sed -e "s,SRC_COMPDIR,,g" -e "s,filename: \"source-interleave-x86_64.c\",filename: \"\",g" \ -; RUN: %p/Inputs/source-interleave.ll > %t-malformed.ll -; RUN: llc -o %t-malformed.o -filetype=obj -mtriple=x86_64-pc-linux %t-malformed.ll -; RUN: llvm-objdump --prefix myprefix --source %t-malformed.o 2>&1 | \ -; RUN: FileCheck %s --check-prefix=CHECK-MALFORMED -DFILE=%t-malformed.o -; CHECK-MALFORMED: warning: '[[FILE]]': failed to parse debug information for [[FILE]] - ;; Using only a prefix separator is the same as not using the `--prefix` option. ; RUN: llvm-objdump --prefix / --source %t-missing-prefix.o 2>&1 | \ diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -947,8 +947,8 @@ std::unordered_map> LineCache; // Keep track of missing sources. StringSet<> MissingSources; - // Only emit 'no debug info' warning once. - bool WarnedNoDebugInfo; + // Only emit 'invalid debug info' warning once. + bool WarnedInvalidDebugInfo = false; private: bool cacheSource(const DILineInfo& LineInfoFile); @@ -962,8 +962,7 @@ public: SourcePrinter() = default; - SourcePrinter(const ObjectFile *Obj, StringRef DefaultArch) - : Obj(Obj), WarnedNoDebugInfo(false) { + SourcePrinter(const ObjectFile *Obj, StringRef DefaultArch) : Obj(Obj) { symbolize::LLVMSymbolizer::Options SymbolizerOpts; SymbolizerOpts.PrintFunctions = DILineInfoSpecifier::FunctionNameKind::LinkageName; @@ -1018,22 +1017,17 @@ return; DILineInfo LineInfo = DILineInfo(); - auto ExpectedLineInfo = Symbolizer->symbolizeCode(*Obj, Address); + Expected ExpectedLineInfo = + Symbolizer->symbolizeCode(*Obj, Address); std::string ErrorMessage; - if (!ExpectedLineInfo) - ErrorMessage = toString(ExpectedLineInfo.takeError()); - else + if (ExpectedLineInfo) { LineInfo = *ExpectedLineInfo; - - if (LineInfo.FileName == DILineInfo::BadString) { - if (!WarnedNoDebugInfo) { - std::string Warning = - "failed to parse debug information for " + ObjectFilename.str(); - if (!ErrorMessage.empty()) - Warning += ": " + ErrorMessage; - reportWarning(Warning, ObjectFilename); - WarnedNoDebugInfo = true; - } + } else if (!WarnedInvalidDebugInfo) { + WarnedInvalidDebugInfo = true; + // TODO Untested. + reportWarning("failed to parse debug information: " + + toString(ExpectedLineInfo.takeError()), + ObjectFilename); } if (!Prefix.empty() && sys::path::is_absolute_gnu(LineInfo.FileName)) {