1 //===-- gold-plugin.cpp - Plugin to gold for Link Time Optimization ------===// 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 is a gold plugin for LLVM. It provides an LLVM implementation of the 11 // interface described in http://gcc.gnu.org/wiki/whopr/driver . 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/Config/config.h" // plugin-api.h requires HAVE_STDINT_H 16 #include "llvm/ADT/DenseSet.h" 17 #include "llvm/ADT/StringSet.h" 18 #include "llvm/Analysis/TargetLibraryInfo.h" 19 #include "llvm/Analysis/TargetTransformInfo.h" 20 #include "llvm/Bitcode/ReaderWriter.h" 21 #include "llvm/CodeGen/Analysis.h" 22 #include "llvm/CodeGen/CommandFlags.h" 23 #include "llvm/CodeGen/ParallelCG.h" 24 #include "llvm/IR/AutoUpgrade.h" 25 #include "llvm/IR/Constants.h" 26 #include "llvm/IR/DiagnosticInfo.h" 27 #include "llvm/IR/DiagnosticPrinter.h" 28 #include "llvm/IR/LLVMContext.h" 29 #include "llvm/IR/LegacyPassManager.h" 30 #include "llvm/IR/Module.h" 31 #include "llvm/IR/Verifier.h" 32 #include "llvm/Linker/Linker.h" 33 #include "llvm/MC/SubtargetFeature.h" 34 #include "llvm/Object/IRObjectFile.h" 35 #include "llvm/Object/FunctionIndexObjectFile.h" 36 #include "llvm/Support/raw_ostream.h" 37 #include "llvm/Support/Host.h" 38 #include "llvm/Support/ManagedStatic.h" 39 #include "llvm/Support/MemoryBuffer.h" 40 #include "llvm/Support/TargetRegistry.h" 41 #include "llvm/Support/TargetSelect.h" 42 #include "llvm/Transforms/IPO.h" 43 #include "llvm/Transforms/IPO/PassManagerBuilder.h" 44 #include "llvm/Transforms/Utils/GlobalStatus.h" 45 #include "llvm/Transforms/Utils/ModuleUtils.h" 46 #include "llvm/Transforms/Utils/ValueMapper.h" 47 #include <list> 48 #include <plugin-api.h> 49 #include <system_error> 50 #include <vector> 51 52 #ifndef LDPO_PIE 53 // FIXME: remove this declaration when we stop maintaining Ubuntu Quantal and 54 // Precise and Debian Wheezy (binutils 2.23 is required) 55 # define LDPO_PIE 3 56 #endif 57 58 using namespace llvm; 59 60 namespace { 61 struct claimed_file { 62 void *handle; 63 std::vector<ld_plugin_symbol> syms; 64 }; 65 } 66 67 static ld_plugin_status discard_message(int level, const char *format, ...) { 68 // Die loudly. Recent versions of Gold pass ld_plugin_message as the first 69 // callback in the transfer vector. This should never be called. 70 abort(); 71 } 72 73 static ld_plugin_get_input_file get_input_file = nullptr; 74 static ld_plugin_release_input_file release_input_file = nullptr; 75 static ld_plugin_add_symbols add_symbols = nullptr; 76 static ld_plugin_get_symbols get_symbols = nullptr; 77 static ld_plugin_add_input_file add_input_file = nullptr; 78 static ld_plugin_set_extra_library_path set_extra_library_path = nullptr; 79 static ld_plugin_get_view get_view = nullptr; 80 static ld_plugin_message message = discard_message; 81 static Reloc::Model RelocationModel = Reloc::Default; 82 static std::string output_name = ""; 83 static std::list<claimed_file> Modules; 84 static std::vector<std::string> Cleanup; 85 static llvm::TargetOptions TargetOpts; 86 87 namespace options { 88 enum OutputType { 89 OT_NORMAL, 90 OT_DISABLE, 91 OT_BC_ONLY, 92 OT_SAVE_TEMPS 93 }; 94 static bool generate_api_file = false; 95 static OutputType TheOutputType = OT_NORMAL; 96 static unsigned OptLevel = 2; 97 static unsigned Parallelism = 1; 98 #ifdef NDEBUG 99 static bool DisableVerify = true; 100 #else 101 static bool DisableVerify = false; 102 #endif 103 static std::string obj_path; 104 static std::string extra_library_path; 105 static std::string triple; 106 static std::string mcpu; 107 // When the thinlto plugin option is specified, only read the function 108 // the information from intermediate files and write a combined 109 // global index for the ThinLTO backends. 110 static bool thinlto = false; 111 // Additional options to pass into the code generator. 112 // Note: This array will contain all plugin options which are not claimed 113 // as plugin exclusive to pass to the code generator. 114 // For example, "generate-api-file" and "as"options are for the plugin 115 // use only and will not be passed. 116 static std::vector<const char *> extra; 117 118 static void process_plugin_option(const char *opt_) 119 { 120 if (opt_ == nullptr) 121 return; 122 llvm::StringRef opt = opt_; 123 124 if (opt == "generate-api-file") { 125 generate_api_file = true; 126 } else if (opt.startswith("mcpu=")) { 127 mcpu = opt.substr(strlen("mcpu=")); 128 } else if (opt.startswith("extra-library-path=")) { 129 extra_library_path = opt.substr(strlen("extra_library_path=")); 130 } else if (opt.startswith("mtriple=")) { 131 triple = opt.substr(strlen("mtriple=")); 132 } else if (opt.startswith("obj-path=")) { 133 obj_path = opt.substr(strlen("obj-path=")); 134 } else if (opt == "emit-llvm") { 135 TheOutputType = OT_BC_ONLY; 136 } else if (opt == "save-temps") { 137 TheOutputType = OT_SAVE_TEMPS; 138 } else if (opt == "disable-output") { 139 TheOutputType = OT_DISABLE; 140 } else if (opt == "thinlto") { 141 thinlto = true; 142 } else if (opt.size() == 2 && opt[0] == 'O') { 143 if (opt[1] < '0' || opt[1] > '3') 144 message(LDPL_FATAL, "Optimization level must be between 0 and 3"); 145 OptLevel = opt[1] - '0'; 146 } else if (opt.startswith("jobs=")) { 147 if (StringRef(opt_ + 5).getAsInteger(10, Parallelism)) 148 message(LDPL_FATAL, "Invalid parallelism level: %s", opt_ + 5); 149 } else if (opt == "disable-verify") { 150 DisableVerify = true; 151 } else { 152 // Save this option to pass to the code generator. 153 // ParseCommandLineOptions() expects argv[0] to be program name. Lazily 154 // add that. 155 if (extra.empty()) 156 extra.push_back("LLVMgold"); 157 158 extra.push_back(opt_); 159 } 160 } 161 } 162 163 static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file, 164 int *claimed); 165 static ld_plugin_status all_symbols_read_hook(void); 166 static ld_plugin_status cleanup_hook(void); 167 168 extern "C" ld_plugin_status onload(ld_plugin_tv *tv); 169 ld_plugin_status onload(ld_plugin_tv *tv) { 170 InitializeAllTargetInfos(); 171 InitializeAllTargets(); 172 InitializeAllTargetMCs(); 173 InitializeAllAsmParsers(); 174 InitializeAllAsmPrinters(); 175 176 // We're given a pointer to the first transfer vector. We read through them 177 // until we find one where tv_tag == LDPT_NULL. The REGISTER_* tagged values 178 // contain pointers to functions that we need to call to register our own 179 // hooks. The others are addresses of functions we can use to call into gold 180 // for services. 181 182 bool registeredClaimFile = false; 183 bool RegisteredAllSymbolsRead = false; 184 185 for (; tv->tv_tag != LDPT_NULL; ++tv) { 186 switch (tv->tv_tag) { 187 case LDPT_OUTPUT_NAME: 188 output_name = tv->tv_u.tv_string; 189 break; 190 case LDPT_LINKER_OUTPUT: 191 switch (tv->tv_u.tv_val) { 192 case LDPO_REL: // .o 193 case LDPO_DYN: // .so 194 case LDPO_PIE: // position independent executable 195 RelocationModel = Reloc::PIC_; 196 break; 197 case LDPO_EXEC: // .exe 198 RelocationModel = Reloc::Static; 199 break; 200 default: 201 message(LDPL_ERROR, "Unknown output file type %d", tv->tv_u.tv_val); 202 return LDPS_ERR; 203 } 204 break; 205 case LDPT_OPTION: 206 options::process_plugin_option(tv->tv_u.tv_string); 207 break; 208 case LDPT_REGISTER_CLAIM_FILE_HOOK: { 209 ld_plugin_register_claim_file callback; 210 callback = tv->tv_u.tv_register_claim_file; 211 212 if (callback(claim_file_hook) != LDPS_OK) 213 return LDPS_ERR; 214 215 registeredClaimFile = true; 216 } break; 217 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK: { 218 ld_plugin_register_all_symbols_read callback; 219 callback = tv->tv_u.tv_register_all_symbols_read; 220 221 if (callback(all_symbols_read_hook) != LDPS_OK) 222 return LDPS_ERR; 223 224 RegisteredAllSymbolsRead = true; 225 } break; 226 case LDPT_REGISTER_CLEANUP_HOOK: { 227 ld_plugin_register_cleanup callback; 228 callback = tv->tv_u.tv_register_cleanup; 229 230 if (callback(cleanup_hook) != LDPS_OK) 231 return LDPS_ERR; 232 } break; 233 case LDPT_GET_INPUT_FILE: 234 get_input_file = tv->tv_u.tv_get_input_file; 235 break; 236 case LDPT_RELEASE_INPUT_FILE: 237 release_input_file = tv->tv_u.tv_release_input_file; 238 break; 239 case LDPT_ADD_SYMBOLS: 240 add_symbols = tv->tv_u.tv_add_symbols; 241 break; 242 case LDPT_GET_SYMBOLS_V2: 243 get_symbols = tv->tv_u.tv_get_symbols; 244 break; 245 case LDPT_ADD_INPUT_FILE: 246 add_input_file = tv->tv_u.tv_add_input_file; 247 break; 248 case LDPT_SET_EXTRA_LIBRARY_PATH: 249 set_extra_library_path = tv->tv_u.tv_set_extra_library_path; 250 break; 251 case LDPT_GET_VIEW: 252 get_view = tv->tv_u.tv_get_view; 253 break; 254 case LDPT_MESSAGE: 255 message = tv->tv_u.tv_message; 256 break; 257 default: 258 break; 259 } 260 } 261 262 if (!registeredClaimFile) { 263 message(LDPL_ERROR, "register_claim_file not passed to LLVMgold."); 264 return LDPS_ERR; 265 } 266 if (!add_symbols) { 267 message(LDPL_ERROR, "add_symbols not passed to LLVMgold."); 268 return LDPS_ERR; 269 } 270 271 if (!RegisteredAllSymbolsRead) 272 return LDPS_OK; 273 274 if (!get_input_file) { 275 message(LDPL_ERROR, "get_input_file not passed to LLVMgold."); 276 return LDPS_ERR; 277 } 278 if (!release_input_file) { 279 message(LDPL_ERROR, "relesase_input_file not passed to LLVMgold."); 280 return LDPS_ERR; 281 } 282 283 return LDPS_OK; 284 } 285 286 static const GlobalObject *getBaseObject(const GlobalValue &GV) { 287 if (auto *GA = dyn_cast<GlobalAlias>(&GV)) 288 return GA->getBaseObject(); 289 return cast<GlobalObject>(&GV); 290 } 291 292 static bool shouldSkip(uint32_t Symflags) { 293 if (!(Symflags & object::BasicSymbolRef::SF_Global)) 294 return true; 295 if (Symflags & object::BasicSymbolRef::SF_FormatSpecific) 296 return true; 297 return false; 298 } 299 300 static void diagnosticHandler(const DiagnosticInfo &DI) { 301 if (const auto *BDI = dyn_cast<BitcodeDiagnosticInfo>(&DI)) { 302 std::error_code EC = BDI->getError(); 303 if (EC == BitcodeError::InvalidBitcodeSignature) 304 return; 305 } 306 307 std::string ErrStorage; 308 { 309 raw_string_ostream OS(ErrStorage); 310 DiagnosticPrinterRawOStream DP(OS); 311 DI.print(DP); 312 } 313 ld_plugin_level Level; 314 switch (DI.getSeverity()) { 315 case DS_Error: 316 message(LDPL_FATAL, "LLVM gold plugin has failed to create LTO module: %s", 317 ErrStorage.c_str()); 318 llvm_unreachable("Fatal doesn't return."); 319 case DS_Warning: 320 Level = LDPL_WARNING; 321 break; 322 case DS_Note: 323 case DS_Remark: 324 Level = LDPL_INFO; 325 break; 326 } 327 message(Level, "LLVM gold plugin: %s", ErrStorage.c_str()); 328 } 329 330 static void diagnosticHandlerForContext(const DiagnosticInfo &DI, 331 void *Context) { 332 diagnosticHandler(DI); 333 } 334 335 /// Called by gold to see whether this file is one that our plugin can handle. 336 /// We'll try to open it and register all the symbols with add_symbol if 337 /// possible. 338 static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file, 339 int *claimed) { 340 LLVMContext Context; 341 MemoryBufferRef BufferRef; 342 std::unique_ptr<MemoryBuffer> Buffer; 343 if (get_view) { 344 const void *view; 345 if (get_view(file->handle, &view) != LDPS_OK) { 346 message(LDPL_ERROR, "Failed to get a view of %s", file->name); 347 return LDPS_ERR; 348 } 349 BufferRef = 350 MemoryBufferRef(StringRef((const char *)view, file->filesize), ""); 351 } else { 352 int64_t offset = 0; 353 // Gold has found what might be IR part-way inside of a file, such as 354 // an .a archive. 355 if (file->offset) { 356 offset = file->offset; 357 } 358 ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr = 359 MemoryBuffer::getOpenFileSlice(file->fd, file->name, file->filesize, 360 offset); 361 if (std::error_code EC = BufferOrErr.getError()) { 362 message(LDPL_ERROR, EC.message().c_str()); 363 return LDPS_ERR; 364 } 365 Buffer = std::move(BufferOrErr.get()); 366 BufferRef = Buffer->getMemBufferRef(); 367 } 368 369 Context.setDiagnosticHandler(diagnosticHandlerForContext); 370 ErrorOr<std::unique_ptr<object::IRObjectFile>> ObjOrErr = 371 object::IRObjectFile::create(BufferRef, Context); 372 std::error_code EC = ObjOrErr.getError(); 373 if (EC == object::object_error::invalid_file_type || 374 EC == object::object_error::bitcode_section_not_found) 375 return LDPS_OK; 376 377 *claimed = 1; 378 379 if (EC) { 380 message(LDPL_ERROR, "LLVM gold plugin has failed to create LTO module: %s", 381 EC.message().c_str()); 382 return LDPS_ERR; 383 } 384 std::unique_ptr<object::IRObjectFile> Obj = std::move(*ObjOrErr); 385 386 Modules.resize(Modules.size() + 1); 387 claimed_file &cf = Modules.back(); 388 389 cf.handle = file->handle; 390 391 // If we are doing ThinLTO compilation, don't need to process the symbols. 392 // Later we simply build a combined index file after all files are claimed. 393 if (options::thinlto) 394 return LDPS_OK; 395 396 for (auto &Sym : Obj->symbols()) { 397 uint32_t Symflags = Sym.getFlags(); 398 if (shouldSkip(Symflags)) 399 continue; 400 401 cf.syms.push_back(ld_plugin_symbol()); 402 ld_plugin_symbol &sym = cf.syms.back(); 403 sym.version = nullptr; 404 405 SmallString<64> Name; 406 { 407 raw_svector_ostream OS(Name); 408 Sym.printName(OS); 409 } 410 sym.name = strdup(Name.c_str()); 411 412 const GlobalValue *GV = Obj->getSymbolGV(Sym.getRawDataRefImpl()); 413 414 sym.visibility = LDPV_DEFAULT; 415 if (GV) { 416 switch (GV->getVisibility()) { 417 case GlobalValue::DefaultVisibility: 418 sym.visibility = LDPV_DEFAULT; 419 break; 420 case GlobalValue::HiddenVisibility: 421 sym.visibility = LDPV_HIDDEN; 422 break; 423 case GlobalValue::ProtectedVisibility: 424 sym.visibility = LDPV_PROTECTED; 425 break; 426 } 427 } 428 429 if (Symflags & object::BasicSymbolRef::SF_Undefined) { 430 sym.def = LDPK_UNDEF; 431 if (GV && GV->hasExternalWeakLinkage()) 432 sym.def = LDPK_WEAKUNDEF; 433 } else { 434 sym.def = LDPK_DEF; 435 if (GV) { 436 assert(!GV->hasExternalWeakLinkage() && 437 !GV->hasAvailableExternallyLinkage() && "Not a declaration!"); 438 if (GV->hasCommonLinkage()) 439 sym.def = LDPK_COMMON; 440 else if (GV->isWeakForLinker()) 441 sym.def = LDPK_WEAKDEF; 442 } 443 } 444 445 sym.size = 0; 446 sym.comdat_key = nullptr; 447 if (GV) { 448 const GlobalObject *Base = getBaseObject(*GV); 449 if (!Base) 450 message(LDPL_FATAL, "Unable to determine comdat of alias!"); 451 const Comdat *C = Base->getComdat(); 452 if (C) 453 sym.comdat_key = strdup(C->getName().str().c_str()); 454 } 455 456 sym.resolution = LDPR_UNKNOWN; 457 } 458 459 if (!cf.syms.empty()) { 460 if (add_symbols(cf.handle, cf.syms.size(), cf.syms.data()) != LDPS_OK) { 461 message(LDPL_ERROR, "Unable to add symbols!"); 462 return LDPS_ERR; 463 } 464 } 465 466 return LDPS_OK; 467 } 468 469 static void keepGlobalValue(GlobalValue &GV, 470 std::vector<GlobalAlias *> &KeptAliases) { 471 assert(!GV.hasLocalLinkage()); 472 473 if (auto *GA = dyn_cast<GlobalAlias>(&GV)) 474 KeptAliases.push_back(GA); 475 476 switch (GV.getLinkage()) { 477 default: 478 break; 479 case GlobalValue::LinkOnceAnyLinkage: 480 GV.setLinkage(GlobalValue::WeakAnyLinkage); 481 break; 482 case GlobalValue::LinkOnceODRLinkage: 483 GV.setLinkage(GlobalValue::WeakODRLinkage); 484 break; 485 } 486 487 assert(!GV.isDiscardableIfUnused()); 488 } 489 490 static void internalize(GlobalValue &GV) { 491 if (GV.isDeclarationForLinker()) 492 return; // We get here if there is a matching asm definition. 493 if (!GV.hasLocalLinkage()) 494 GV.setLinkage(GlobalValue::InternalLinkage); 495 } 496 497 static void drop(GlobalValue &GV) { 498 if (auto *F = dyn_cast<Function>(&GV)) { 499 F->deleteBody(); 500 F->setComdat(nullptr); // Should deleteBody do this? 501 return; 502 } 503 504 if (auto *Var = dyn_cast<GlobalVariable>(&GV)) { 505 Var->setInitializer(nullptr); 506 Var->setLinkage( 507 GlobalValue::ExternalLinkage); // Should setInitializer do this? 508 Var->setComdat(nullptr); // and this? 509 return; 510 } 511 512 auto &Alias = cast<GlobalAlias>(GV); 513 Module &M = *Alias.getParent(); 514 PointerType &Ty = *cast<PointerType>(Alias.getType()); 515 GlobalValue::LinkageTypes L = Alias.getLinkage(); 516 auto *Var = 517 new GlobalVariable(M, Ty.getElementType(), /*isConstant*/ false, L, 518 /*Initializer*/ nullptr); 519 Var->takeName(&Alias); 520 Alias.replaceAllUsesWith(Var); 521 Alias.eraseFromParent(); 522 } 523 524 static const char *getResolutionName(ld_plugin_symbol_resolution R) { 525 switch (R) { 526 case LDPR_UNKNOWN: 527 return "UNKNOWN"; 528 case LDPR_UNDEF: 529 return "UNDEF"; 530 case LDPR_PREVAILING_DEF: 531 return "PREVAILING_DEF"; 532 case LDPR_PREVAILING_DEF_IRONLY: 533 return "PREVAILING_DEF_IRONLY"; 534 case LDPR_PREEMPTED_REG: 535 return "PREEMPTED_REG"; 536 case LDPR_PREEMPTED_IR: 537 return "PREEMPTED_IR"; 538 case LDPR_RESOLVED_IR: 539 return "RESOLVED_IR"; 540 case LDPR_RESOLVED_EXEC: 541 return "RESOLVED_EXEC"; 542 case LDPR_RESOLVED_DYN: 543 return "RESOLVED_DYN"; 544 case LDPR_PREVAILING_DEF_IRONLY_EXP: 545 return "PREVAILING_DEF_IRONLY_EXP"; 546 } 547 llvm_unreachable("Unknown resolution"); 548 } 549 550 namespace { 551 class LocalValueMaterializer final : public ValueMaterializer { 552 DenseSet<GlobalValue *> &Dropped; 553 DenseMap<GlobalObject *, GlobalObject *> LocalVersions; 554 555 public: 556 LocalValueMaterializer(DenseSet<GlobalValue *> &Dropped) : Dropped(Dropped) {} 557 Value *materializeDeclFor(Value *V) override; 558 }; 559 } 560 561 Value *LocalValueMaterializer::materializeDeclFor(Value *V) { 562 auto *GO = dyn_cast<GlobalObject>(V); 563 if (!GO) 564 return nullptr; 565 566 auto I = LocalVersions.find(GO); 567 if (I != LocalVersions.end()) 568 return I->second; 569 570 if (!Dropped.count(GO)) 571 return nullptr; 572 573 Module &M = *GO->getParent(); 574 GlobalValue::LinkageTypes L = GO->getLinkage(); 575 GlobalObject *Declaration; 576 if (auto *F = dyn_cast<Function>(GO)) { 577 Declaration = Function::Create(F->getFunctionType(), L, "", &M); 578 } else { 579 auto *Var = cast<GlobalVariable>(GO); 580 Declaration = new GlobalVariable(M, Var->getType()->getElementType(), 581 Var->isConstant(), L, 582 /*Initializer*/ nullptr); 583 } 584 Declaration->takeName(GO); 585 Declaration->copyAttributesFrom(GO); 586 587 GO->setLinkage(GlobalValue::InternalLinkage); 588 GO->setName(Declaration->getName()); 589 Dropped.erase(GO); 590 GO->replaceAllUsesWith(Declaration); 591 592 LocalVersions[Declaration] = GO; 593 594 return GO; 595 } 596 597 static Constant *mapConstantToLocalCopy(Constant *C, ValueToValueMapTy &VM, 598 LocalValueMaterializer *Materializer) { 599 return MapValue(C, VM, RF_IgnoreMissingEntries, nullptr, Materializer); 600 } 601 602 static void freeSymName(ld_plugin_symbol &Sym) { 603 free(Sym.name); 604 free(Sym.comdat_key); 605 Sym.name = nullptr; 606 Sym.comdat_key = nullptr; 607 } 608 609 static std::unique_ptr<FunctionInfoIndex> 610 getFunctionIndexForFile(claimed_file &F, ld_plugin_input_file &Info) { 611 612 if (get_symbols(F.handle, F.syms.size(), &F.syms[0]) != LDPS_OK) 613 message(LDPL_FATAL, "Failed to get symbol information"); 614 615 const void *View; 616 if (get_view(F.handle, &View) != LDPS_OK) 617 message(LDPL_FATAL, "Failed to get a view of file"); 618 619 MemoryBufferRef BufferRef(StringRef((const char *)View, Info.filesize), 620 Info.name); 621 622 // Don't bother trying to build an index if there is no summary information 623 // in this bitcode file. 624 if (!object::FunctionIndexObjectFile::hasFunctionSummaryInMemBuffer( 625 BufferRef, diagnosticHandler)) 626 return std::unique_ptr<FunctionInfoIndex>(nullptr); 627 628 ErrorOr<std::unique_ptr<object::FunctionIndexObjectFile>> ObjOrErr = 629 object::FunctionIndexObjectFile::create(BufferRef, diagnosticHandler); 630 631 if (std::error_code EC = ObjOrErr.getError()) 632 message(LDPL_FATAL, "Could not read function index bitcode from file : %s", 633 EC.message().c_str()); 634 635 object::FunctionIndexObjectFile &Obj = **ObjOrErr; 636 637 return Obj.takeIndex(); 638 } 639 640 static std::unique_ptr<Module> 641 getModuleForFile(LLVMContext &Context, claimed_file &F, 642 ld_plugin_input_file &Info, raw_fd_ostream *ApiFile, 643 StringSet<> &Internalize, StringSet<> &Maybe) { 644 645 if (get_symbols(F.handle, F.syms.size(), F.syms.data()) != LDPS_OK) 646 message(LDPL_FATAL, "Failed to get symbol information"); 647 648 const void *View; 649 if (get_view(F.handle, &View) != LDPS_OK) 650 message(LDPL_FATAL, "Failed to get a view of file"); 651 652 MemoryBufferRef BufferRef(StringRef((const char *)View, Info.filesize), 653 Info.name); 654 ErrorOr<std::unique_ptr<object::IRObjectFile>> ObjOrErr = 655 object::IRObjectFile::create(BufferRef, Context); 656 657 if (std::error_code EC = ObjOrErr.getError()) 658 message(LDPL_FATAL, "Could not read bitcode from file : %s", 659 EC.message().c_str()); 660 661 object::IRObjectFile &Obj = **ObjOrErr; 662 663 Module &M = Obj.getModule(); 664 665 M.materializeMetadata(); 666 UpgradeDebugInfo(M); 667 668 SmallPtrSet<GlobalValue *, 8> Used; 669 collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); 670 671 DenseSet<GlobalValue *> Drop; 672 std::vector<GlobalAlias *> KeptAliases; 673 674 unsigned SymNum = 0; 675 for (auto &ObjSym : Obj.symbols()) { 676 if (shouldSkip(ObjSym.getFlags())) 677 continue; 678 ld_plugin_symbol &Sym = F.syms[SymNum]; 679 ++SymNum; 680 681 ld_plugin_symbol_resolution Resolution = 682 (ld_plugin_symbol_resolution)Sym.resolution; 683 684 if (options::generate_api_file) 685 *ApiFile << Sym.name << ' ' << getResolutionName(Resolution) << '\n'; 686 687 GlobalValue *GV = Obj.getSymbolGV(ObjSym.getRawDataRefImpl()); 688 if (!GV) { 689 freeSymName(Sym); 690 continue; // Asm symbol. 691 } 692 693 if (Resolution != LDPR_PREVAILING_DEF_IRONLY && GV->hasCommonLinkage()) { 694 // Common linkage is special. There is no single symbol that wins the 695 // resolution. Instead we have to collect the maximum alignment and size. 696 // The IR linker does that for us if we just pass it every common GV. 697 // We still have to keep track of LDPR_PREVAILING_DEF_IRONLY so we 698 // internalize once the IR linker has done its job. 699 freeSymName(Sym); 700 continue; 701 } 702 703 switch (Resolution) { 704 case LDPR_UNKNOWN: 705 llvm_unreachable("Unexpected resolution"); 706 707 case LDPR_RESOLVED_IR: 708 case LDPR_RESOLVED_EXEC: 709 case LDPR_RESOLVED_DYN: 710 assert(GV->isDeclarationForLinker()); 711 break; 712 713 case LDPR_UNDEF: 714 if (!GV->isDeclarationForLinker()) { 715 assert(GV->hasComdat()); 716 Drop.insert(GV); 717 } 718 break; 719 720 case LDPR_PREVAILING_DEF_IRONLY: { 721 keepGlobalValue(*GV, KeptAliases); 722 if (!Used.count(GV)) { 723 // Since we use the regular lib/Linker, we cannot just internalize GV 724 // now or it will not be copied to the merged module. Instead we force 725 // it to be copied and then internalize it. 726 Internalize.insert(GV->getName()); 727 } 728 break; 729 } 730 731 case LDPR_PREVAILING_DEF: 732 keepGlobalValue(*GV, KeptAliases); 733 break; 734 735 case LDPR_PREEMPTED_IR: 736 // Gold might have selected a linkonce_odr and preempted a weak_odr. 737 // In that case we have to make sure we don't end up internalizing it. 738 if (!GV->isDiscardableIfUnused()) 739 Maybe.erase(GV->getName()); 740 741 // fall-through 742 case LDPR_PREEMPTED_REG: 743 Drop.insert(GV); 744 break; 745 746 case LDPR_PREVAILING_DEF_IRONLY_EXP: { 747 // We can only check for address uses after we merge the modules. The 748 // reason is that this GV might have a copy in another module 749 // and in that module the address might be significant, but that 750 // copy will be LDPR_PREEMPTED_IR. 751 if (GV->hasLinkOnceODRLinkage()) 752 Maybe.insert(GV->getName()); 753 keepGlobalValue(*GV, KeptAliases); 754 break; 755 } 756 } 757 758 freeSymName(Sym); 759 } 760 761 ValueToValueMapTy VM; 762 LocalValueMaterializer Materializer(Drop); 763 for (GlobalAlias *GA : KeptAliases) { 764 // Gold told us to keep GA. It is possible that a GV usied in the aliasee 765 // expression is being dropped. If that is the case, that GV must be copied. 766 Constant *Aliasee = GA->getAliasee(); 767 Constant *Replacement = mapConstantToLocalCopy(Aliasee, VM, &Materializer); 768 GA->setAliasee(Replacement); 769 } 770 771 for (auto *GV : Drop) 772 drop(*GV); 773 774 return Obj.takeModule(); 775 } 776 777 static void runLTOPasses(Module &M, TargetMachine &TM) { 778 M.setDataLayout(TM.createDataLayout()); 779 780 legacy::PassManager passes; 781 passes.add(createTargetTransformInfoWrapperPass(TM.getTargetIRAnalysis())); 782 783 PassManagerBuilder PMB; 784 PMB.LibraryInfo = new TargetLibraryInfoImpl(Triple(TM.getTargetTriple())); 785 PMB.Inliner = createFunctionInliningPass(); 786 // Unconditionally verify input since it is not verified before this 787 // point and has unknown origin. 788 PMB.VerifyInput = true; 789 PMB.VerifyOutput = !options::DisableVerify; 790 PMB.LoopVectorize = true; 791 PMB.SLPVectorize = true; 792 PMB.OptLevel = options::OptLevel; 793 PMB.populateLTOPassManager(passes); 794 passes.run(M); 795 } 796 797 static void saveBCFile(StringRef Path, Module &M) { 798 std::error_code EC; 799 raw_fd_ostream OS(Path, EC, sys::fs::OpenFlags::F_None); 800 if (EC) 801 message(LDPL_FATAL, "Failed to write the output file."); 802 WriteBitcodeToFile(&M, OS, /* ShouldPreserveUseListOrder */ true); 803 } 804 805 static void codegen(std::unique_ptr<Module> M) { 806 const std::string &TripleStr = M->getTargetTriple(); 807 Triple TheTriple(TripleStr); 808 809 std::string ErrMsg; 810 const Target *TheTarget = TargetRegistry::lookupTarget(TripleStr, ErrMsg); 811 if (!TheTarget) 812 message(LDPL_FATAL, "Target not found: %s", ErrMsg.c_str()); 813 814 if (unsigned NumOpts = options::extra.size()) 815 cl::ParseCommandLineOptions(NumOpts, &options::extra[0]); 816 817 SubtargetFeatures Features; 818 Features.getDefaultSubtargetFeatures(TheTriple); 819 for (const std::string &A : MAttrs) 820 Features.AddFeature(A); 821 822 TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 823 CodeGenOpt::Level CGOptLevel; 824 switch (options::OptLevel) { 825 case 0: 826 CGOptLevel = CodeGenOpt::None; 827 break; 828 case 1: 829 CGOptLevel = CodeGenOpt::Less; 830 break; 831 case 2: 832 CGOptLevel = CodeGenOpt::Default; 833 break; 834 case 3: 835 CGOptLevel = CodeGenOpt::Aggressive; 836 break; 837 } 838 std::unique_ptr<TargetMachine> TM(TheTarget->createTargetMachine( 839 TripleStr, options::mcpu, Features.getString(), Options, RelocationModel, 840 CodeModel::Default, CGOptLevel)); 841 842 runLTOPasses(*M, *TM); 843 844 if (options::TheOutputType == options::OT_SAVE_TEMPS) 845 saveBCFile(output_name + ".opt.bc", *M); 846 847 SmallString<128> Filename; 848 if (!options::obj_path.empty()) 849 Filename = options::obj_path; 850 else if (options::TheOutputType == options::OT_SAVE_TEMPS) 851 Filename = output_name + ".o"; 852 853 std::vector<SmallString<128>> Filenames(options::Parallelism); 854 bool TempOutFile = Filename.empty(); 855 { 856 // Open a file descriptor for each backend thread. This is done in a block 857 // so that the output file descriptors are closed before gold opens them. 858 std::list<llvm::raw_fd_ostream> OSs; 859 std::vector<llvm::raw_pwrite_stream *> OSPtrs(options::Parallelism); 860 for (unsigned I = 0; I != options::Parallelism; ++I) { 861 int FD; 862 if (TempOutFile) { 863 std::error_code EC = 864 sys::fs::createTemporaryFile("lto-llvm", "o", FD, Filenames[I]); 865 if (EC) 866 message(LDPL_FATAL, "Could not create temporary file: %s", 867 EC.message().c_str()); 868 } else { 869 Filenames[I] = Filename; 870 if (options::Parallelism != 1) 871 Filenames[I] += utostr(I); 872 std::error_code EC = 873 sys::fs::openFileForWrite(Filenames[I], FD, sys::fs::F_None); 874 if (EC) 875 message(LDPL_FATAL, "Could not open file: %s", EC.message().c_str()); 876 } 877 OSs.emplace_back(FD, true); 878 OSPtrs[I] = &OSs.back(); 879 } 880 881 // Run backend threads. 882 splitCodeGen(std::move(M), OSPtrs, options::mcpu, Features.getString(), 883 Options, RelocationModel, CodeModel::Default, CGOptLevel); 884 } 885 886 for (auto &Filename : Filenames) { 887 if (add_input_file(Filename.c_str()) != LDPS_OK) 888 message(LDPL_FATAL, 889 "Unable to add .o file to the link. File left behind in: %s", 890 Filename.c_str()); 891 if (TempOutFile) 892 Cleanup.push_back(Filename.c_str()); 893 } 894 } 895 896 /// gold informs us that all symbols have been read. At this point, we use 897 /// get_symbols to see if any of our definitions have been overridden by a 898 /// native object file. Then, perform optimization and codegen. 899 static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) { 900 if (Modules.empty()) 901 return LDPS_OK; 902 903 LLVMContext Context; 904 Context.setDiagnosticHandler(diagnosticHandlerForContext, nullptr, true); 905 906 // If we are doing ThinLTO compilation, simply build the combined 907 // function index/summary and emit it. We don't need to parse the modules 908 // and link them in this case. 909 if (options::thinlto) { 910 FunctionInfoIndex CombinedIndex; 911 uint64_t NextModuleId = 0; 912 for (claimed_file &F : Modules) { 913 ld_plugin_input_file File; 914 if (get_input_file(F.handle, &File) != LDPS_OK) 915 message(LDPL_FATAL, "Failed to get file information"); 916 917 std::unique_ptr<FunctionInfoIndex> Index = 918 getFunctionIndexForFile(F, File); 919 920 // Skip files without a function summary. 921 if (!Index) 922 continue; 923 924 CombinedIndex.mergeFrom(std::move(Index), ++NextModuleId); 925 } 926 927 std::error_code EC; 928 raw_fd_ostream OS(output_name + ".thinlto.bc", EC, 929 sys::fs::OpenFlags::F_None); 930 if (EC) 931 message(LDPL_FATAL, "Unable to open %s.thinlto.bc for writing: %s", 932 output_name.data(), EC.message().c_str()); 933 WriteFunctionSummaryToFile(CombinedIndex, OS); 934 OS.close(); 935 936 cleanup_hook(); 937 exit(0); 938 } 939 940 std::unique_ptr<Module> Combined(new Module("ld-temp.o", Context)); 941 Linker L(*Combined, diagnosticHandler); 942 943 std::string DefaultTriple = sys::getDefaultTargetTriple(); 944 945 StringSet<> Internalize; 946 StringSet<> Maybe; 947 for (claimed_file &F : Modules) { 948 ld_plugin_input_file File; 949 if (get_input_file(F.handle, &File) != LDPS_OK) 950 message(LDPL_FATAL, "Failed to get file information"); 951 std::unique_ptr<Module> M = 952 getModuleForFile(Context, F, File, ApiFile, Internalize, Maybe); 953 if (!options::triple.empty()) 954 M->setTargetTriple(options::triple.c_str()); 955 else if (M->getTargetTriple().empty()) { 956 M->setTargetTriple(DefaultTriple); 957 } 958 959 if (L.linkInModule(*M)) 960 message(LDPL_FATAL, "Failed to link module"); 961 if (release_input_file(F.handle) != LDPS_OK) 962 message(LDPL_FATAL, "Failed to release file information"); 963 } 964 965 for (const auto &Name : Internalize) { 966 GlobalValue *GV = Combined->getNamedValue(Name.first()); 967 if (GV) 968 internalize(*GV); 969 } 970 971 for (const auto &Name : Maybe) { 972 GlobalValue *GV = Combined->getNamedValue(Name.first()); 973 if (!GV) 974 continue; 975 GV->setLinkage(GlobalValue::LinkOnceODRLinkage); 976 if (canBeOmittedFromSymbolTable(GV)) 977 internalize(*GV); 978 } 979 980 if (options::TheOutputType == options::OT_DISABLE) 981 return LDPS_OK; 982 983 if (options::TheOutputType != options::OT_NORMAL) { 984 std::string path; 985 if (options::TheOutputType == options::OT_BC_ONLY) 986 path = output_name; 987 else 988 path = output_name + ".bc"; 989 saveBCFile(path, *Combined); 990 if (options::TheOutputType == options::OT_BC_ONLY) 991 return LDPS_OK; 992 } 993 994 codegen(std::move(Combined)); 995 996 if (!options::extra_library_path.empty() && 997 set_extra_library_path(options::extra_library_path.c_str()) != LDPS_OK) 998 message(LDPL_FATAL, "Unable to set the extra library path."); 999 1000 return LDPS_OK; 1001 } 1002 1003 static ld_plugin_status all_symbols_read_hook(void) { 1004 ld_plugin_status Ret; 1005 if (!options::generate_api_file) { 1006 Ret = allSymbolsReadHook(nullptr); 1007 } else { 1008 std::error_code EC; 1009 raw_fd_ostream ApiFile("apifile.txt", EC, sys::fs::F_None); 1010 if (EC) 1011 message(LDPL_FATAL, "Unable to open apifile.txt for writing: %s", 1012 EC.message().c_str()); 1013 Ret = allSymbolsReadHook(&ApiFile); 1014 } 1015 1016 llvm_shutdown(); 1017 1018 if (options::TheOutputType == options::OT_BC_ONLY || 1019 options::TheOutputType == options::OT_DISABLE) { 1020 if (options::TheOutputType == options::OT_DISABLE) 1021 // Remove the output file here since ld.bfd creates the output file 1022 // early. 1023 sys::fs::remove(output_name); 1024 exit(0); 1025 } 1026 1027 return Ret; 1028 } 1029 1030 static ld_plugin_status cleanup_hook(void) { 1031 for (std::string &Name : Cleanup) { 1032 std::error_code EC = sys::fs::remove(Name); 1033 if (EC) 1034 message(LDPL_ERROR, "Failed to delete '%s': %s", Name.c_str(), 1035 EC.message().c_str()); 1036 } 1037 1038 return LDPS_OK; 1039 } 1040