1 //===- llvm-link.cpp - Low-level LLVM linker ------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This utility may be invoked in the following manner: 10 // llvm-link a.bc b.bc c.bc -o x.bc 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/ADT/STLExtras.h" 15 #include "llvm/BinaryFormat/Magic.h" 16 #include "llvm/Bitcode/BitcodeReader.h" 17 #include "llvm/Bitcode/BitcodeWriter.h" 18 #include "llvm/IR/AutoUpgrade.h" 19 #include "llvm/IR/DiagnosticInfo.h" 20 #include "llvm/IR/DiagnosticPrinter.h" 21 #include "llvm/IR/LLVMContext.h" 22 #include "llvm/IR/Module.h" 23 #include "llvm/IR/ModuleSummaryIndex.h" 24 #include "llvm/IR/Verifier.h" 25 #include "llvm/IRReader/IRReader.h" 26 #include "llvm/Linker/Linker.h" 27 #include "llvm/Object/Archive.h" 28 #include "llvm/Support/CommandLine.h" 29 #include "llvm/Support/FileSystem.h" 30 #include "llvm/Support/InitLLVM.h" 31 #include "llvm/Support/Path.h" 32 #include "llvm/Support/SourceMgr.h" 33 #include "llvm/Support/SystemUtils.h" 34 #include "llvm/Support/ToolOutputFile.h" 35 #include "llvm/Support/WithColor.h" 36 #include "llvm/Transforms/IPO/FunctionImport.h" 37 #include "llvm/Transforms/IPO/Internalize.h" 38 #include "llvm/Transforms/Utils/FunctionImportUtils.h" 39 40 #include <memory> 41 #include <utility> 42 using namespace llvm; 43 44 static cl::OptionCategory LinkCategory("Link Options"); 45 46 static cl::list<std::string> InputFilenames(cl::Positional, cl::OneOrMore, 47 cl::desc("<input bitcode files>"), 48 cl::cat(LinkCategory)); 49 50 static cl::list<std::string> OverridingInputs( 51 "override", cl::ZeroOrMore, cl::value_desc("filename"), 52 cl::desc( 53 "input bitcode file which can override previously defined symbol(s)"), 54 cl::cat(LinkCategory)); 55 56 // Option to simulate function importing for testing. This enables using 57 // llvm-link to simulate ThinLTO backend processes. 58 static cl::list<std::string> Imports( 59 "import", cl::ZeroOrMore, cl::value_desc("function:filename"), 60 cl::desc("Pair of function name and filename, where function should be " 61 "imported from bitcode in filename"), 62 cl::cat(LinkCategory)); 63 64 // Option to support testing of function importing. The module summary 65 // must be specified in the case were we request imports via the -import 66 // option, as well as when compiling any module with functions that may be 67 // exported (imported by a different llvm-link -import invocation), to ensure 68 // consistent promotion and renaming of locals. 69 static cl::opt<std::string> 70 SummaryIndex("summary-index", cl::desc("Module summary index filename"), 71 cl::init(""), cl::value_desc("filename"), 72 cl::cat(LinkCategory)); 73 74 static cl::opt<std::string> 75 OutputFilename("o", cl::desc("Override output filename"), cl::init("-"), 76 cl::value_desc("filename"), cl::cat(LinkCategory)); 77 78 static cl::opt<bool> Internalize("internalize", 79 cl::desc("Internalize linked symbols"), 80 cl::cat(LinkCategory)); 81 82 static cl::opt<bool> 83 DisableDITypeMap("disable-debug-info-type-map", 84 cl::desc("Don't use a uniquing type map for debug info"), 85 cl::cat(LinkCategory)); 86 87 static cl::opt<bool> OnlyNeeded("only-needed", 88 cl::desc("Link only needed symbols"), 89 cl::cat(LinkCategory)); 90 91 static cl::opt<bool> Force("f", cl::desc("Enable binary output on terminals"), 92 cl::cat(LinkCategory)); 93 94 static cl::opt<bool> DisableLazyLoad("disable-lazy-loading", 95 cl::desc("Disable lazy module loading"), 96 cl::cat(LinkCategory)); 97 98 static cl::opt<bool> OutputAssembly("S", 99 cl::desc("Write output as LLVM assembly"), 100 cl::Hidden, cl::cat(LinkCategory)); 101 102 static cl::opt<bool> Verbose("v", 103 cl::desc("Print information about actions taken"), 104 cl::cat(LinkCategory)); 105 106 static cl::opt<bool> DumpAsm("d", cl::desc("Print assembly as linked"), 107 cl::Hidden, cl::cat(LinkCategory)); 108 109 static cl::opt<bool> SuppressWarnings("suppress-warnings", 110 cl::desc("Suppress all linking warnings"), 111 cl::init(false), cl::cat(LinkCategory)); 112 113 static cl::opt<bool> PreserveBitcodeUseListOrder( 114 "preserve-bc-uselistorder", 115 cl::desc("Preserve use-list order when writing LLVM bitcode."), 116 cl::init(true), cl::Hidden, cl::cat(LinkCategory)); 117 118 static cl::opt<bool> PreserveAssemblyUseListOrder( 119 "preserve-ll-uselistorder", 120 cl::desc("Preserve use-list order when writing LLVM assembly."), 121 cl::init(false), cl::Hidden, cl::cat(LinkCategory)); 122 123 static cl::opt<bool> NoVerify("disable-verify", 124 cl::desc("Do not run the verifier"), cl::Hidden, 125 cl::cat(LinkCategory)); 126 127 static ExitOnError ExitOnErr; 128 129 // Read the specified bitcode file in and return it. This routine searches the 130 // link path for the specified file to try to find it... 131 // 132 static std::unique_ptr<Module> loadFile(const char *argv0, 133 std::unique_ptr<MemoryBuffer> Buffer, 134 LLVMContext &Context, 135 bool MaterializeMetadata = true) { 136 SMDiagnostic Err; 137 if (Verbose) 138 errs() << "Loading '" << Buffer->getBufferIdentifier() << "'\n"; 139 std::unique_ptr<Module> Result; 140 if (DisableLazyLoad) 141 Result = parseIR(*Buffer, Err, Context); 142 else 143 Result = 144 getLazyIRModule(std::move(Buffer), Err, Context, !MaterializeMetadata); 145 146 if (!Result) { 147 Err.print(argv0, errs()); 148 return nullptr; 149 } 150 151 if (MaterializeMetadata) { 152 ExitOnErr(Result->materializeMetadata()); 153 UpgradeDebugInfo(*Result); 154 } 155 156 return Result; 157 } 158 159 static std::unique_ptr<Module> loadArFile(const char *Argv0, 160 std::unique_ptr<MemoryBuffer> Buffer, 161 LLVMContext &Context) { 162 std::unique_ptr<Module> Result(new Module("ArchiveModule", Context)); 163 StringRef ArchiveName = Buffer->getBufferIdentifier(); 164 if (Verbose) 165 errs() << "Reading library archive file '" << ArchiveName 166 << "' to memory\n"; 167 Error Err = Error::success(); 168 object::Archive Archive(*Buffer, Err); 169 ExitOnErr(std::move(Err)); 170 Linker L(*Result); 171 for (const object::Archive::Child &C : Archive.children(Err)) { 172 Expected<StringRef> Ename = C.getName(); 173 if (Error E = Ename.takeError()) { 174 errs() << Argv0 << ": "; 175 WithColor::error() << " failed to read name of archive member" 176 << ArchiveName << "'\n"; 177 return nullptr; 178 } 179 std::string ChildName = Ename.get().str(); 180 if (Verbose) 181 errs() << "Parsing member '" << ChildName 182 << "' of archive library to module.\n"; 183 SMDiagnostic ParseErr; 184 Expected<MemoryBufferRef> MemBuf = C.getMemoryBufferRef(); 185 if (Error E = MemBuf.takeError()) { 186 errs() << Argv0 << ": "; 187 WithColor::error() << " loading memory for member '" << ChildName 188 << "' of archive library failed'" << ArchiveName 189 << "'\n"; 190 return nullptr; 191 }; 192 193 if (!isBitcode(reinterpret_cast<const unsigned char *>( 194 MemBuf.get().getBufferStart()), 195 reinterpret_cast<const unsigned char *>( 196 MemBuf.get().getBufferEnd()))) { 197 errs() << Argv0 << ": "; 198 WithColor::error() << " member of archive is not a bitcode file: '" 199 << ChildName << "'\n"; 200 return nullptr; 201 } 202 203 std::unique_ptr<Module> M; 204 if (DisableLazyLoad) 205 M = parseIR(MemBuf.get(), ParseErr, Context); 206 else 207 M = getLazyIRModule(MemoryBuffer::getMemBuffer(MemBuf.get(), false), 208 ParseErr, Context); 209 210 if (!M.get()) { 211 errs() << Argv0 << ": "; 212 WithColor::error() << " parsing member '" << ChildName 213 << "' of archive library failed'" << ArchiveName 214 << "'\n"; 215 return nullptr; 216 } 217 if (Verbose) 218 errs() << "Linking member '" << ChildName << "' of archive library.\n"; 219 if (L.linkInModule(std::move(M))) 220 return nullptr; 221 } // end for each child 222 ExitOnErr(std::move(Err)); 223 return Result; 224 } 225 226 namespace { 227 228 /// Helper to load on demand a Module from file and cache it for subsequent 229 /// queries during function importing. 230 class ModuleLazyLoaderCache { 231 /// Cache of lazily loaded module for import. 232 StringMap<std::unique_ptr<Module>> ModuleMap; 233 234 /// Retrieve a Module from the cache or lazily load it on demand. 235 std::function<std::unique_ptr<Module>(const char *argv0, 236 const std::string &FileName)> 237 createLazyModule; 238 239 public: 240 /// Create the loader, Module will be initialized in \p Context. 241 ModuleLazyLoaderCache(std::function<std::unique_ptr<Module>( 242 const char *argv0, const std::string &FileName)> 243 createLazyModule) 244 : createLazyModule(std::move(createLazyModule)) {} 245 246 /// Retrieve a Module from the cache or lazily load it on demand. 247 Module &operator()(const char *argv0, const std::string &FileName); 248 249 std::unique_ptr<Module> takeModule(const std::string &FileName) { 250 auto I = ModuleMap.find(FileName); 251 assert(I != ModuleMap.end()); 252 std::unique_ptr<Module> Ret = std::move(I->second); 253 ModuleMap.erase(I); 254 return Ret; 255 } 256 }; 257 258 // Get a Module for \p FileName from the cache, or load it lazily. 259 Module &ModuleLazyLoaderCache::operator()(const char *argv0, 260 const std::string &Identifier) { 261 auto &Module = ModuleMap[Identifier]; 262 if (!Module) { 263 Module = createLazyModule(argv0, Identifier); 264 assert(Module && "Failed to create lazy module!"); 265 } 266 return *Module; 267 } 268 } // anonymous namespace 269 270 namespace { 271 struct LLVMLinkDiagnosticHandler : public DiagnosticHandler { 272 bool handleDiagnostics(const DiagnosticInfo &DI) override { 273 unsigned Severity = DI.getSeverity(); 274 switch (Severity) { 275 case DS_Error: 276 WithColor::error(); 277 break; 278 case DS_Warning: 279 if (SuppressWarnings) 280 return true; 281 WithColor::warning(); 282 break; 283 case DS_Remark: 284 case DS_Note: 285 llvm_unreachable("Only expecting warnings and errors"); 286 } 287 288 DiagnosticPrinterRawOStream DP(errs()); 289 DI.print(DP); 290 errs() << '\n'; 291 return true; 292 } 293 }; 294 } // namespace 295 296 /// Import any functions requested via the -import option. 297 static bool importFunctions(const char *argv0, Module &DestModule) { 298 if (SummaryIndex.empty()) 299 return true; 300 std::unique_ptr<ModuleSummaryIndex> Index = 301 ExitOnErr(llvm::getModuleSummaryIndexForFile(SummaryIndex)); 302 303 // Map of Module -> List of globals to import from the Module 304 FunctionImporter::ImportMapTy ImportList; 305 306 auto ModuleLoader = [&DestModule](const char *argv0, 307 const std::string &Identifier) { 308 std::unique_ptr<MemoryBuffer> Buffer = 309 ExitOnErr(errorOrToExpected(MemoryBuffer::getFileOrSTDIN(Identifier))); 310 return loadFile(argv0, std::move(Buffer), DestModule.getContext(), false); 311 }; 312 313 ModuleLazyLoaderCache ModuleLoaderCache(ModuleLoader); 314 for (const auto &Import : Imports) { 315 // Identify the requested function and its bitcode source file. 316 size_t Idx = Import.find(':'); 317 if (Idx == std::string::npos) { 318 errs() << "Import parameter bad format: " << Import << "\n"; 319 return false; 320 } 321 std::string FunctionName = Import.substr(0, Idx); 322 std::string FileName = Import.substr(Idx + 1, std::string::npos); 323 324 // Load the specified source module. 325 auto &SrcModule = ModuleLoaderCache(argv0, FileName); 326 327 if (!NoVerify && verifyModule(SrcModule, &errs())) { 328 errs() << argv0 << ": " << FileName; 329 WithColor::error() << "input module is broken!\n"; 330 return false; 331 } 332 333 Function *F = SrcModule.getFunction(FunctionName); 334 if (!F) { 335 errs() << "Ignoring import request for non-existent function " 336 << FunctionName << " from " << FileName << "\n"; 337 continue; 338 } 339 // We cannot import weak_any functions without possibly affecting the 340 // order they are seen and selected by the linker, changing program 341 // semantics. 342 if (F->hasWeakAnyLinkage()) { 343 errs() << "Ignoring import request for weak-any function " << FunctionName 344 << " from " << FileName << "\n"; 345 continue; 346 } 347 348 if (Verbose) 349 errs() << "Importing " << FunctionName << " from " << FileName << "\n"; 350 351 auto &Entry = ImportList[FileName]; 352 Entry.insert(F->getGUID()); 353 } 354 auto CachedModuleLoader = [&](StringRef Identifier) { 355 return ModuleLoaderCache.takeModule(std::string(Identifier)); 356 }; 357 FunctionImporter Importer(*Index, CachedModuleLoader, 358 /*ClearDSOLocalOnDeclarations=*/false); 359 ExitOnErr(Importer.importFunctions(DestModule, ImportList)); 360 361 return true; 362 } 363 364 static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L, 365 const cl::list<std::string> &Files, unsigned Flags) { 366 // Filter out flags that don't apply to the first file we load. 367 unsigned ApplicableFlags = Flags & Linker::Flags::OverrideFromSrc; 368 // Similar to some flags, internalization doesn't apply to the first file. 369 bool InternalizeLinkedSymbols = false; 370 for (const auto &File : Files) { 371 std::unique_ptr<MemoryBuffer> Buffer = 372 ExitOnErr(errorOrToExpected(MemoryBuffer::getFileOrSTDIN(File))); 373 374 std::unique_ptr<Module> M = 375 identify_magic(Buffer->getBuffer()) == file_magic::archive 376 ? loadArFile(argv0, std::move(Buffer), Context) 377 : loadFile(argv0, std::move(Buffer), Context); 378 if (!M.get()) { 379 errs() << argv0 << ": "; 380 WithColor::error() << " loading file '" << File << "'\n"; 381 return false; 382 } 383 384 // Note that when ODR merging types cannot verify input files in here When 385 // doing that debug metadata in the src module might already be pointing to 386 // the destination. 387 if (DisableDITypeMap && !NoVerify && verifyModule(*M, &errs())) { 388 errs() << argv0 << ": " << File << ": "; 389 WithColor::error() << "input module is broken!\n"; 390 return false; 391 } 392 393 // If a module summary index is supplied, load it so linkInModule can treat 394 // local functions/variables as exported and promote if necessary. 395 if (!SummaryIndex.empty()) { 396 std::unique_ptr<ModuleSummaryIndex> Index = 397 ExitOnErr(llvm::getModuleSummaryIndexForFile(SummaryIndex)); 398 399 // Conservatively mark all internal values as promoted, since this tool 400 // does not do the ThinLink that would normally determine what values to 401 // promote. 402 for (auto &I : *Index) { 403 for (auto &S : I.second.SummaryList) { 404 if (GlobalValue::isLocalLinkage(S->linkage())) 405 S->setLinkage(GlobalValue::ExternalLinkage); 406 } 407 } 408 409 // Promotion 410 if (renameModuleForThinLTO(*M, *Index, 411 /*ClearDSOLocalOnDeclarations=*/false)) 412 return true; 413 } 414 415 if (Verbose) 416 errs() << "Linking in '" << File << "'\n"; 417 418 bool Err = false; 419 if (InternalizeLinkedSymbols) { 420 Err = L.linkInModule( 421 std::move(M), ApplicableFlags, [](Module &M, const StringSet<> &GVS) { 422 internalizeModule(M, [&GVS](const GlobalValue &GV) { 423 return !GV.hasName() || (GVS.count(GV.getName()) == 0); 424 }); 425 }); 426 } else { 427 Err = L.linkInModule(std::move(M), ApplicableFlags); 428 } 429 430 if (Err) 431 return false; 432 433 // Internalization applies to linking of subsequent files. 434 InternalizeLinkedSymbols = Internalize; 435 436 // All linker flags apply to linking of subsequent files. 437 ApplicableFlags = Flags; 438 } 439 440 return true; 441 } 442 443 int main(int argc, char **argv) { 444 InitLLVM X(argc, argv); 445 ExitOnErr.setBanner(std::string(argv[0]) + ": "); 446 447 LLVMContext Context; 448 Context.setDiagnosticHandler(std::make_unique<LLVMLinkDiagnosticHandler>(), 449 true); 450 cl::HideUnrelatedOptions({&LinkCategory, &getColorCategory()}); 451 cl::ParseCommandLineOptions(argc, argv, "llvm linker\n"); 452 453 if (!DisableDITypeMap) 454 Context.enableDebugTypeODRUniquing(); 455 456 auto Composite = std::make_unique<Module>("llvm-link", Context); 457 Linker L(*Composite); 458 459 unsigned Flags = Linker::Flags::None; 460 if (OnlyNeeded) 461 Flags |= Linker::Flags::LinkOnlyNeeded; 462 463 // First add all the regular input files 464 if (!linkFiles(argv[0], Context, L, InputFilenames, Flags)) 465 return 1; 466 467 // Next the -override ones. 468 if (!linkFiles(argv[0], Context, L, OverridingInputs, 469 Flags | Linker::Flags::OverrideFromSrc)) 470 return 1; 471 472 // Import any functions requested via -import 473 if (!importFunctions(argv[0], *Composite)) 474 return 1; 475 476 if (DumpAsm) 477 errs() << "Here's the assembly:\n" << *Composite; 478 479 std::error_code EC; 480 ToolOutputFile Out(OutputFilename, EC, 481 OutputAssembly ? sys::fs::OF_TextWithCRLF 482 : sys::fs::OF_None); 483 if (EC) { 484 WithColor::error() << EC.message() << '\n'; 485 return 1; 486 } 487 488 if (!NoVerify && verifyModule(*Composite, &errs())) { 489 errs() << argv[0] << ": "; 490 WithColor::error() << "linked module is broken!\n"; 491 return 1; 492 } 493 494 if (Verbose) 495 errs() << "Writing bitcode...\n"; 496 if (OutputAssembly) { 497 Composite->print(Out.os(), nullptr, PreserveAssemblyUseListOrder); 498 } else if (Force || !CheckBitcodeOutputToConsole(Out.os())) 499 WriteBitcodeToFile(*Composite, Out.os(), PreserveBitcodeUseListOrder); 500 501 // Declare success. 502 Out.keep(); 503 504 return 0; 505 } 506