summaryrefslogtreecommitdiff
path: root/tools/llvm-cat
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2016-11-29 20:43:47 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2016-11-29 20:43:47 +0000
commite6480e2add92580bb9016e26e3c35919849476a6 (patch)
treeca12a250f83de9868098129f7c623ff1767aaf10 /tools/llvm-cat
parentc83371f0ebba44b9a11e3e694a4425a0a83f1170 (diff)
Bitcode: Introduce BitcodeWriter interface.
This interface allows clients to write multiple modules to a single bitcode file. Also introduce the llvm-cat utility which can be used to create a bitcode file containing multiple modules. Differential Revision: https://reviews.llvm.org/D26179 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288195 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-cat')
-rw-r--r--tools/llvm-cat/CMakeLists.txt10
-rw-r--r--tools/llvm-cat/LLVMBuild.txt22
-rw-r--r--tools/llvm-cat/llvm-cat.cpp73
3 files changed, 105 insertions, 0 deletions
diff --git a/tools/llvm-cat/CMakeLists.txt b/tools/llvm-cat/CMakeLists.txt
new file mode 100644
index 00000000000..3d503c351e8
--- /dev/null
+++ b/tools/llvm-cat/CMakeLists.txt
@@ -0,0 +1,10 @@
+set(LLVM_LINK_COMPONENTS
+ IRReader
+ BitWriter
+ Core
+ Support
+ )
+
+add_llvm_tool(llvm-cat
+ llvm-cat.cpp
+ )
diff --git a/tools/llvm-cat/LLVMBuild.txt b/tools/llvm-cat/LLVMBuild.txt
new file mode 100644
index 00000000000..c3e0c6feeae
--- /dev/null
+++ b/tools/llvm-cat/LLVMBuild.txt
@@ -0,0 +1,22 @@
+;===- ./tools/llvm-cat/LLVMBuild.txt ---------------------------*- Conf -*--===;
+;
+; The LLVM Compiler Infrastructure
+;
+; This file is distributed under the University of Illinois Open Source
+; License. See LICENSE.TXT for details.
+;
+;===------------------------------------------------------------------------===;
+;
+; This is an LLVMBuild description file for the components in this subdirectory.
+;
+; For more information on the LLVMBuild system, please see:
+;
+; http://llvm.org/docs/LLVMBuild.html
+;
+;===------------------------------------------------------------------------===;
+
+[component_0]
+type = Tool
+name = llvm-cat
+parent = Tools
+required_libraries = AsmParser BitWriter
diff --git a/tools/llvm-cat/llvm-cat.cpp b/tools/llvm-cat/llvm-cat.cpp
new file mode 100644
index 00000000000..439709311d4
--- /dev/null
+++ b/tools/llvm-cat/llvm-cat.cpp
@@ -0,0 +1,73 @@
+//===-- llvm-cat.cpp - LLVM module concatenation utility ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This program is for testing features that rely on multi-module bitcode files.
+// It takes a list of input modules and uses them to create a multi-module
+// bitcode file.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Bitcode/BitcodeReader.h"
+#include "llvm/Bitcode/BitcodeWriter.h"
+#include "llvm/IRReader/IRReader.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
+
+using namespace llvm;
+
+static cl::opt<bool>
+ BinaryCat("b", cl::desc("Whether to perform binary concatenation"));
+
+static cl::opt<std::string> OutputFilename("o", cl::Required,
+ cl::desc("Output filename"),
+ cl::value_desc("filename"));
+
+static cl::list<std::string> InputFilenames(cl::Positional, cl::OneOrMore,
+ cl::desc("<input files>"));
+
+int main(int argc, char **argv) {
+ cl::ParseCommandLineOptions(argc, argv, "Module concatenation");
+
+ ExitOnError ExitOnErr("llvm-cat: ");
+ LLVMContext Context;
+
+ SmallVector<char, 0> Buffer;
+ BitcodeWriter Writer(Buffer);
+ if (BinaryCat) {
+ for (std::string InputFilename : InputFilenames) {
+ std::unique_ptr<MemoryBuffer> MB = ExitOnErr(
+ errorOrToExpected(MemoryBuffer::getFileOrSTDIN(InputFilename)));
+ std::vector<BitcodeModule> Mods = ExitOnErr(getBitcodeModuleList(*MB));
+ for (auto &BitcodeMod : Mods)
+ Buffer.insert(Buffer.end(), BitcodeMod.getBuffer().begin(),
+ BitcodeMod.getBuffer().end());
+ }
+ } else {
+ for (std::string InputFilename : InputFilenames) {
+ SMDiagnostic Err;
+ std::unique_ptr<Module> M = parseIRFile(InputFilename, Err, Context);
+ if (!M) {
+ Err.print(argv[0], errs());
+ return 1;
+ }
+ Writer.writeModule(M.get());
+ }
+ }
+
+ std::error_code EC;
+ raw_fd_ostream OS(OutputFilename, EC, sys::fs::OpenFlags::F_None);
+ if (EC) {
+ llvm::errs() << argv[0] << ": cannot open " << OutputFilename
+ << " for writing: " << EC.message();
+ return 1;
+ }
+
+ OS.write(Buffer.data(), Buffer.size());
+ return 0;
+}