diff options
Diffstat (limited to 'llvm/tools/llvm-mt/llvm-mt.cpp')
-rw-r--r-- | llvm/tools/llvm-mt/llvm-mt.cpp | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/llvm/tools/llvm-mt/llvm-mt.cpp b/llvm/tools/llvm-mt/llvm-mt.cpp index 05c9238c7c6..412883eb651 100644 --- a/llvm/tools/llvm-mt/llvm-mt.cpp +++ b/llvm/tools/llvm-mt/llvm-mt.cpp @@ -16,11 +16,13 @@ #include "llvm/Option/ArgList.h" #include "llvm/Option/Option.h" #include "llvm/Support/Error.h" +#include "llvm/Support/FileOutputBuffer.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Path.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Process.h" #include "llvm/Support/Signals.h" +#include "llvm/Support/WindowsManifestMerger.h" #include "llvm/Support/raw_ostream.h" #include <system_error> @@ -67,6 +69,22 @@ LLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg) { exit(1); } +static void reportError(StringRef Input, std::error_code EC) { + reportError(Twine(Input) + ": " + EC.message()); +} + +void error(std::error_code EC) { + if (EC) + reportError(EC.message()); +} + +void error(Error EC) { + if (EC) + handleAllErrors(std::move(EC), [&](const ErrorInfoBase &EI) { + reportError(EI.message()); + }); +} + int main(int argc, const char **argv) { sys::PrintStackTraceOnErrorSignal(argv[0]); PrettyStackTraceProgram X(argc, argv); @@ -104,7 +122,6 @@ int main(int argc, const char **argv) { } StringRef OutputFile; - if (InputArgs.hasArg(OPT_out)) { OutputFile = InputArgs.getLastArgValue(OPT_out); } else if (InputFiles.size() == 1) { @@ -113,5 +130,27 @@ int main(int argc, const char **argv) { reportError("no output file specified"); } + WindowsManifestMerger Merger; + + for (const auto &File : InputFiles) { + ErrorOr<std::unique_ptr<MemoryBuffer>> ManifestOrErr = + MemoryBuffer::getFile(File); + if (!ManifestOrErr) + reportError(File, ManifestOrErr.getError()); + MemoryBuffer &Manifest = *ManifestOrErr.get(); + error(Merger.merge(Manifest)); + } + + std::unique_ptr<MemoryBuffer> OutputBuffer = Merger.getMergedManifest(); + if (!OutputBuffer) + reportError("empty manifest not written"); + ErrorOr<std::unique_ptr<FileOutputBuffer>> FileOrErr = + FileOutputBuffer::create(OutputFile, OutputBuffer->getBufferSize()); + if (!FileOrErr) + reportError(OutputFile, FileOrErr.getError()); + std::unique_ptr<FileOutputBuffer> FileBuffer = std::move(*FileOrErr); + std::copy(OutputBuffer->getBufferStart(), OutputBuffer->getBufferEnd(), + FileBuffer->getBufferStart()); + error(FileBuffer->commit()); return 0; } |