diff --git a/tools/link/Makefile b/tools/link/Makefile new file mode 100644 index 00000000000..599d4cb965f --- /dev/null +++ b/tools/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/link/link.cpp b/tools/link/link.cpp new file mode 100644 index 00000000000..8dbcf4895ce --- /dev/null +++ b/tools/link/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 +#include + + +cl::StringList InputFilenames("", "Load 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 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 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; +} diff --git a/tools/llvm-link/Makefile b/tools/llvm-link/Makefile new file mode 100644 index 00000000000..599d4cb965f --- /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 00000000000..8dbcf4895ce --- /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 +#include + + +cl::StringList InputFilenames("", "Load 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 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 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; +}