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 | 9d810e04943165b57d800ad978fa657caa76c34e (patch) | |
tree | 3057b47e517c5fb6519acaf76521176df54c2cd4 /llvm/tools/llvm-link/llvm-link.cpp | |
parent | 5de85fcb7f04ed4c4e243b3e1ae0d35ac2c8a3a3 (diff) | |
download | bcm5719-llvm-9d810e04943165b57d800ad978fa657caa76c34e.tar.gz bcm5719-llvm-9d810e04943165b57d800ad978fa657caa76c34e.zip |
Add new linker
llvm-svn: 780
Diffstat (limited to 'llvm/tools/llvm-link/llvm-link.cpp')
-rw-r--r-- | llvm/tools/llvm-link/llvm-link.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/llvm/tools/llvm-link/llvm-link.cpp b/llvm/tools/llvm-link/llvm-link.cpp new file mode 100644 index 00000000000..8dbcf4895ce --- /dev/null +++ b/llvm/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; +} |