diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 |
| commit | b915e9e0fc85ba6f398b3fab0db6a81a8913af94 (patch) | |
| tree | 98b8f811c7aff2547cab8642daf372d6c59502fb /tools/llvm-modextract | |
| parent | 6421cca32f69ac849537a3cff78c352195e99f1b (diff) | |
Notes
Diffstat (limited to 'tools/llvm-modextract')
| -rw-r--r-- | tools/llvm-modextract/CMakeLists.txt | 11 | ||||
| -rw-r--r-- | tools/llvm-modextract/LLVMBuild.txt | 22 | ||||
| -rw-r--r-- | tools/llvm-modextract/llvm-modextract.cpp | 74 |
3 files changed, 107 insertions, 0 deletions
diff --git a/tools/llvm-modextract/CMakeLists.txt b/tools/llvm-modextract/CMakeLists.txt new file mode 100644 index 000000000000..8484b3b0fb73 --- /dev/null +++ b/tools/llvm-modextract/CMakeLists.txt @@ -0,0 +1,11 @@ +set(LLVM_LINK_COMPONENTS + IRReader + BitReader + BitWriter + Core + Support + ) + +add_llvm_tool(llvm-modextract + llvm-modextract.cpp + ) diff --git a/tools/llvm-modextract/LLVMBuild.txt b/tools/llvm-modextract/LLVMBuild.txt new file mode 100644 index 000000000000..6ae5a678f320 --- /dev/null +++ b/tools/llvm-modextract/LLVMBuild.txt @@ -0,0 +1,22 @@ +;===- ./tools/llvm-modextract/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-modextract +parent = Tools +required_libraries = BitReader BitWriter diff --git a/tools/llvm-modextract/llvm-modextract.cpp b/tools/llvm-modextract/llvm-modextract.cpp new file mode 100644 index 000000000000..6c2e364be448 --- /dev/null +++ b/tools/llvm-modextract/llvm-modextract.cpp @@ -0,0 +1,74 @@ +//===-- 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(); + Out->keep(); + return 0; + } + + std::unique_ptr<Module> M = ExitOnErr(Ms[ModuleIndex].parseModule(Context)); + WriteBitcodeToFile(M.get(), Out->os()); + + Out->keep(); + return 0; +} |
