llvm-link.cpp revision cc14d25dd99e891c586bd56aa41796abbe4ac3d8
1bb37a69bfcf6ec663c84c3df9d77db39c46426a0Chris Lattner//===- llvm-link.cpp - Low-level LLVM linker ------------------------------===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// The LLVM Compiler Infrastructure 47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source 621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===// 9075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner// 10075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner// This utility may be invoked in the following manner: 113ef3beb1d79f8f05fa55dac2c2f58822bad5e348Misha Brukman// llvm-link a.bc b.bc c.bc -o x.bc 12075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner// 13075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner//===----------------------------------------------------------------------===// 14075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 156bb69355d25be940824106eaa88783bf282db626Reid Spencer#include "llvm/Linker.h" 16a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner#include "llvm/Module.h" 17a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner#include "llvm/Analysis/Verifier.h" 18c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner#include "llvm/Bitcode/ReaderWriter.h" 19551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h" 20c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h" 21c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner#include "llvm/Support/MemoryBuffer.h" 22cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner#include "llvm/Support/PrettyStackTrace.h" 23ee335e35acf20d1ed5b781546d647c19b608890eDan Gohman#include "llvm/Support/Streams.h" 24bed85ff010b95923646ed4e187a5d432cedf67daChris Lattner#include "llvm/System/Signals.h" 256939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer#include "llvm/System/Path.h" 26cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include <fstream> 2786f42bdad93677fa0ca33b27afb0f493028376cbReid Spencer#include <iostream> 28075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner#include <memory> 29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 30d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 315ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::list<std::string> 325ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerInputFilenames(cl::Positional, cl::OneOrMore, 33a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif cl::desc("<input bitcode files>")); 345ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 355ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<std::string> 365ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Override output filename"), cl::init("-"), 375ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner cl::value_desc("filename")); 385ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 395ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> Force("f", cl::desc("Overwrite output files")); 405ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 415ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> 425ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerVerbose("v", cl::desc("Print information about actions taken")); 435ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 445ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> 455ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerDumpAsm("d", cl::desc("Print assembly as linked"), cl::Hidden); 465ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 47a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif// LoadFile - Read the specified bitcode file in and return it. This routine 48dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// searches the link path for the specified file to try to find it... 49dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// 50dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencerstatic inline std::auto_ptr<Module> LoadFile(const std::string &FN) { 51dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer sys::Path Filename; 52dd04df0ec33a903ee7fc747701bafde622f77d8bReid Spencer if (!Filename.set(FN)) { 53e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << "Invalid file name: '" << FN << "'\n"; 54dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer return std::auto_ptr<Module>(); 55dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer } 56952d365a3a446ebfbf14a8db27e26c5c2abec651Chris Lattner 576939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::string ErrorMessage; 586939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer if (Filename.exists()) { 59e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling if (Verbose) cerr << "Loading '" << Filename.c_str() << "'\n"; 60c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner Module* Result = 0; 61c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 6244dadffe4bd58ab32961ca5fe537e8ba69c09243Chris Lattner const std::string &FNStr = Filename.toString(); 63065344dfd5a7b3502098810b981eb0077e5d81f3Chris Lattner if (MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(FNStr, 64065344dfd5a7b3502098810b981eb0077e5d81f3Chris Lattner &ErrorMessage)) { 6544dadffe4bd58ab32961ca5fe537e8ba69c09243Chris Lattner Result = ParseBitcodeFile(Buffer, &ErrorMessage); 66065344dfd5a7b3502098810b981eb0077e5d81f3Chris Lattner delete Buffer; 67065344dfd5a7b3502098810b981eb0077e5d81f3Chris Lattner } 68dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer if (Result) return std::auto_ptr<Module>(Result); // Load successful! 696939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer 706939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer if (Verbose) { 71a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif cerr << "Error opening bitcode file: '" << Filename.c_str() << "'"; 72e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling if (ErrorMessage.size()) cerr << ": " << ErrorMessage; 73e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << "\n"; 746939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer } 756939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer } else { 76a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif cerr << "Bitcode file: '" << Filename.c_str() << "' does not exist.\n"; 776939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer } 7865be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner 7965be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner return std::auto_ptr<Module>(); 8065be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner} 81075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 82075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattnerint main(int argc, char **argv) { 83cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner // Print a stack trace if we signal out. 84c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner sys::PrintStackTraceOnErrorSignal(); 85cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner PrettyStackTraceProgram X(argc, argv); 86cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner 87cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 88cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner cl::ParseCommandLineOptions(argc, argv, "llvm linker\n"); 89b81adf14fbdf9d57b7101bbc710752f864f7ea21Chris Lattner 90c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner unsigned BaseArg = 0; 91c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner std::string ErrorMessage; 921ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer 93c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner std::auto_ptr<Module> Composite(LoadFile(InputFilenames[BaseArg])); 94c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (Composite.get() == 0) { 95c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner cerr << argv[0] << ": error loading file '" 96c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner << InputFilenames[BaseArg] << "'\n"; 97c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 1; 98c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner } 991ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer 100c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) { 101c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner std::auto_ptr<Module> M(LoadFile(InputFilenames[i])); 102c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (M.get() == 0) { 103c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner cerr << argv[0] << ": error loading file '" <<InputFilenames[i]<< "'\n"; 104c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 1; 105075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 1066939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer 107c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (Verbose) cerr << "Linking in '" << InputFilenames[i] << "'\n"; 108c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 109c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (Linker::LinkModules(Composite.get(), M.get(), &ErrorMessage)) { 110c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner cerr << argv[0] << ": link error in '" << InputFilenames[i] 111c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner << "': " << ErrorMessage << "\n"; 112c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 1; 113697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner } 114c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner } 115c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 116c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner // TODO: Iterate over the -l list and link in any modules containing 117c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner // global symbols that have not been resolved so far. 1181ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer 119c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (DumpAsm) cerr << "Here's the assembly:\n" << *Composite.get(); 120c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 121c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner // FIXME: cout is not binary! 122c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner std::ostream *Out = &std::cout; // Default to printing to stdout... 123c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (OutputFilename != "-") { 124c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (!Force && std::ifstream(OutputFilename.c_str())) { 125c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner // If force is not specified, make sure not to overwrite a file! 126c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner cerr << argv[0] << ": error opening '" << OutputFilename 127c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner << "': file exists!\n" 128c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner << "Use -f command line argument to force output\n"; 129c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 1; 130c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner } 131c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner std::ios::openmode io_mode = std::ios::out | std::ios::trunc | 132c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner std::ios::binary; 133c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner Out = new std::ofstream(OutputFilename.c_str(), io_mode); 134c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (!Out->good()) { 135c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner cerr << argv[0] << ": error opening '" << OutputFilename << "'!\n"; 136075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner return 1; 137075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 13876d12299b5333d71bfc079614031f97c97aa5148Chris Lattner 139c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner // Make sure that the Out file gets unlinked from the disk if we get a 140c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner // SIGINT 141c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner sys::RemoveFileOnSignal(sys::Path(OutputFilename)); 142c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner } 143c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 144c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (verifyModule(*Composite.get())) { 145c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner cerr << argv[0] << ": linked module is broken!\n"; 146c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 1; 147c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner } 148c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 149a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif if (Verbose) cerr << "Writing bitcode...\n"; 15044dadffe4bd58ab32961ca5fe537e8ba69c09243Chris Lattner WriteBitcodeToFile(Composite.get(), *Out); 151c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 152c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner if (Out != &std::cout) delete Out; 153c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 0; 154075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner} 155