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 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Linker/Linker.h" 16c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner#include "llvm/Bitcode/ReaderWriter.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Verifier.h" 207fc162f893d67ffd96fdb19e2eb9a03b4621f0c0Chandler Carruth#include "llvm/IRReader/IRReader.h" 21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h" 22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/FileSystem.h" 23c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h" 24f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/Path.h" 25cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner#include "llvm/Support/PrettyStackTrace.h" 261f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Signals.h" 277fc162f893d67ffd96fdb19e2eb9a03b4621f0c0Chandler Carruth#include "llvm/Support/SourceMgr.h" 28f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/SystemUtils.h" 29f010c464a11444733ec67e31aace8bcebeaf2588Chandler Carruth#include "llvm/Support/ToolOutputFile.h" 30075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner#include <memory> 31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 32d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 335ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::list<std::string> 345ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerInputFilenames(cl::Positional, cl::OneOrMore, 35a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif cl::desc("<input bitcode files>")); 365ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 375ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<std::string> 385ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Override output filename"), cl::init("-"), 395ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner cl::value_desc("filename")); 405ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 41baa26395ccf17fc988bb9cf62d6659ca8415ece9Dan Gohmanstatic cl::opt<bool> 42baa26395ccf17fc988bb9cf62d6659ca8415ece9Dan GohmanForce("f", cl::desc("Enable binary output on terminals")); 435ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 445ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> 45a93f30ee65e2fa48c8caff7d5c3052559b0829fbDan GohmanOutputAssembly("S", 46a93f30ee65e2fa48c8caff7d5c3052559b0829fbDan Gohman cl::desc("Write output as LLVM assembly"), cl::Hidden); 47a93f30ee65e2fa48c8caff7d5c3052559b0829fbDan Gohman 48a93f30ee65e2fa48c8caff7d5c3052559b0829fbDan Gohmanstatic cl::opt<bool> 495ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerVerbose("v", cl::desc("Print information about actions taken")); 505ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 515ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool> 525ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerDumpAsm("d", cl::desc("Print assembly as linked"), cl::Hidden); 535ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic cl::opt<bool> 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesSuppressWarnings("suppress-warnings", cl::desc("Suppress all linking warnings"), 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cl::init(false)); 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 58a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif// LoadFile - Read the specified bitcode file in and return it. This routine 59dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// searches the link path for the specified file to try to find it... 60dccc01eb61e8748ac8e40e372ed8d35b32fd84bdReid Spencer// 61604b3573f955d61ba87215c25ba2f52477c71eccAndy Gibbsstatic inline Module *LoadFile(const char *argv0, const std::string &FN, 62604b3573f955d61ba87215c25ba2f52477c71eccAndy Gibbs LLVMContext& Context) { 63d624154034e0a6d861ecbcfa297c10f7a178183aDan Gohman SMDiagnostic Err; 64d5bf07b4667c7381fcd375b186e95436b32b90e6Rafael Espindola if (Verbose) errs() << "Loading '" << FN << "'\n"; 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Module* Result = nullptr; 66d5bf07b4667c7381fcd375b186e95436b32b90e6Rafael Espindola 67d5bf07b4667c7381fcd375b186e95436b32b90e6Rafael Espindola Result = ParseIRFile(FN, Err, Context); 68604b3573f955d61ba87215c25ba2f52477c71eccAndy Gibbs if (Result) return Result; // Load successful! 6965be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner 70d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner Err.print(argv0, errs()); 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 7265be321fdb92cb8330a22db6a16d5e8b0f3ec165Chris Lattner} 73075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner 74075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattnerint main(int argc, char **argv) { 75cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner // Print a stack trace if we signal out. 76c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner sys::PrintStackTraceOnErrorSignal(); 77cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner PrettyStackTraceProgram X(argc, argv); 782cccc6220cc351b52d2cd2d0b7139502e854b68dAndrew Trick 790d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson LLVMContext &Context = getGlobalContext(); 80cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 81cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner cl::ParseCommandLineOptions(argc, argv, "llvm linker\n"); 82b81adf14fbdf9d57b7101bbc710752f864f7ea21Chris Lattner 83c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner unsigned BaseArg = 0; 84c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner std::string ErrorMessage; 851ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<Module> Composite( 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LoadFile(argv[0], InputFilenames[BaseArg], Context)); 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Composite.get()) { 89ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman errs() << argv[0] << ": error loading file '" 90ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << InputFilenames[BaseArg] << "'\n"; 91c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 1; 92c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner } 931ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Linker L(Composite.get(), SuppressWarnings); 95c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) { 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<Module> M(LoadFile(argv[0], InputFilenames[i], Context)); 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!M.get()) { 98ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman errs() << argv[0] << ": error loading file '" <<InputFilenames[i]<< "'\n"; 99c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 1; 100075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner } 1016939f8141ce40c5bf1ed5958abe29cc31919464cReid Spencer 102ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman if (Verbose) errs() << "Linking in '" << InputFilenames[i] << "'\n"; 103c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 104c1685b3a5052de377735f69e53e50741dbe5b52aRafael Espindola if (L.linkInModule(M.get(), &ErrorMessage)) { 105ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman errs() << argv[0] << ": link error in '" << InputFilenames[i] 106ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman << "': " << ErrorMessage << "\n"; 107c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 1; 108697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner } 109c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner } 110c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 111a93f30ee65e2fa48c8caff7d5c3052559b0829fbDan Gohman if (DumpAsm) errs() << "Here's the assembly:\n" << *Composite; 112c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 11351a1132403da7c4e8a57369815596c8d485f5db2Chris Lattner std::string ErrorInfo; 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines tool_output_file Out(OutputFilename.c_str(), ErrorInfo, sys::fs::F_None); 11551a1132403da7c4e8a57369815596c8d485f5db2Chris Lattner if (!ErrorInfo.empty()) { 11651a1132403da7c4e8a57369815596c8d485f5db2Chris Lattner errs() << ErrorInfo << '\n'; 11751a1132403da7c4e8a57369815596c8d485f5db2Chris Lattner return 1; 11851a1132403da7c4e8a57369815596c8d485f5db2Chris Lattner } 11976d12299b5333d71bfc079614031f97c97aa5148Chris Lattner 120a93f30ee65e2fa48c8caff7d5c3052559b0829fbDan Gohman if (verifyModule(*Composite)) { 121ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman errs() << argv[0] << ": linked module is broken!\n"; 122c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 1; 123c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner } 124c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 125ac95cc79ac0b899d566cc29c0f646f39c2fa35c0Dan Gohman if (Verbose) errs() << "Writing bitcode...\n"; 126a93f30ee65e2fa48c8caff7d5c3052559b0829fbDan Gohman if (OutputAssembly) { 127d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman Out.os() << *Composite; 128d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman } else if (Force || !CheckBitcodeOutputToConsole(Out.os(), true)) 129d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman WriteBitcodeToFile(Composite.get(), Out.os()); 1302df9504fec1ddf198321c7fe8c968154b4edbff3Dan Gohman 1312df9504fec1ddf198321c7fe8c968154b4edbff3Dan Gohman // Declare success. 1322df9504fec1ddf198321c7fe8c968154b4edbff3Dan Gohman Out.keep(); 133c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner 134c48e1db2140b3565ef3dea58699a09c5abf36f7fChris Lattner return 0; 135075a0b771e1d76ce64f4628b7a680ef6a0486a4bChris Lattner} 136