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