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