diff --git a/llvm/test/tools/llvm-objdump/X86/source-interleave-absolute-paths-with-prefix.test b/llvm/test/tools/llvm-objdump/X86/source-interleave-absolute-paths-with-prefix.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/source-interleave-absolute-paths-with-prefix.test @@ -0,0 +1,13 @@ +# 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-objdump --source %t.o 2>&1 | FileCheck %s + +; CHECK: 0000000000000000 : +; CHECK-NEXT: ; int foo() { +; CHECK-NEXT: 0: 55 pushq %rbp + +; RUN: llvm-objdump --prefix myprefix --source %t.o 2>&1 | FileCheck %s --check-prefix CHECK-PREFIX + +; CHECK-PREFIX: 0000000000000000 : +; CHECK-PREFIX-NEXT: warning: '{{.*}}.o': failed to find source /myprefix{{.*}}/source-interleave-x86_64.c +; CHECK-PREFIX-NEXT: 0: 55 pushq %rbp diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -48,6 +48,7 @@ extern cl::opt SymbolTable; extern cl::opt TripleName; extern cl::opt UnwindInfo; +extern cl::opt Prefix; extern StringSet<> FoundSectionSet; 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 @@ -348,6 +348,10 @@ cl::cat(ObjdumpCat)); static cl::alias WideShort("w", cl::Grouping, cl::aliasopt(Wide)); +cl::opt + objdump::Prefix("prefix", cl::desc("Add PREFIX to absolute paths for -S"), + cl::cat(ObjdumpCat)); + enum DebugVarsFormat { DVDisabled, DVUnicode, @@ -1026,6 +1030,18 @@ } } + // GNU's objdump compatible `--prefix` + if (!Prefix.empty()) { + if (llvm::sys::path::is_absolute(LineInfo.FileName)) { + llvm::SmallString<128> FilePath( + llvm::sys::path::root_path(LineInfo.FileName)); + llvm::sys::path::append( + FilePath, Prefix, llvm::sys::path::relative_path(LineInfo.FileName)); + + LineInfo.FileName = std::string(FilePath); + } + } + if (PrintLines) printLines(OS, LineInfo, Delimiter, LVP); if (PrintSource)