diff options
author | Chris Lattner <sabre@nondot.org> | 2001-10-13 07:06:23 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-10-13 07:06:23 +0000 |
commit | 075a0b771e1d76ce64f4628b7a680ef6a0486a4b (patch) | |
tree | 590a9994ac3fd54bf491aa13d5964f0fbbc8c53f /tools/llvm-link | |
parent | 38c13463f6db53242019a0cc1af1367f15686d14 (diff) |
Add new linker
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@780 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-link')
-rw-r--r-- | tools/llvm-link/Makefile | 6 | ||||
-rw-r--r-- | tools/llvm-link/llvm-link.cpp | 64 |
2 files changed, 70 insertions, 0 deletions
diff --git a/tools/llvm-link/Makefile b/tools/llvm-link/Makefile new file mode 100644 index 0000000000..599d4cb965 --- /dev/null +++ b/tools/llvm-link/Makefile @@ -0,0 +1,6 @@ +LEVEL = ../.. + +TOOLNAME = link +USEDLIBS = transforms bcreader bcwriter asmwriter analysis vmcore asmwriter support + +include $(LEVEL)/Makefile.common diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp new file mode 100644 index 0000000000..8dbcf4895c --- /dev/null +++ b/tools/llvm-link/llvm-link.cpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// LLVM 'LINK' UTILITY +// +// This utility may be invoked in the following manner: +// link a.bc b.bc c.bc -o x.bc +// +//===----------------------------------------------------------------------===// + +#include "llvm/Transforms/Linker.h" +#include "llvm/Bytecode/Reader.h" +#include "llvm/Bytecode/Writer.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Module.h" +#include "llvm/Method.h" +#include <fstream.h> +#include <memory> + + +cl::StringList InputFilenames("", "Load <arg> files, linking them together", + cl::OneOrMore); +cl::String OutputFilename("o", "Override output filename", cl::NoFlags, "-"); +cl::Flag Force ("f", "Overwrite output files", cl::NoFlags, false); + + +int main(int argc, char **argv) { + cl::ParseCommandLineOptions(argc, argv, " llvm linker\n"); + assert(InputFilenames.size() > 0 && "OneOrMore is not working"); + + std::auto_ptr<Module> Composite(ParseBytecodeFile(InputFilenames[0])); + if (Composite.get() == 0) { + cerr << "Error opening bytecode file: '" << InputFilenames[0] << "'\n"; + return 1; + } + + for (unsigned i = 1; i < InputFilenames.size(); ++i) { + auto_ptr<Module> M(ParseBytecodeFile(InputFilenames[i])); + if (M.get() == 0) { + cerr << "Error opening bytecode file: '" << InputFilenames[i] << "'\n"; + return 1; + } + + string ErrorMessage; + if (LinkModules(Composite.get(), M.get(), &ErrorMessage)) { + cerr << "Error linking in '" << InputFilenames[i] << "': " + << ErrorMessage << endl; + return 1; + } + } + + ostream *Out = &cout; // Default to printing to stdout... + if (OutputFilename != "-") { + Out = new ofstream(OutputFilename.c_str(), + (Force ? 0 : ios::noreplace)|ios::out); + if (!Out->good()) { + cerr << "Error opening '" << OutputFilename << "'!\n"; + return 1; + } + } + + WriteBytecodeToFile(Composite.get(), *Out); + + if (Out != &cout) delete Out; + return 0; +} |