From 075a0b771e1d76ce64f4628b7a680ef6a0486a4b Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 13 Oct 2001 07:06:23 +0000 Subject: [PATCH] Add new linker git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@780 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/link/Makefile | 6 ++++ tools/link/link.cpp | 64 +++++++++++++++++++++++++++++++++++ tools/llvm-link/Makefile | 6 ++++ tools/llvm-link/llvm-link.cpp | 64 +++++++++++++++++++++++++++++++++++ 4 files changed, 140 insertions(+) create mode 100644 tools/link/Makefile create mode 100644 tools/link/link.cpp create mode 100644 tools/llvm-link/Makefile create mode 100644 tools/llvm-link/llvm-link.cpp 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; +}