diff options
author | Chris Lattner <sabre@nondot.org> | 2001-10-24 06:23:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-10-24 06:23:00 +0000 |
commit | 65be321fdb92cb8330a22db6a16d5e8b0f3ec165 (patch) | |
tree | c1b76477cdd2f2962ff298b25b457ebc1f5ebc8f /tools/llvm-link | |
parent | f038acbee21cfed998451aedd00a81901d299516 (diff) |
Implement a -L command line argument to specify a search path. Implement minimal ar compatibility stuff
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@975 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-link')
-rw-r--r-- | tools/llvm-link/llvm-link.cpp | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp index 0ae39228d9..7aa8a04076 100644 --- a/tools/llvm-link/llvm-link.cpp +++ b/tools/llvm-link/llvm-link.cpp @@ -5,7 +5,7 @@ // link a.bc b.bc c.bc -o x.bc // // Alternatively, this can be used as an 'ar' tool as well. If invoked as -// either 'ar' or 'llvm-ar', it accepts a 'cr' parameter as well. +// either 'ar' or 'llvm-ar', it accepts a 'rc' parameter as well. // //===----------------------------------------------------------------------===// @@ -26,34 +26,53 @@ cl::String OutputFilename("o", "Override output filename", cl::NoFlags, "-"); cl::Flag Force ("f", "Overwrite output files", cl::NoFlags, false); cl::Flag Verbose ("v", "Print information about actions taken"); cl::Flag DumpAsm ("d", "Print assembly as linked", cl::Hidden, false); +cl::StringList LibPaths ("L", "Specify a library search path", cl::ZeroOrMore); +static inline std::auto_ptr<Module> LoadFile(const string &FN) { + string Filename = FN; + string ErrorMessage; + + unsigned NextLibPathIdx = 0; + + while (1) { + if (Verbose) cerr << "Loading '" << Filename << "'\n"; + Module *Result = ParseBytecodeFile(Filename, &ErrorMessage); + if (Result) return std::auto_ptr<Module>(Result); // Load successful! + + if (Verbose) { + cerr << "Error opening bytecode file: '" << Filename << "'"; + if (ErrorMessage.size()) cerr << ": " << ErrorMessage; + cerr << endl; + } + + if (NextLibPathIdx == LibPaths.size()) break; + Filename = LibPaths[NextLibPathIdx++] + "/" + FN; + } + + cerr << "Could not locate bytecode file: '" << FN << "'\n"; + return std::auto_ptr<Module>(); +} int main(int argc, char **argv) { cl::ParseCommandLineOptions(argc, argv, " llvm linker\n"); assert(InputFilenames.size() > 0 && "OneOrMore is not working"); - // TODO: TEST argv[0] + unsigned BaseArg = 0; string ErrorMessage; - - if (Verbose) cerr << "Loading '" << InputFilenames[0] << "'\n"; - std::auto_ptr<Module> Composite(ParseBytecodeFile(InputFilenames[0], - &ErrorMessage)); - if (Composite.get() == 0) { - cerr << "Error opening bytecode file: '" << InputFilenames[0] << "'"; - if (ErrorMessage.size()) cerr << ": " << ErrorMessage; - cerr << endl; - return 1; + + // TODO: TEST argv[0] for llvm-ar forms... for now, this is a huge hack. + if (InputFilenames.size() >= 3 && InputFilenames[0] == "rc" && + OutputFilename == "-") { + BaseArg = 2; + OutputFilename = InputFilenames[1]; } - for (unsigned i = 1; i < InputFilenames.size(); ++i) { - if (Verbose) cerr << "Loading '" << InputFilenames[i] << "'\n"; - auto_ptr<Module> M(ParseBytecodeFile(InputFilenames[i], &ErrorMessage)); - if (M.get() == 0) { - cerr << "Error opening bytecode file: '" << InputFilenames[i] << "'"; - if (ErrorMessage.size()) cerr << ": " << ErrorMessage; - cerr << endl; - return 1; - } + std::auto_ptr<Module> Composite(LoadFile(InputFilenames[BaseArg])); + if (Composite.get() == 0) return 1; + + for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) { + auto_ptr<Module> M(LoadFile(InputFilenames[i])); + if (M.get() == 0) return 1; if (Verbose) cerr << "Linking in '" << InputFilenames[i] << "'\n"; |