llvm-link.cpp revision 6bb69355d25be940824106eaa88783bf282db626
1bb37a69bfcf6ec663c84c3df9d77db39c46426a0Chris Lattner//===- llvm-link.cpp - Low-level LLVM linker ------------------------------===// 27c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// The LLVM Compiler Infrastructure 47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 57c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// This file was developed by the LLVM research group and is distributed under 67c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 77c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 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" 18075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner#include "llvm/Bytecode/Reader.h" 19075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner#include "llvm/Bytecode/Writer.h" 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h" 21bed85ff010b95923646ed4e187a5d432cedf67daChris Lattner#include "llvm/System/Signals.h" 226939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer#include "llvm/System/Path.h" 23cee8f9ae67104576b2028125b56e9ba4856a1d66Chris Lattner#include <fstream> 2486f42bdad93677fa0ca33b27afb0f493028376cbReid Spencer#include <iostream> 25075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner#include <memory> 26075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 295ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::list<std::string> 305ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerInputFilenames(cl::Positional, cl::OneOrMore, 3154e05afa3c1e8e2ac1580e25c49a7d1bc9377727Chris Lattner cl::desc("<input bytecode files>")); 325ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 335ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<std::string> 345ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Override output filename"), cl::init("-"), 355ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner cl::value_desc("filename")); 365ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 375ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> Force("f", cl::desc("Overwrite output files")); 385ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 395ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> 405ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerVerbose("v", cl::desc("Print information about actions taken")); 415ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 425ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> 435ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerDumpAsm("d", cl::desc("Print assembly as linked"), cl::Hidden); 445ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 454b5fdc71c91119793fed5cb69a520823d9d80f6aReid Spencerstatic cl::opt<bool> NoCompress("disable-compression", cl::init(false), 46ae70fedfab7f5243fae243cd86ffdad7ff23526cReid Spencer cl::desc("Don't ompress the generated bytecode")); 47ae70fedfab7f5243fae243cd86ffdad7ff23526cReid Spencer 48dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// LoadFile - Read the specified bytecode file in and return it. This routine 49dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// searches the link path for the specified file to try to find it... 50dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// 51dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencerstatic inline std::auto_ptr<Module> LoadFile(const std::string &FN) { 52dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer sys::Path Filename; 5307adb2836b8aa7a3872e33c285958f5937662b50Reid Spencer if (!Filename.setFile(FN)) { 54dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer std::cerr << "Invalid file name: '" << FN << "'\n"; 55dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer return std::auto_ptr<Module>(); 56dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer } 57952d365a3a446ebfbf14a8db27e26c5c2abec651Chris Lattner 586939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::string ErrorMessage; 596939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer if (Filename.exists()) { 60dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer if (Verbose) std::cerr << "Loading '" << Filename.c_str() << "'\n"; 616939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer Module* Result = ParseBytecodeFile(Filename.get(), &ErrorMessage); 62dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer if (Result) return std::auto_ptr<Module>(Result); // Load successful! 636939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer 646939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer if (Verbose) { 656939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::cerr << "Error opening bytecode file: '" << Filename.c_str() << "'"; 666939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer if (ErrorMessage.size()) std::cerr << ": " << ErrorMessage; 676939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::cerr << "\n"; 686939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer } 696939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer } else { 706939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::cerr << "Bytecode file: '" << Filename.c_str() 716939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer << "' does not exist.\n"; 726939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer } 7365be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner 7465be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner return std::auto_ptr<Module>(); 7565be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner} 76075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 77075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattnerint main(int argc, char **argv) { 785ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner cl::ParseCommandLineOptions(argc, argv, " llvm linker\n"); 799de7b334ec6f80a15f093f11b339f5741c964b34Reid Spencer sys::PrintStackTraceOnErrorSignal(); 80075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner assert(InputFilenames.size() > 0 && "OneOrMore is not working"); 81075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 8265be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner unsigned BaseArg = 0; 83697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner std::string ErrorMessage; 8465be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner 8565be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner std::auto_ptr<Module> Composite(LoadFile(InputFilenames[BaseArg])); 8648f44cf5b3717df78933f968424213f39f807997Chris Lattner if (Composite.get() == 0) { 8748f44cf5b3717df78933f968424213f39f807997Chris Lattner std::cerr << argv[0] << ": error loading file '" 8848f44cf5b3717df78933f968424213f39f807997Chris Lattner << InputFilenames[BaseArg] << "'\n"; 8948f44cf5b3717df78933f968424213f39f807997Chris Lattner return 1; 9048f44cf5b3717df78933f968424213f39f807997Chris Lattner } 9165be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner 9265be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) { 93697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner std::auto_ptr<Module> M(LoadFile(InputFilenames[i])); 9448f44cf5b3717df78933f968424213f39f807997Chris Lattner if (M.get() == 0) { 9548f44cf5b3717df78933f968424213f39f807997Chris Lattner std::cerr << argv[0] << ": error loading file '" 9648f44cf5b3717df78933f968424213f39f807997Chris Lattner << InputFilenames[i] << "'\n"; 9748f44cf5b3717df78933f968424213f39f807997Chris Lattner return 1; 9848f44cf5b3717df78933f968424213f39f807997Chris Lattner } 99b81adf14fbdf9d57b7101bbc710752f864f7ea21Chris Lattner 1006c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner if (Verbose) std::cerr << "Linking in '" << InputFilenames[i] << "'\n"; 101b81adf14fbdf9d57b7101bbc710752f864f7ea21Chris Lattner 102075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner if (LinkModules(Composite.get(), M.get(), &ErrorMessage)) { 1036939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::cerr << argv[0] << ": link error in '" << InputFilenames[i] 1046c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner << "': " << ErrorMessage << "\n"; 105075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner return 1; 106075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 107075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 108075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 1096939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer // TODO: Iterate over the -l list and link in any modules containing 1106939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer // global symbols that have not been resolved so far. 1116939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer 1126c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner if (DumpAsm) std::cerr << "Here's the assembly:\n" << Composite.get(); 113164cb69e045f91900410781605cff7e5594460f2Chris Lattner 114cf17bcc7e73cf9dc1c8c74dae50a6694fb124f0fAnand Shukla std::ostream *Out = &std::cout; // Default to printing to stdout... 1154a4dabaac05f06a94e1f537f3f987ce1bd9c96e1Chris Lattner if (OutputFilename != "-") { 116888912dbe01c715aa5a0ddec19da6ef12f382ebfChris Lattner if (!Force && std::ifstream(OutputFilename.c_str())) { 117697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner // If force is not specified, make sure not to overwrite a file! 1186c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner std::cerr << argv[0] << ": error opening '" << OutputFilename 1196c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner << "': file exists!\n" 1206c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner << "Use -f command line argument to force output\n"; 121697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return 1; 122697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner } 123697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner Out = new std::ofstream(OutputFilename.c_str()); 124075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner if (!Out->good()) { 1256c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner std::cerr << argv[0] << ": error opening '" << OutputFilename << "'!\n"; 126075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner return 1; 127075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 12876d12299b5333d71bfc079614031f97c97aa5148Chris Lattner 129452fea997232437902385e88366482b01957eeefMisha Brukman // Make sure that the Out file gets unlinked from the disk if we get a 13076d12299b5333d71bfc079614031f97c97aa5148Chris Lattner // SIGINT 131227b6d00dd1faee07c921c7e2256e0fca737d2e5Reid Spencer sys::RemoveFileOnSignal(sys::Path(OutputFilename)); 132075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 133075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 134a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner if (verifyModule(*Composite.get())) { 135a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner std::cerr << argv[0] << ": linked module is broken!\n"; 136a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner return 1; 137a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner } 138a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner 1396c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner if (Verbose) std::cerr << "Writing bytecode...\n"; 140ae70fedfab7f5243fae243cd86ffdad7ff23526cReid Spencer WriteBytecodeToFile(Composite.get(), *Out, !NoCompress); 141075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 142697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner if (Out != &std::cout) delete Out; 143075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner return 0; 144075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner} 145