diff --git a/llvm/tools/llvm-cvtres/CMakeLists.txt b/llvm/tools/llvm-cvtres/CMakeLists.txt --- a/llvm/tools/llvm-cvtres/CMakeLists.txt +++ b/llvm/tools/llvm-cvtres/CMakeLists.txt @@ -1,4 +1,5 @@ set(LLVM_LINK_COMPONENTS + BinaryFormat Object Option Support diff --git a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp --- a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp +++ b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/BinaryFormat/Magic.h" #include "llvm/Object/Binary.h" #include "llvm/Object/WindowsMachineFlag.h" #include "llvm/Object/WindowsResource.h" @@ -75,6 +76,14 @@ reportError(Twine(Input) + ": " + EC.message() + ".\n"); } +static void error(StringRef Input, Error EC) { + if (!EC) + return; + handleAllErrors(std::move(EC), [&](const ErrorInfoBase &EI) { + reportError(Twine(Input) + ": " + EI.message() + ".\n"); + }); +} + static void error(Error EC) { if (!EC) return; @@ -95,6 +104,16 @@ return std::move(EC.get()); } +template T error(StringRef Input, Expected EC) { + if (!EC) + error(Input, EC.takeError()); + return std::move(EC.get()); +} + +template T error(StringRef Input, ErrorOr &&EC) { + return error(Input, errorOrToExpected(std::move(EC))); +} + int main(int Argc, const char **Argv) { InitLLVM X(Argc, Argv); @@ -155,15 +174,17 @@ WindowsResourceParser Parser; for (const auto &File : InputFiles) { - Expected> BinaryOrErr = createBinary(File); - if (!BinaryOrErr) - reportError(File, errorToErrorCode(BinaryOrErr.takeError())); - - Binary &Binary = *BinaryOrErr.get().getBinary(); - - WindowsResource *RF = dyn_cast(&Binary); - if (!RF) + std::unique_ptr Buffer = error( + File, MemoryBuffer::getFileOrSTDIN(File, /*IsText=*/false, + /*RequiresNullTerminator=*/false)); + file_magic Type = identify_magic(Buffer->getMemBufferRef().getBuffer()); + if (Type != file_magic::windows_resource) reportError(File + ": unrecognized file format.\n"); + std::unique_ptr Binary = error( + File, + WindowsResource::createWindowsResource(Buffer->getMemBufferRef())); + + WindowsResource *RF = Binary.get(); if (Verbose) { int EntryNumber = 0; @@ -199,12 +220,14 @@ error(FileBuffer->commit()); if (Verbose) { - Expected> BinaryOrErr = createBinary(OutputFile); - if (!BinaryOrErr) - reportError(OutputFile, errorToErrorCode(BinaryOrErr.takeError())); - Binary &Binary = *BinaryOrErr.get().getBinary(); + std::unique_ptr Buffer = + error(OutputFile, + MemoryBuffer::getFileOrSTDIN(OutputFile, /*IsText=*/false, + /*RequiresNullTerminator=*/false)); + ScopedPrinter W(errs()); - W.printBinaryBlock("Output File Raw Data", Binary.getData()); + W.printBinaryBlock("Output File Raw Data", + Buffer->getMemBufferRef().getBuffer()); } return 0;