diff options
| author | Seiya Nuta <nuta@seiya.me> | 2019-05-23 00:42:46 +0000 |
|---|---|---|
| committer | Seiya Nuta <nuta@seiya.me> | 2019-05-23 00:42:46 +0000 |
| commit | ada9d2d88464331a374aac1e17d685892ec78d54 (patch) | |
| tree | 6445ef85a75b1a4239a4b236aa62319c5a2f4741 /llvm/tools | |
| parent | 8477d68ad89fc20b16f358687d99d5de571311b8 (diff) | |
| download | bcm5719-llvm-ada9d2d88464331a374aac1e17d685892ec78d54.tar.gz bcm5719-llvm-ada9d2d88464331a374aac1e17d685892ec78d54.zip | |
[llvm-objcopy] Add file names to error messages
Summary:
This patch adds the file names to llvm-objcopy error messages. It makes easy to identify which file causes an error.
Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=41798
Reviewers: espindola, alexshap, rupprecht, jhenderson, jakehehrlich
Reviewed By: rupprecht, jhenderson, jakehehrlich
Subscribers: emaste, arichardson, jakehehrlich, MaskRay, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D61993
llvm-svn: 361450
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp index b14af2c128b..b2e750d15f0 100644 --- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -156,8 +156,12 @@ static std::unique_ptr<Writer> createWriter(const CopyConfig &Config, template <class ELFT> static Expected<ArrayRef<uint8_t>> -findBuildID(const object::ELFFile<ELFT> &In) { - for (const auto &Phdr : unwrapOrError(In.program_headers())) { +findBuildID(const CopyConfig &Config, const object::ELFFile<ELFT> &In) { + auto PhdrsOrErr = In.program_headers(); + if (auto Err = PhdrsOrErr.takeError()) + return createFileError(Config.InputFilename, std::move(Err)); + + for (const auto &Phdr : *PhdrsOrErr) { if (Phdr.p_type != PT_NOTE) continue; Error Err = Error::success(); @@ -165,22 +169,25 @@ findBuildID(const object::ELFFile<ELFT> &In) { if (Note.getType() == NT_GNU_BUILD_ID && Note.getName() == ELF_NOTE_GNU) return Note.getDesc(); if (Err) - return std::move(Err); + return createFileError(Config.InputFilename, std::move(Err)); } - return createStringError(llvm::errc::invalid_argument, - "could not find build ID"); + + return createFileError( + Config.InputFilename, + createStringError(llvm::errc::invalid_argument, + "could not find build ID")); } static Expected<ArrayRef<uint8_t>> -findBuildID(const object::ELFObjectFileBase &In) { +findBuildID(const CopyConfig &Config, const object::ELFObjectFileBase &In) { if (auto *O = dyn_cast<ELFObjectFile<ELF32LE>>(&In)) - return findBuildID(*O->getELFFile()); + return findBuildID(Config, *O->getELFFile()); else if (auto *O = dyn_cast<ELFObjectFile<ELF64LE>>(&In)) - return findBuildID(*O->getELFFile()); + return findBuildID(Config, *O->getELFFile()); else if (auto *O = dyn_cast<ELFObjectFile<ELF32BE>>(&In)) - return findBuildID(*O->getELFFile()); + return findBuildID(Config, *O->getELFFile()); else if (auto *O = dyn_cast<ELFObjectFile<ELF64BE>>(&In)) - return findBuildID(*O->getELFFile()); + return findBuildID(Config, *O->getELFFile()); llvm_unreachable("Bad file format"); } @@ -681,7 +688,7 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj, StringRef SecName = SecPair.first; StringRef File = SecPair.second; if (Error E = dumpSectionToFile(SecName, File, Obj)) - return createFileError(Config.InputFilename, std::move(E)); + return E; } if (!Config.AddGnuDebugLink.empty()) @@ -730,7 +737,11 @@ Error executeObjcopyOnBinary(const CopyConfig &Config, ArrayRef<uint8_t> BuildIdBytes; if (!Config.BuildIdLinkDir.empty()) { - BuildIdBytes = unwrapOrError(findBuildID(In)); + auto BuildIdBytesOrErr = findBuildID(Config, In); + if (auto E = BuildIdBytesOrErr.takeError()) + return E; + BuildIdBytes = *BuildIdBytesOrErr; + if (BuildIdBytes.size() < 2) return createFileError( Config.InputFilename, @@ -745,18 +756,19 @@ Error executeObjcopyOnBinary(const CopyConfig &Config, return E; if (Error E = handleArgs(Config, *Obj, Reader, OutputElfType)) - return E; + return createFileError(Config.InputFilename, std::move(E)); + std::unique_ptr<Writer> Writer = createWriter(Config, *Obj, Out, OutputElfType); if (Error E = Writer->finalize()) - return E; + return createFileError(Config.InputFilename, std::move(E)); if (Error E = Writer->write()) return E; if (!Config.BuildIdLinkDir.empty() && Config.BuildIdLinkOutput) if (Error E = linkToBuildIdDir(Config, Config.OutputFilename, Config.BuildIdLinkOutput.getValue(), BuildIdBytes)) - return E; + return createFileError(Config.OutputFilename, std::move(E)); return Error::success(); } |

