summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-mt/llvm-mt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-mt/llvm-mt.cpp')
-rw-r--r--llvm/tools/llvm-mt/llvm-mt.cpp41
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;
}
OpenPOWER on IntegriCloud