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