diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2016-11-29 21:54:33 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2016-11-29 21:54:33 +0000 |
commit | cb6b920ba077fd2fb9cb1f4e4dc576ef9e9e3322 (patch) | |
tree | 0ae1a4cf0150c74131b44d8df98b7b37069eaf26 /llvm/tools/llvm-modextract/llvm-modextract.cpp | |
parent | 96e29155749c920cdc17219cd57e0d3f08dcc923 (diff) | |
download | bcm5719-llvm-cb6b920ba077fd2fb9cb1f4e4dc576ef9e9e3322.tar.gz bcm5719-llvm-cb6b920ba077fd2fb9cb1f4e4dc576ef9e9e3322.zip |
Add llvm-modextract tool.
This program is for testing features that rely on multi-module bitcode files.
It takes a multi-module bitcode file, extracts one of the modules and writes
it to the output file.
Differential Revision: https://reviews.llvm.org/D26778
llvm-svn: 288201
Diffstat (limited to 'llvm/tools/llvm-modextract/llvm-modextract.cpp')
-rw-r--r-- | llvm/tools/llvm-modextract/llvm-modextract.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/llvm/tools/llvm-modextract/llvm-modextract.cpp b/llvm/tools/llvm-modextract/llvm-modextract.cpp new file mode 100644 index 00000000000..b4279f2ab1e --- /dev/null +++ b/llvm/tools/llvm-modextract/llvm-modextract.cpp @@ -0,0 +1,72 @@ +//===-- llvm-modextract.cpp - LLVM module extractor 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 multi-module bitcode file, extracts one of the modules and writes +// it to the output file. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Bitcode/BitcodeReader.h" +#include "llvm/Bitcode/BitcodeWriter.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/Error.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/ToolOutputFile.h" + +using namespace llvm; + +static cl::opt<bool> + BinaryExtract("b", cl::desc("Whether to perform binary extraction")); + +static cl::opt<std::string> OutputFilename("o", cl::Required, + cl::desc("Output filename"), + cl::value_desc("filename")); + +static cl::opt<std::string> + InputFilename(cl::Positional, cl::desc("<input bitcode>"), cl::init("-")); + +static cl::opt<unsigned> ModuleIndex("n", cl::Required, + cl::desc("Index of module to extract"), + cl::value_desc("index")); + +int main(int argc, char **argv) { + cl::ParseCommandLineOptions(argc, argv, "Module extractor"); + + ExitOnError ExitOnErr("llvm-modextract: error: "); + + std::unique_ptr<MemoryBuffer> MB = + ExitOnErr(errorOrToExpected(MemoryBuffer::getFileOrSTDIN(InputFilename))); + std::vector<BitcodeModule> Ms = ExitOnErr(getBitcodeModuleList(*MB)); + + LLVMContext Context; + if (ModuleIndex >= Ms.size()) { + errs() << "llvm-modextract: error: module index out of range; bitcode file " + "contains " + << Ms.size() << " module(s)\n"; + return 1; + } + + std::error_code EC; + std::unique_ptr<tool_output_file> Out( + new tool_output_file(OutputFilename, EC, sys::fs::F_None)); + ExitOnErr(errorCodeToError(EC)); + + if (BinaryExtract) { + SmallVector<char, 0> Header; + BitcodeWriter Writer(Header); + Out->os() << Header << Ms[ModuleIndex].getBuffer(); + return 0; + } + + std::unique_ptr<Module> M = ExitOnErr(Ms[ModuleIndex].parseModule(Context)); + WriteBitcodeToFile(M.get(), Out->os()); + + return 0; +} |