Home | History | Annotate | Download | only in llvm-link
      1 //===- llvm-link.cpp - Low-level LLVM linker ------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This utility may be invoked in the following manner:
     11 //  llvm-link a.bc b.bc c.bc -o x.bc
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "llvm/Linker/Linker.h"
     16 #include "llvm/ADT/STLExtras.h"
     17 #include "llvm/Bitcode/ReaderWriter.h"
     18 #include "llvm/IR/AutoUpgrade.h"
     19 #include "llvm/IR/DiagnosticInfo.h"
     20 #include "llvm/IR/DiagnosticPrinter.h"
     21 #include "llvm/IR/FunctionInfo.h"
     22 #include "llvm/IR/LLVMContext.h"
     23 #include "llvm/IR/Module.h"
     24 #include "llvm/IR/Verifier.h"
     25 #include "llvm/IRReader/IRReader.h"
     26 #include "llvm/Object/FunctionIndexObjectFile.h"
     27 #include "llvm/Support/CommandLine.h"
     28 #include "llvm/Support/FileSystem.h"
     29 #include "llvm/Support/ManagedStatic.h"
     30 #include "llvm/Support/Path.h"
     31 #include "llvm/Support/PrettyStackTrace.h"
     32 #include "llvm/Support/Signals.h"
     33 #include "llvm/Support/SourceMgr.h"
     34 #include "llvm/Support/SystemUtils.h"
     35 #include "llvm/Support/ToolOutputFile.h"
     36 #include <memory>
     37 using namespace llvm;
     38 
     39 static cl::list<std::string>
     40 InputFilenames(cl::Positional, cl::OneOrMore,
     41                cl::desc("<input bitcode files>"));
     42 
     43 static cl::list<std::string> OverridingInputs(
     44     "override", cl::ZeroOrMore, cl::value_desc("filename"),
     45     cl::desc(
     46         "input bitcode file which can override previously defined symbol(s)"));
     47 
     48 // Option to simulate function importing for testing. This enables using
     49 // llvm-link to simulate ThinLTO backend processes.
     50 static cl::list<std::string> Imports(
     51     "import", cl::ZeroOrMore, cl::value_desc("function:filename"),
     52     cl::desc("Pair of function name and filename, where function should be "
     53              "imported from bitcode in filename"));
     54 
     55 // Option to support testing of function importing. The function index
     56 // must be specified in the case were we request imports via the -import
     57 // option, as well as when compiling any module with functions that may be
     58 // exported (imported by a different llvm-link -import invocation), to ensure
     59 // consistent promotion and renaming of locals.
     60 static cl::opt<std::string> FunctionIndex("functionindex",
     61                                           cl::desc("Function index filename"),
     62                                           cl::init(""),
     63                                           cl::value_desc("filename"));
     64 
     65 static cl::opt<std::string>
     66 OutputFilename("o", cl::desc("Override output filename"), cl::init("-"),
     67                cl::value_desc("filename"));
     68 
     69 static cl::opt<bool>
     70 Internalize("internalize", cl::desc("Internalize linked symbols"));
     71 
     72 static cl::opt<bool>
     73 OnlyNeeded("only-needed", cl::desc("Link only needed symbols"));
     74 
     75 static cl::opt<bool>
     76 Force("f", cl::desc("Enable binary output on terminals"));
     77 
     78 static cl::opt<bool>
     79 OutputAssembly("S",
     80          cl::desc("Write output as LLVM assembly"), cl::Hidden);
     81 
     82 static cl::opt<bool>
     83 Verbose("v", cl::desc("Print information about actions taken"));
     84 
     85 static cl::opt<bool>
     86 DumpAsm("d", cl::desc("Print assembly as linked"), cl::Hidden);
     87 
     88 static cl::opt<bool>
     89 SuppressWarnings("suppress-warnings", cl::desc("Suppress all linking warnings"),
     90                  cl::init(false));
     91 
     92 static cl::opt<bool>
     93     PreserveModules("preserve-modules",
     94                     cl::desc("Preserve linked modules for testing"));
     95 
     96 static cl::opt<bool> PreserveBitcodeUseListOrder(
     97     "preserve-bc-uselistorder",
     98     cl::desc("Preserve use-list order when writing LLVM bitcode."),
     99     cl::init(true), cl::Hidden);
    100 
    101 static cl::opt<bool> PreserveAssemblyUseListOrder(
    102     "preserve-ll-uselistorder",
    103     cl::desc("Preserve use-list order when writing LLVM assembly."),
    104     cl::init(false), cl::Hidden);
    105 
    106 // Read the specified bitcode file in and return it. This routine searches the
    107 // link path for the specified file to try to find it...
    108 //
    109 static std::unique_ptr<Module> loadFile(const char *argv0,
    110                                         const std::string &FN,
    111                                         LLVMContext &Context,
    112                                         bool MaterializeMetadata = true) {
    113   SMDiagnostic Err;
    114   if (Verbose) errs() << "Loading '" << FN << "'\n";
    115   std::unique_ptr<Module> Result =
    116       getLazyIRFileModule(FN, Err, Context, !MaterializeMetadata);
    117   if (!Result)
    118     Err.print(argv0, errs());
    119 
    120   if (MaterializeMetadata) {
    121     Result->materializeMetadata();
    122     UpgradeDebugInfo(*Result);
    123   }
    124 
    125   return Result;
    126 }
    127 
    128 static void diagnosticHandler(const DiagnosticInfo &DI) {
    129   unsigned Severity = DI.getSeverity();
    130   switch (Severity) {
    131   case DS_Error:
    132     errs() << "ERROR: ";
    133     break;
    134   case DS_Warning:
    135     if (SuppressWarnings)
    136       return;
    137     errs() << "WARNING: ";
    138     break;
    139   case DS_Remark:
    140   case DS_Note:
    141     llvm_unreachable("Only expecting warnings and errors");
    142   }
    143 
    144   DiagnosticPrinterRawOStream DP(errs());
    145   DI.print(DP);
    146   errs() << '\n';
    147 }
    148 
    149 static void diagnosticHandlerWithContext(const DiagnosticInfo &DI, void *C) {
    150   diagnosticHandler(DI);
    151 }
    152 
    153 /// Import any functions requested via the -import option.
    154 static bool importFunctions(const char *argv0, LLVMContext &Context,
    155                             Linker &L) {
    156   StringMap<std::unique_ptr<DenseMap<unsigned, MDNode *>>>
    157       ModuleToTempMDValsMap;
    158   for (const auto &Import : Imports) {
    159     // Identify the requested function and its bitcode source file.
    160     size_t Idx = Import.find(':');
    161     if (Idx == std::string::npos) {
    162       errs() << "Import parameter bad format: " << Import << "\n";
    163       return false;
    164     }
    165     std::string FunctionName = Import.substr(0, Idx);
    166     std::string FileName = Import.substr(Idx + 1, std::string::npos);
    167 
    168     // Load the specified source module.
    169     std::unique_ptr<Module> M = loadFile(argv0, FileName, Context, false);
    170     if (!M.get()) {
    171       errs() << argv0 << ": error loading file '" << FileName << "'\n";
    172       return false;
    173     }
    174 
    175     if (verifyModule(*M, &errs())) {
    176       errs() << argv0 << ": " << FileName
    177              << ": error: input module is broken!\n";
    178       return false;
    179     }
    180 
    181     Function *F = M->getFunction(FunctionName);
    182     if (!F) {
    183       errs() << "Ignoring import request for non-existent function "
    184              << FunctionName << " from " << FileName << "\n";
    185       continue;
    186     }
    187     // We cannot import weak_any functions without possibly affecting the
    188     // order they are seen and selected by the linker, changing program
    189     // semantics.
    190     if (F->hasWeakAnyLinkage()) {
    191       errs() << "Ignoring import request for weak-any function " << FunctionName
    192              << " from " << FileName << "\n";
    193       continue;
    194     }
    195 
    196     if (Verbose)
    197       errs() << "Importing " << FunctionName << " from " << FileName << "\n";
    198 
    199     std::unique_ptr<FunctionInfoIndex> Index;
    200     if (!FunctionIndex.empty()) {
    201       ErrorOr<std::unique_ptr<FunctionInfoIndex>> IndexOrErr =
    202           llvm::getFunctionIndexForFile(FunctionIndex, diagnosticHandler);
    203       std::error_code EC = IndexOrErr.getError();
    204       if (EC) {
    205         errs() << EC.message() << '\n';
    206         return false;
    207       }
    208       Index = std::move(IndexOrErr.get());
    209     }
    210 
    211     // Save the mapping of value ids to temporary metadata created when
    212     // importing this function. If we have already imported from this module,
    213     // add new temporary metadata to the existing mapping.
    214     auto &TempMDVals = ModuleToTempMDValsMap[FileName];
    215     if (!TempMDVals)
    216       TempMDVals = llvm::make_unique<DenseMap<unsigned, MDNode *>>();
    217 
    218     // Link in the specified function.
    219     DenseSet<const GlobalValue *> FunctionsToImport;
    220     FunctionsToImport.insert(F);
    221     if (L.linkInModule(std::move(M), Linker::Flags::None, Index.get(),
    222                        &FunctionsToImport, TempMDVals.get()))
    223       return false;
    224   }
    225 
    226   // Now link in metadata for all modules from which we imported functions.
    227   for (StringMapEntry<std::unique_ptr<DenseMap<unsigned, MDNode *>>> &SME :
    228        ModuleToTempMDValsMap) {
    229     // Load the specified source module.
    230     std::unique_ptr<Module> M = loadFile(argv0, SME.getKey(), Context, true);
    231     if (!M.get()) {
    232       errs() << argv0 << ": error loading file '" << SME.getKey() << "'\n";
    233       return false;
    234     }
    235 
    236     if (verifyModule(*M, &errs())) {
    237       errs() << argv0 << ": " << SME.getKey()
    238              << ": error: input module is broken!\n";
    239       return false;
    240     }
    241 
    242     // Link in all necessary metadata from this module.
    243     if (L.linkInMetadata(*M, SME.getValue().get()))
    244       return false;
    245   }
    246   return true;
    247 }
    248 
    249 static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L,
    250                       const cl::list<std::string> &Files,
    251                       unsigned Flags) {
    252   // Filter out flags that don't apply to the first file we load.
    253   unsigned ApplicableFlags = Flags & Linker::Flags::OverrideFromSrc;
    254   for (const auto &File : Files) {
    255     std::unique_ptr<Module> M = loadFile(argv0, File, Context);
    256     if (!M.get()) {
    257       errs() << argv0 << ": error loading file '" << File << "'\n";
    258       return false;
    259     }
    260 
    261     if (verifyModule(*M, &errs())) {
    262       errs() << argv0 << ": " << File << ": error: input module is broken!\n";
    263       return false;
    264     }
    265 
    266     // If a function index is supplied, load it so linkInModule can treat
    267     // local functions/variables as exported and promote if necessary.
    268     std::unique_ptr<FunctionInfoIndex> Index;
    269     if (!FunctionIndex.empty()) {
    270       ErrorOr<std::unique_ptr<FunctionInfoIndex>> IndexOrErr =
    271           llvm::getFunctionIndexForFile(FunctionIndex, diagnosticHandler);
    272       std::error_code EC = IndexOrErr.getError();
    273       if (EC) {
    274         errs() << EC.message() << '\n';
    275         return false;
    276       }
    277       Index = std::move(IndexOrErr.get());
    278     }
    279 
    280     if (Verbose)
    281       errs() << "Linking in '" << File << "'\n";
    282 
    283     if (L.linkInModule(std::move(M), ApplicableFlags, Index.get()))
    284       return false;
    285     // All linker flags apply to linking of subsequent files.
    286     ApplicableFlags = Flags;
    287 
    288     // If requested for testing, preserve modules by releasing them from
    289     // the unique_ptr before the are freed. This can help catch any
    290     // cross-module references from e.g. unneeded metadata references
    291     // that aren't properly set to null but instead mapped to the source
    292     // module version. The bitcode writer will assert if it finds any such
    293     // cross-module references.
    294     if (PreserveModules)
    295       M.release();
    296   }
    297 
    298   return true;
    299 }
    300 
    301 int main(int argc, char **argv) {
    302   // Print a stack trace if we signal out.
    303   sys::PrintStackTraceOnErrorSignal();
    304   PrettyStackTraceProgram X(argc, argv);
    305 
    306   LLVMContext &Context = getGlobalContext();
    307   Context.setDiagnosticHandler(diagnosticHandlerWithContext, nullptr, true);
    308 
    309   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
    310   cl::ParseCommandLineOptions(argc, argv, "llvm linker\n");
    311 
    312   auto Composite = make_unique<Module>("llvm-link", Context);
    313   Linker L(*Composite);
    314 
    315   unsigned Flags = Linker::Flags::None;
    316   if (Internalize)
    317     Flags |= Linker::Flags::InternalizeLinkedSymbols;
    318   if (OnlyNeeded)
    319     Flags |= Linker::Flags::LinkOnlyNeeded;
    320 
    321   // First add all the regular input files
    322   if (!linkFiles(argv[0], Context, L, InputFilenames, Flags))
    323     return 1;
    324 
    325   // Next the -override ones.
    326   if (!linkFiles(argv[0], Context, L, OverridingInputs,
    327                  Flags | Linker::Flags::OverrideFromSrc))
    328     return 1;
    329 
    330   // Import any functions requested via -import
    331   if (!importFunctions(argv[0], Context, L))
    332     return 1;
    333 
    334   if (DumpAsm) errs() << "Here's the assembly:\n" << *Composite;
    335 
    336   std::error_code EC;
    337   tool_output_file Out(OutputFilename, EC, sys::fs::F_None);
    338   if (EC) {
    339     errs() << EC.message() << '\n';
    340     return 1;
    341   }
    342 
    343   if (verifyModule(*Composite, &errs())) {
    344     errs() << argv[0] << ": error: linked module is broken!\n";
    345     return 1;
    346   }
    347 
    348   if (Verbose) errs() << "Writing bitcode...\n";
    349   if (OutputAssembly) {
    350     Composite->print(Out.os(), nullptr, PreserveAssemblyUseListOrder);
    351   } else if (Force || !CheckBitcodeOutputToConsole(Out.os(), true))
    352     WriteBitcodeToFile(Composite.get(), Out.os(), PreserveBitcodeUseListOrder);
    353 
    354   // Declare success.
    355   Out.keep();
    356 
    357   return 0;
    358 }
    359