diff --git a/llvm/lib/DWP/DWP.cpp b/llvm/lib/DWP/DWP.cpp index 425650ae4082f0..25badc815fbd65 100644 --- a/llvm/lib/DWP/DWP.cpp +++ b/llvm/lib/DWP/DWP.cpp @@ -586,8 +586,12 @@ Error write(MCStreamer &Out, ArrayRef Inputs) { for (const auto &Input : Inputs) { auto ErrOrObj = object::ObjectFile::createObjectFile(Input); - if (!ErrOrObj) - return ErrOrObj.takeError(); + if (!ErrOrObj) { + return handleErrors(ErrOrObj.takeError(), + [&](std::unique_ptr EC) -> Error { + return createFileError(Input, Error(std::move(EC))); + }); + } auto &Obj = *ErrOrObj->getBinary(); Objects.push_back(std::move(*ErrOrObj)); diff --git a/llvm/test/tools/llvm-dwp/X86/diagnose_missing_dwos.test b/llvm/test/tools/llvm-dwp/X86/diagnose_missing_dwos.test new file mode 100644 index 00000000000000..8f6c5bf0bd69c8 --- /dev/null +++ b/llvm/test/tools/llvm-dwp/X86/diagnose_missing_dwos.test @@ -0,0 +1,28 @@ +RUN: rm -rf %t +RUN: mkdir %t +RUN: cd %t +RUN: cp %p/../Inputs/dwos_list_from_exec/b.dwo b.dwo +RUN: cp %p/../Inputs/dwos_list_from_exec/main main +RUN: not llvm-dwp -e binary -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-BIN +RUN: not llvm-dwp -e main -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-1ST-DWO +RUN: cp %p/../Inputs/dwos_list_from_exec/a.dwo a.dwo +RUN: rm b.dwo +RUN: not llvm-dwp -e main -o /dev/null 2>&1 | FileCheck %s --check-prefix=CHECK-2ND-DWO + +Build commands for the test binaries: + +clang++ -Xclang -fdebug-compilation-dir -Xclang "./" -g -O0 -gsplit-dwarf a.cpp b.cpp -o main + +sources: +a.cpp: + void a() {} + +b.cpp: + void b() {} + int main() { + return 0; + } + +CHECK-BIN: error: 'binary': No such file or directory +CHECK-1ST-DWO: error: './a.dwo': No such file or directory +CHECK-2ND-DWO: error: './b.dwo': No such file or directory diff --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp index d2d162d648c0df..7d1dd61dc05976 100644 --- a/llvm/tools/llvm-dwp/llvm-dwp.cpp +++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp @@ -108,7 +108,13 @@ int main(int argc, char **argv) { for (const auto &ExecFilename : ExecFilenames) { auto DWOs = getDWOFilenames(ExecFilename); if (!DWOs) { - logAllUnhandledErrors(DWOs.takeError(), WithColor::error()); + logAllUnhandledErrors( + handleErrors(DWOs.takeError(), + [&](std::unique_ptr EC) -> Error { + return createFileError(ExecFilename, + Error(std::move(EC))); + }), + WithColor::error()); return 1; } DWOFilenames.insert(DWOFilenames.end(), @@ -124,7 +130,13 @@ int main(int argc, char **argv) { auto ErrOrTriple = readTargetTriple(DWOFilenames.front()); if (!ErrOrTriple) { - logAllUnhandledErrors(ErrOrTriple.takeError(), WithColor::error()); + logAllUnhandledErrors( + handleErrors(ErrOrTriple.takeError(), + [&](std::unique_ptr EC) -> Error { + return createFileError(DWOFilenames.front(), + Error(std::move(EC))); + }), + WithColor::error()); return 1; }