llvm-link.cpp revision 48f44cf5b3717df78933f968424213f39f807997
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 15a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner#include "llvm/Module.h" 16a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner#include "llvm/Analysis/Verifier.h" 17075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner#include "llvm/Bytecode/Reader.h" 18075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner#include "llvm/Bytecode/Writer.h" 19008248f2c098f7680b5b393d6e3006cd7d974b77Misha Brukman#include "llvm/Support/Linker.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 45dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// LoadFile - Read the specified bytecode file in and return it. This routine 46dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// searches the link path for the specified file to try to find it... 47dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// 48dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencerstatic inline std::auto_ptr<Module> LoadFile(const std::string &FN) { 49dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer sys::Path Filename; 50dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer if (!Filename.set_file(FN)) { 51dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer std::cerr << "Invalid file name: '" << FN << "'\n"; 52dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer return std::auto_ptr<Module>(); 53dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer } 54952d365a3a446ebfbf14a8db27e26c5c2abec651Chris Lattner 556939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::string ErrorMessage; 566939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer if (Filename.exists()) { 57dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer if (Verbose) std::cerr << "Loading '" << Filename.c_str() << "'\n"; 586939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer Module* Result = ParseBytecodeFile(Filename.get(), &ErrorMessage); 59dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer if (Result) return std::auto_ptr<Module>(Result); // Load successful! 606939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer 616939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer if (Verbose) { 626939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::cerr << "Error opening bytecode file: '" << Filename.c_str() << "'"; 636939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer if (ErrorMessage.size()) std::cerr << ": " << ErrorMessage; 646939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::cerr << "\n"; 656939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer } 666939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer } else { 676939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::cerr << "Bytecode file: '" << Filename.c_str() 686939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer << "' does not exist.\n"; 696939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer } 7065be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner 7165be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner return std::auto_ptr<Module>(); 7265be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner} 73075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 74075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattnerint main(int argc, char **argv) { 755ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner cl::ParseCommandLineOptions(argc, argv, " llvm linker\n"); 769de7b334ec6f80a15f093f11b339f5741c964b34Reid Spencer sys::PrintStackTraceOnErrorSignal(); 77075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner assert(InputFilenames.size() > 0 && "OneOrMore is not working"); 78075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 7965be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner unsigned BaseArg = 0; 80697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner std::string ErrorMessage; 8165be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner 8265be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner std::auto_ptr<Module> Composite(LoadFile(InputFilenames[BaseArg])); 8348f44cf5b3717df78933f968424213f39f807997Chris Lattner if (Composite.get() == 0) { 8448f44cf5b3717df78933f968424213f39f807997Chris Lattner std::cerr << argv[0] << ": error loading file '" 8548f44cf5b3717df78933f968424213f39f807997Chris Lattner << InputFilenames[BaseArg] << "'\n"; 8648f44cf5b3717df78933f968424213f39f807997Chris Lattner return 1; 8748f44cf5b3717df78933f968424213f39f807997Chris Lattner } 8865be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner 8965be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) { 90697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner std::auto_ptr<Module> M(LoadFile(InputFilenames[i])); 9148f44cf5b3717df78933f968424213f39f807997Chris Lattner if (M.get() == 0) { 9248f44cf5b3717df78933f968424213f39f807997Chris Lattner std::cerr << argv[0] << ": error loading file '" 9348f44cf5b3717df78933f968424213f39f807997Chris Lattner << InputFilenames[i] << "'\n"; 9448f44cf5b3717df78933f968424213f39f807997Chris Lattner return 1; 9548f44cf5b3717df78933f968424213f39f807997Chris Lattner } 96b81adf14fbdf9d57b7101bbc710752f864f7ea21Chris Lattner 976c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner if (Verbose) std::cerr << "Linking in '" << InputFilenames[i] << "'\n"; 98b81adf14fbdf9d57b7101bbc710752f864f7ea21Chris Lattner 99075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner if (LinkModules(Composite.get(), M.get(), &ErrorMessage)) { 1006939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer std::cerr << argv[0] << ": link error in '" << InputFilenames[i] 1016c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner << "': " << ErrorMessage << "\n"; 102075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner return 1; 103075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 104075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 105075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 1066939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer // TODO: Iterate over the -l list and link in any modules containing 1076939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer // global symbols that have not been resolved so far. 1086939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer 1096c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner if (DumpAsm) std::cerr << "Here's the assembly:\n" << Composite.get(); 110164cb69e045f91900410781605cff7e5594460f2Chris Lattner 111cf17bcc7e73cf9dc1c8c74dae50a6694fb124f0fAnand Shukla std::ostream *Out = &std::cout; // Default to printing to stdout... 1124a4dabaac05f06a94e1f537f3f987ce1bd9c96e1Chris Lattner if (OutputFilename != "-") { 113888912dbe01c715aa5a0ddec19da6ef12f382ebfChris Lattner if (!Force && std::ifstream(OutputFilename.c_str())) { 114697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner // If force is not specified, make sure not to overwrite a file! 1156c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner std::cerr << argv[0] << ": error opening '" << OutputFilename 1166c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner << "': file exists!\n" 1176c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner << "Use -f command line argument to force output\n"; 118697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return 1; 119697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner } 120697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner Out = new std::ofstream(OutputFilename.c_str()); 121075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner if (!Out->good()) { 1226c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner std::cerr << argv[0] << ": error opening '" << OutputFilename << "'!\n"; 123075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner return 1; 124075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 12576d12299b5333d71bfc079614031f97c97aa5148Chris Lattner 126452fea997232437902385e88366482b01957eeefMisha Brukman // Make sure that the Out file gets unlinked from the disk if we get a 12776d12299b5333d71bfc079614031f97c97aa5148Chris Lattner // SIGINT 1289de7b334ec6f80a15f093f11b339f5741c964b34Reid Spencer sys::RemoveFileOnSignal(OutputFilename); 129075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 130075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 131a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner if (verifyModule(*Composite.get())) { 132a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner std::cerr << argv[0] << ": linked module is broken!\n"; 133a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner return 1; 134a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner } 135a55c4b1ce71bf62b669d5e533544a29739d56a98Chris Lattner 1366c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattner if (Verbose) std::cerr << "Writing bytecode...\n"; 137075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner WriteBytecodeToFile(Composite.get(), *Out); 138075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 139697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner if (Out != &std::cout) delete Out; 140075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner return 0; 141075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner} 142