diff --git a/llvm/lib/DWP/DWP.cpp b/llvm/lib/DWP/DWP.cpp index 425650ae4082..25badc815fbd 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 000000000000..8d71cf5d5c30 --- /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': {{[Nn]}}o such file or directory +CHECK-1ST-DWO: error: './a.dwo': {{[Nn]}}o such file or directory +CHECK-2ND-DWO: error: './b.dwo': {{[Nn]}}o such file or directory diff --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp index bc170a1e8d54..f9d1dc4b2749 100644 --- a/llvm/tools/llvm-dwp/llvm-dwp.cpp +++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp @@ -111,7 +111,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(), @@ -127,7 +133,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; }