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/ADT/StringSet.h" 16#include "llvm/Analysis/TargetLibraryInfo.h" 17#include "llvm/Analysis/TargetTransformInfo.h" 18#include "llvm/Bitcode/ReaderWriter.h" 19#include "llvm/CodeGen/Analysis.h" 20#include "llvm/CodeGen/CommandFlags.h" 21#include "llvm/CodeGen/ParallelCG.h" 22#include "llvm/Config/config.h" // plugin-api.h requires HAVE_STDINT_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/LTO/LTO.h" 32#include "llvm/Linker/IRMover.h" 33#include "llvm/MC/SubtargetFeature.h" 34#include "llvm/Object/IRObjectFile.h" 35#include "llvm/Object/ModuleSummaryIndexObjectFile.h" 36#include "llvm/Support/Host.h" 37#include "llvm/Support/ManagedStatic.h" 38#include "llvm/Support/MemoryBuffer.h" 39#include "llvm/Support/Path.h" 40#include "llvm/Support/TargetRegistry.h" 41#include "llvm/Support/TargetSelect.h" 42#include "llvm/Support/ThreadPool.h" 43#include "llvm/Support/raw_ostream.h" 44#include "llvm/Support/thread.h" 45#include "llvm/Transforms/IPO.h" 46#include "llvm/Transforms/IPO/FunctionImport.h" 47#include "llvm/Transforms/IPO/PassManagerBuilder.h" 48#include "llvm/Transforms/Utils/FunctionImportUtils.h" 49#include "llvm/Transforms/Utils/GlobalStatus.h" 50#include "llvm/Transforms/Utils/ValueMapper.h" 51#include <list> 52#include <plugin-api.h> 53#include <system_error> 54#include <utility> 55#include <vector> 56 57// FIXME: remove this declaration when we stop maintaining Ubuntu Quantal and 58// Precise and Debian Wheezy (binutils 2.23 is required) 59#define LDPO_PIE 3 60 61#define LDPT_GET_SYMBOLS_V3 28 62 63using namespace llvm; 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_release_input_file release_input_file = nullptr; 72static ld_plugin_get_input_file get_input_file = nullptr; 73static ld_plugin_message message = discard_message; 74 75namespace { 76struct claimed_file { 77 void *handle; 78 void *leader_handle; 79 std::vector<ld_plugin_symbol> syms; 80 off_t filesize; 81 std::string name; 82}; 83 84/// RAII wrapper to manage opening and releasing of a ld_plugin_input_file. 85struct PluginInputFile { 86 void *Handle; 87 std::unique_ptr<ld_plugin_input_file> File; 88 89 PluginInputFile(void *Handle) : Handle(Handle) { 90 File = llvm::make_unique<ld_plugin_input_file>(); 91 if (get_input_file(Handle, File.get()) != LDPS_OK) 92 message(LDPL_FATAL, "Failed to get file information"); 93 } 94 ~PluginInputFile() { 95 // File would have been reset to nullptr if we moved this object 96 // to a new owner. 97 if (File) 98 if (release_input_file(Handle) != LDPS_OK) 99 message(LDPL_FATAL, "Failed to release file information"); 100 } 101 102 ld_plugin_input_file &file() { return *File; } 103 104 PluginInputFile(PluginInputFile &&RHS) = default; 105 PluginInputFile &operator=(PluginInputFile &&RHS) = default; 106}; 107 108struct ResolutionInfo { 109 uint64_t CommonSize = 0; 110 unsigned CommonAlign = 0; 111 bool IsLinkonceOdr = true; 112 GlobalValue::UnnamedAddr UnnamedAddr = GlobalValue::UnnamedAddr::Global; 113 GlobalValue::VisibilityTypes Visibility = GlobalValue::DefaultVisibility; 114 bool CommonInternal = false; 115 bool UseCommon = false; 116}; 117 118/// Class to own information used by a task or during its cleanup for a 119/// ThinLTO backend instantiation. 120class ThinLTOTaskInfo { 121 /// The output stream the task will codegen into. 122 std::unique_ptr<raw_fd_ostream> OS; 123 124 /// The file name corresponding to the output stream, used during cleanup. 125 std::string Filename; 126 127 /// Flag indicating whether the output file is a temp file that must be 128 /// added to the cleanup list during cleanup. 129 bool TempOutFile; 130 131public: 132 ThinLTOTaskInfo(std::unique_ptr<raw_fd_ostream> OS, std::string Filename, 133 bool TempOutFile) 134 : OS(std::move(OS)), Filename(std::move(Filename)), 135 TempOutFile(TempOutFile) {} 136 137 /// Performs task related cleanup activities that must be done 138 /// single-threaded (i.e. call backs to gold). 139 void cleanup(); 140}; 141} 142 143static ld_plugin_add_symbols add_symbols = nullptr; 144static ld_plugin_get_symbols get_symbols = nullptr; 145static ld_plugin_add_input_file add_input_file = nullptr; 146static ld_plugin_set_extra_library_path set_extra_library_path = nullptr; 147static ld_plugin_get_view get_view = nullptr; 148static Optional<Reloc::Model> RelocationModel; 149static std::string output_name = ""; 150static std::list<claimed_file> Modules; 151static DenseMap<int, void *> FDToLeaderHandle; 152static StringMap<ResolutionInfo> ResInfo; 153static std::vector<std::string> Cleanup; 154static llvm::TargetOptions TargetOpts; 155static std::string DefaultTriple = sys::getDefaultTargetTriple(); 156 157namespace options { 158 enum OutputType { 159 OT_NORMAL, 160 OT_DISABLE, 161 OT_BC_ONLY, 162 OT_SAVE_TEMPS 163 }; 164 static bool generate_api_file = false; 165 static OutputType TheOutputType = OT_NORMAL; 166 static unsigned OptLevel = 2; 167 // Default parallelism of 0 used to indicate that user did not specify. 168 // Actual parallelism default value depends on implementation. 169 // Currently, code generation defaults to no parallelism, whereas 170 // ThinLTO uses the hardware_concurrency as the default. 171 static unsigned Parallelism = 0; 172#ifdef NDEBUG 173 static bool DisableVerify = true; 174#else 175 static bool DisableVerify = false; 176#endif 177 static std::string obj_path; 178 static std::string extra_library_path; 179 static std::string triple; 180 static std::string mcpu; 181 // When the thinlto plugin option is specified, only read the function 182 // the information from intermediate files and write a combined 183 // global index for the ThinLTO backends. 184 static bool thinlto = false; 185 // If false, all ThinLTO backend compilations through code gen are performed 186 // using multiple threads in the gold-plugin, before handing control back to 187 // gold. If true, write individual backend index files which reflect 188 // the import decisions, and exit afterwards. The assumption is 189 // that the build system will launch the backend processes. 190 static bool thinlto_index_only = false; 191 // If true, when generating individual index files for distributed backends, 192 // also generate a "${bitcodefile}.imports" file at the same location for each 193 // bitcode file, listing the files it imports from in plain text. This is to 194 // support distributed build file staging. 195 static bool thinlto_emit_imports_files = false; 196 // Option to control where files for a distributed backend (the individual 197 // index files and optional imports files) are created. 198 // If specified, expects a string of the form "oldprefix:newprefix", and 199 // instead of generating these files in the same directory path as the 200 // corresponding bitcode file, will use a path formed by replacing the 201 // bitcode file's path prefix matching oldprefix with newprefix. 202 static std::string thinlto_prefix_replace; 203 // Additional options to pass into the code generator. 204 // Note: This array will contain all plugin options which are not claimed 205 // as plugin exclusive to pass to the code generator. 206 // For example, "generate-api-file" and "as"options are for the plugin 207 // use only and will not be passed. 208 static std::vector<const char *> extra; 209 210 static void process_plugin_option(const char *opt_) 211 { 212 if (opt_ == nullptr) 213 return; 214 llvm::StringRef opt = opt_; 215 216 if (opt == "generate-api-file") { 217 generate_api_file = true; 218 } else if (opt.startswith("mcpu=")) { 219 mcpu = opt.substr(strlen("mcpu=")); 220 } else if (opt.startswith("extra-library-path=")) { 221 extra_library_path = opt.substr(strlen("extra_library_path=")); 222 } else if (opt.startswith("mtriple=")) { 223 triple = opt.substr(strlen("mtriple=")); 224 } else if (opt.startswith("obj-path=")) { 225 obj_path = opt.substr(strlen("obj-path=")); 226 } else if (opt == "emit-llvm") { 227 TheOutputType = OT_BC_ONLY; 228 } else if (opt == "save-temps") { 229 TheOutputType = OT_SAVE_TEMPS; 230 } else if (opt == "disable-output") { 231 TheOutputType = OT_DISABLE; 232 } else if (opt == "thinlto") { 233 thinlto = true; 234 } else if (opt == "thinlto-index-only") { 235 thinlto_index_only = true; 236 } else if (opt == "thinlto-emit-imports-files") { 237 thinlto_emit_imports_files = true; 238 } else if (opt.startswith("thinlto-prefix-replace=")) { 239 thinlto_prefix_replace = opt.substr(strlen("thinlto-prefix-replace=")); 240 if (thinlto_prefix_replace.find(";") == std::string::npos) 241 message(LDPL_FATAL, "thinlto-prefix-replace expects 'old;new' format"); 242 } else if (opt.size() == 2 && opt[0] == 'O') { 243 if (opt[1] < '0' || opt[1] > '3') 244 message(LDPL_FATAL, "Optimization level must be between 0 and 3"); 245 OptLevel = opt[1] - '0'; 246 } else if (opt.startswith("jobs=")) { 247 if (StringRef(opt_ + 5).getAsInteger(10, Parallelism)) 248 message(LDPL_FATAL, "Invalid parallelism level: %s", opt_ + 5); 249 } else if (opt == "disable-verify") { 250 DisableVerify = true; 251 } else { 252 // Save this option to pass to the code generator. 253 // ParseCommandLineOptions() expects argv[0] to be program name. Lazily 254 // add that. 255 if (extra.empty()) 256 extra.push_back("LLVMgold"); 257 258 extra.push_back(opt_); 259 } 260 } 261} 262 263static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file, 264 int *claimed); 265static ld_plugin_status all_symbols_read_hook(void); 266static ld_plugin_status cleanup_hook(void); 267 268extern "C" ld_plugin_status onload(ld_plugin_tv *tv); 269ld_plugin_status onload(ld_plugin_tv *tv) { 270 InitializeAllTargetInfos(); 271 InitializeAllTargets(); 272 InitializeAllTargetMCs(); 273 InitializeAllAsmParsers(); 274 InitializeAllAsmPrinters(); 275 276 // We're given a pointer to the first transfer vector. We read through them 277 // until we find one where tv_tag == LDPT_NULL. The REGISTER_* tagged values 278 // contain pointers to functions that we need to call to register our own 279 // hooks. The others are addresses of functions we can use to call into gold 280 // for services. 281 282 bool registeredClaimFile = false; 283 bool RegisteredAllSymbolsRead = false; 284 285 for (; tv->tv_tag != LDPT_NULL; ++tv) { 286 // Cast tv_tag to int to allow values not in "enum ld_plugin_tag", like, for 287 // example, LDPT_GET_SYMBOLS_V3 when building against an older plugin-api.h 288 // header. 289 switch (static_cast<int>(tv->tv_tag)) { 290 case LDPT_OUTPUT_NAME: 291 output_name = tv->tv_u.tv_string; 292 break; 293 case LDPT_LINKER_OUTPUT: 294 switch (tv->tv_u.tv_val) { 295 case LDPO_REL: // .o 296 case LDPO_DYN: // .so 297 case LDPO_PIE: // position independent executable 298 RelocationModel = Reloc::PIC_; 299 break; 300 case LDPO_EXEC: // .exe 301 RelocationModel = Reloc::Static; 302 break; 303 default: 304 message(LDPL_ERROR, "Unknown output file type %d", tv->tv_u.tv_val); 305 return LDPS_ERR; 306 } 307 break; 308 case LDPT_OPTION: 309 options::process_plugin_option(tv->tv_u.tv_string); 310 break; 311 case LDPT_REGISTER_CLAIM_FILE_HOOK: { 312 ld_plugin_register_claim_file callback; 313 callback = tv->tv_u.tv_register_claim_file; 314 315 if (callback(claim_file_hook) != LDPS_OK) 316 return LDPS_ERR; 317 318 registeredClaimFile = true; 319 } break; 320 case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK: { 321 ld_plugin_register_all_symbols_read callback; 322 callback = tv->tv_u.tv_register_all_symbols_read; 323 324 if (callback(all_symbols_read_hook) != LDPS_OK) 325 return LDPS_ERR; 326 327 RegisteredAllSymbolsRead = true; 328 } break; 329 case LDPT_REGISTER_CLEANUP_HOOK: { 330 ld_plugin_register_cleanup callback; 331 callback = tv->tv_u.tv_register_cleanup; 332 333 if (callback(cleanup_hook) != LDPS_OK) 334 return LDPS_ERR; 335 } break; 336 case LDPT_GET_INPUT_FILE: 337 get_input_file = tv->tv_u.tv_get_input_file; 338 break; 339 case LDPT_RELEASE_INPUT_FILE: 340 release_input_file = tv->tv_u.tv_release_input_file; 341 break; 342 case LDPT_ADD_SYMBOLS: 343 add_symbols = tv->tv_u.tv_add_symbols; 344 break; 345 case LDPT_GET_SYMBOLS_V2: 346 // Do not override get_symbols_v3 with get_symbols_v2. 347 if (!get_symbols) 348 get_symbols = tv->tv_u.tv_get_symbols; 349 break; 350 case LDPT_GET_SYMBOLS_V3: 351 get_symbols = tv->tv_u.tv_get_symbols; 352 break; 353 case LDPT_ADD_INPUT_FILE: 354 add_input_file = tv->tv_u.tv_add_input_file; 355 break; 356 case LDPT_SET_EXTRA_LIBRARY_PATH: 357 set_extra_library_path = tv->tv_u.tv_set_extra_library_path; 358 break; 359 case LDPT_GET_VIEW: 360 get_view = tv->tv_u.tv_get_view; 361 break; 362 case LDPT_MESSAGE: 363 message = tv->tv_u.tv_message; 364 break; 365 default: 366 break; 367 } 368 } 369 370 if (!registeredClaimFile) { 371 message(LDPL_ERROR, "register_claim_file not passed to LLVMgold."); 372 return LDPS_ERR; 373 } 374 if (!add_symbols) { 375 message(LDPL_ERROR, "add_symbols not passed to LLVMgold."); 376 return LDPS_ERR; 377 } 378 379 if (!RegisteredAllSymbolsRead) 380 return LDPS_OK; 381 382 if (!get_input_file) { 383 message(LDPL_ERROR, "get_input_file not passed to LLVMgold."); 384 return LDPS_ERR; 385 } 386 if (!release_input_file) { 387 message(LDPL_ERROR, "release_input_file not passed to LLVMgold."); 388 return LDPS_ERR; 389 } 390 391 return LDPS_OK; 392} 393 394static const GlobalObject *getBaseObject(const GlobalValue &GV) { 395 if (auto *GA = dyn_cast<GlobalAlias>(&GV)) 396 return GA->getBaseObject(); 397 return cast<GlobalObject>(&GV); 398} 399 400static bool shouldSkip(uint32_t Symflags) { 401 if (!(Symflags & object::BasicSymbolRef::SF_Global)) 402 return true; 403 if (Symflags & object::BasicSymbolRef::SF_FormatSpecific) 404 return true; 405 return false; 406} 407 408static void diagnosticHandler(const DiagnosticInfo &DI) { 409 if (const auto *BDI = dyn_cast<BitcodeDiagnosticInfo>(&DI)) { 410 std::error_code EC = BDI->getError(); 411 if (EC == BitcodeError::InvalidBitcodeSignature) 412 return; 413 } 414 415 std::string ErrStorage; 416 { 417 raw_string_ostream OS(ErrStorage); 418 DiagnosticPrinterRawOStream DP(OS); 419 DI.print(DP); 420 } 421 ld_plugin_level Level; 422 switch (DI.getSeverity()) { 423 case DS_Error: 424 message(LDPL_FATAL, "LLVM gold plugin has failed to create LTO module: %s", 425 ErrStorage.c_str()); 426 case DS_Warning: 427 Level = LDPL_WARNING; 428 break; 429 case DS_Note: 430 case DS_Remark: 431 Level = LDPL_INFO; 432 break; 433 } 434 message(Level, "LLVM gold plugin: %s", ErrStorage.c_str()); 435} 436 437static void diagnosticHandlerForContext(const DiagnosticInfo &DI, 438 void *Context) { 439 diagnosticHandler(DI); 440} 441 442static GlobalValue::VisibilityTypes 443getMinVisibility(GlobalValue::VisibilityTypes A, 444 GlobalValue::VisibilityTypes B) { 445 if (A == GlobalValue::HiddenVisibility) 446 return A; 447 if (B == GlobalValue::HiddenVisibility) 448 return B; 449 if (A == GlobalValue::ProtectedVisibility) 450 return A; 451 return B; 452} 453 454/// Called by gold to see whether this file is one that our plugin can handle. 455/// We'll try to open it and register all the symbols with add_symbol if 456/// possible. 457static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file, 458 int *claimed) { 459 LLVMContext Context; 460 MemoryBufferRef BufferRef; 461 std::unique_ptr<MemoryBuffer> Buffer; 462 if (get_view) { 463 const void *view; 464 if (get_view(file->handle, &view) != LDPS_OK) { 465 message(LDPL_ERROR, "Failed to get a view of %s", file->name); 466 return LDPS_ERR; 467 } 468 BufferRef = 469 MemoryBufferRef(StringRef((const char *)view, file->filesize), ""); 470 } else { 471 int64_t offset = 0; 472 // Gold has found what might be IR part-way inside of a file, such as 473 // an .a archive. 474 if (file->offset) { 475 offset = file->offset; 476 } 477 ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr = 478 MemoryBuffer::getOpenFileSlice(file->fd, file->name, file->filesize, 479 offset); 480 if (std::error_code EC = BufferOrErr.getError()) { 481 message(LDPL_ERROR, EC.message().c_str()); 482 return LDPS_ERR; 483 } 484 Buffer = std::move(BufferOrErr.get()); 485 BufferRef = Buffer->getMemBufferRef(); 486 } 487 488 Context.setDiagnosticHandler(diagnosticHandlerForContext); 489 ErrorOr<std::unique_ptr<object::IRObjectFile>> ObjOrErr = 490 object::IRObjectFile::create(BufferRef, Context); 491 std::error_code EC = ObjOrErr.getError(); 492 if (EC == object::object_error::invalid_file_type || 493 EC == object::object_error::bitcode_section_not_found) 494 return LDPS_OK; 495 496 *claimed = 1; 497 498 if (EC) { 499 message(LDPL_ERROR, "LLVM gold plugin has failed to create LTO module: %s", 500 EC.message().c_str()); 501 return LDPS_ERR; 502 } 503 std::unique_ptr<object::IRObjectFile> Obj = std::move(*ObjOrErr); 504 505 Modules.resize(Modules.size() + 1); 506 claimed_file &cf = Modules.back(); 507 508 cf.handle = file->handle; 509 // Keep track of the first handle for each file descriptor, since there are 510 // multiple in the case of an archive. This is used later in the case of 511 // ThinLTO parallel backends to ensure that each file is only opened and 512 // released once. 513 auto LeaderHandle = 514 FDToLeaderHandle.insert(std::make_pair(file->fd, file->handle)).first; 515 cf.leader_handle = LeaderHandle->second; 516 // Save the filesize since for parallel ThinLTO backends we can only 517 // invoke get_input_file once per archive (only for the leader handle). 518 cf.filesize = file->filesize; 519 // In the case of an archive library, all but the first member must have a 520 // non-zero offset, which we can append to the file name to obtain a 521 // unique name. 522 cf.name = file->name; 523 if (file->offset) 524 cf.name += ".llvm." + std::to_string(file->offset) + "." + 525 sys::path::filename(Obj->getModule().getSourceFileName()).str(); 526 527 for (auto &Sym : Obj->symbols()) { 528 uint32_t Symflags = Sym.getFlags(); 529 if (shouldSkip(Symflags)) 530 continue; 531 532 cf.syms.push_back(ld_plugin_symbol()); 533 ld_plugin_symbol &sym = cf.syms.back(); 534 sym.version = nullptr; 535 536 SmallString<64> Name; 537 { 538 raw_svector_ostream OS(Name); 539 Sym.printName(OS); 540 } 541 sym.name = strdup(Name.c_str()); 542 543 const GlobalValue *GV = Obj->getSymbolGV(Sym.getRawDataRefImpl()); 544 545 ResolutionInfo &Res = ResInfo[sym.name]; 546 547 sym.visibility = LDPV_DEFAULT; 548 if (GV) { 549 Res.UnnamedAddr = 550 GlobalValue::getMinUnnamedAddr(Res.UnnamedAddr, GV->getUnnamedAddr()); 551 Res.IsLinkonceOdr &= GV->hasLinkOnceLinkage(); 552 Res.Visibility = getMinVisibility(Res.Visibility, GV->getVisibility()); 553 switch (GV->getVisibility()) { 554 case GlobalValue::DefaultVisibility: 555 break; 556 case GlobalValue::HiddenVisibility: 557 sym.visibility = LDPV_HIDDEN; 558 break; 559 case GlobalValue::ProtectedVisibility: 560 sym.visibility = LDPV_PROTECTED; 561 break; 562 } 563 } 564 565 if (Symflags & object::BasicSymbolRef::SF_Undefined) { 566 sym.def = LDPK_UNDEF; 567 if (GV && GV->hasExternalWeakLinkage()) 568 sym.def = LDPK_WEAKUNDEF; 569 } else { 570 sym.def = LDPK_DEF; 571 if (GV) { 572 assert(!GV->hasExternalWeakLinkage() && 573 !GV->hasAvailableExternallyLinkage() && "Not a declaration!"); 574 if (GV->hasCommonLinkage()) 575 sym.def = LDPK_COMMON; 576 else if (GV->isWeakForLinker()) 577 sym.def = LDPK_WEAKDEF; 578 } 579 } 580 581 sym.size = 0; 582 sym.comdat_key = nullptr; 583 if (GV) { 584 const GlobalObject *Base = getBaseObject(*GV); 585 if (!Base) 586 message(LDPL_FATAL, "Unable to determine comdat of alias!"); 587 const Comdat *C = Base->getComdat(); 588 if (C) 589 sym.comdat_key = strdup(C->getName().str().c_str()); 590 } 591 592 sym.resolution = LDPR_UNKNOWN; 593 } 594 595 if (!cf.syms.empty()) { 596 if (add_symbols(cf.handle, cf.syms.size(), cf.syms.data()) != LDPS_OK) { 597 message(LDPL_ERROR, "Unable to add symbols!"); 598 return LDPS_ERR; 599 } 600 } 601 602 return LDPS_OK; 603} 604 605static void internalize(GlobalValue &GV) { 606 if (GV.isDeclarationForLinker()) 607 return; // We get here if there is a matching asm definition. 608 if (!GV.hasLocalLinkage()) 609 GV.setLinkage(GlobalValue::InternalLinkage); 610} 611 612static const char *getResolutionName(ld_plugin_symbol_resolution R) { 613 switch (R) { 614 case LDPR_UNKNOWN: 615 return "UNKNOWN"; 616 case LDPR_UNDEF: 617 return "UNDEF"; 618 case LDPR_PREVAILING_DEF: 619 return "PREVAILING_DEF"; 620 case LDPR_PREVAILING_DEF_IRONLY: 621 return "PREVAILING_DEF_IRONLY"; 622 case LDPR_PREEMPTED_REG: 623 return "PREEMPTED_REG"; 624 case LDPR_PREEMPTED_IR: 625 return "PREEMPTED_IR"; 626 case LDPR_RESOLVED_IR: 627 return "RESOLVED_IR"; 628 case LDPR_RESOLVED_EXEC: 629 return "RESOLVED_EXEC"; 630 case LDPR_RESOLVED_DYN: 631 return "RESOLVED_DYN"; 632 case LDPR_PREVAILING_DEF_IRONLY_EXP: 633 return "PREVAILING_DEF_IRONLY_EXP"; 634 } 635 llvm_unreachable("Unknown resolution"); 636} 637 638static void freeSymName(ld_plugin_symbol &Sym) { 639 free(Sym.name); 640 free(Sym.comdat_key); 641 Sym.name = nullptr; 642 Sym.comdat_key = nullptr; 643} 644 645/// Helper to get a file's symbols and a view into it via gold callbacks. 646static const void *getSymbolsAndView(claimed_file &F) { 647 ld_plugin_status status = get_symbols(F.handle, F.syms.size(), F.syms.data()); 648 if (status == LDPS_NO_SYMS) 649 return nullptr; 650 651 if (status != LDPS_OK) 652 message(LDPL_FATAL, "Failed to get symbol information"); 653 654 const void *View; 655 if (get_view(F.handle, &View) != LDPS_OK) 656 message(LDPL_FATAL, "Failed to get a view of file"); 657 658 return View; 659} 660 661static std::unique_ptr<ModuleSummaryIndex> 662getModuleSummaryIndexForFile(claimed_file &F) { 663 const void *View = getSymbolsAndView(F); 664 if (!View) 665 return nullptr; 666 667 MemoryBufferRef BufferRef(StringRef((const char *)View, F.filesize), F.name); 668 669 // Don't bother trying to build an index if there is no summary information 670 // in this bitcode file. 671 if (!object::ModuleSummaryIndexObjectFile::hasGlobalValueSummaryInMemBuffer( 672 BufferRef, diagnosticHandler)) 673 return std::unique_ptr<ModuleSummaryIndex>(nullptr); 674 675 ErrorOr<std::unique_ptr<object::ModuleSummaryIndexObjectFile>> ObjOrErr = 676 object::ModuleSummaryIndexObjectFile::create(BufferRef, 677 diagnosticHandler); 678 679 if (std::error_code EC = ObjOrErr.getError()) 680 message(LDPL_FATAL, 681 "Could not read module summary index bitcode from file : %s", 682 EC.message().c_str()); 683 684 object::ModuleSummaryIndexObjectFile &Obj = **ObjOrErr; 685 686 return Obj.takeIndex(); 687} 688 689static std::unique_ptr<Module> 690getModuleForFile(LLVMContext &Context, claimed_file &F, const void *View, 691 StringRef Name, raw_fd_ostream *ApiFile, 692 StringSet<> &Internalize, std::vector<GlobalValue *> &Keep, 693 StringMap<unsigned> &Realign) { 694 MemoryBufferRef BufferRef(StringRef((const char *)View, F.filesize), Name); 695 ErrorOr<std::unique_ptr<object::IRObjectFile>> ObjOrErr = 696 object::IRObjectFile::create(BufferRef, Context); 697 698 if (std::error_code EC = ObjOrErr.getError()) 699 message(LDPL_FATAL, "Could not read bitcode from file : %s", 700 EC.message().c_str()); 701 702 object::IRObjectFile &Obj = **ObjOrErr; 703 704 Module &M = Obj.getModule(); 705 706 M.materializeMetadata(); 707 UpgradeDebugInfo(M); 708 709 SmallPtrSet<GlobalValue *, 8> Used; 710 collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); 711 712 unsigned SymNum = 0; 713 for (auto &ObjSym : Obj.symbols()) { 714 GlobalValue *GV = Obj.getSymbolGV(ObjSym.getRawDataRefImpl()); 715 if (GV && GV->hasAppendingLinkage()) 716 Keep.push_back(GV); 717 718 if (shouldSkip(ObjSym.getFlags())) 719 continue; 720 ld_plugin_symbol &Sym = F.syms[SymNum]; 721 ++SymNum; 722 723 ld_plugin_symbol_resolution Resolution = 724 (ld_plugin_symbol_resolution)Sym.resolution; 725 726 if (options::generate_api_file) 727 *ApiFile << Sym.name << ' ' << getResolutionName(Resolution) << '\n'; 728 729 if (!GV) { 730 freeSymName(Sym); 731 continue; // Asm symbol. 732 } 733 734 ResolutionInfo &Res = ResInfo[Sym.name]; 735 if (Resolution == LDPR_PREVAILING_DEF_IRONLY_EXP && !Res.IsLinkonceOdr) 736 Resolution = LDPR_PREVAILING_DEF; 737 738 GV->setUnnamedAddr(Res.UnnamedAddr); 739 GV->setVisibility(Res.Visibility); 740 741 // Override gold's resolution for common symbols. We want the largest 742 // one to win. 743 if (GV->hasCommonLinkage()) { 744 if (Resolution == LDPR_PREVAILING_DEF_IRONLY) 745 Res.CommonInternal = true; 746 747 if (Resolution == LDPR_PREVAILING_DEF_IRONLY || 748 Resolution == LDPR_PREVAILING_DEF) 749 Res.UseCommon = true; 750 751 const DataLayout &DL = GV->getParent()->getDataLayout(); 752 uint64_t Size = DL.getTypeAllocSize(GV->getType()->getElementType()); 753 unsigned Align = GV->getAlignment(); 754 755 if (Res.UseCommon && Size >= Res.CommonSize) { 756 // Take GV. 757 if (Res.CommonInternal) 758 Resolution = LDPR_PREVAILING_DEF_IRONLY; 759 else 760 Resolution = LDPR_PREVAILING_DEF; 761 cast<GlobalVariable>(GV)->setAlignment( 762 std::max(Res.CommonAlign, Align)); 763 } else { 764 // Do not take GV, it's smaller than what we already have in the 765 // combined module. 766 Resolution = LDPR_PREEMPTED_IR; 767 if (Align > Res.CommonAlign) 768 // Need to raise the alignment though. 769 Realign[Sym.name] = Align; 770 } 771 772 Res.CommonSize = std::max(Res.CommonSize, Size); 773 Res.CommonAlign = std::max(Res.CommonAlign, Align); 774 } 775 776 switch (Resolution) { 777 case LDPR_UNKNOWN: 778 llvm_unreachable("Unexpected resolution"); 779 780 case LDPR_RESOLVED_IR: 781 case LDPR_RESOLVED_EXEC: 782 case LDPR_RESOLVED_DYN: 783 case LDPR_PREEMPTED_IR: 784 case LDPR_PREEMPTED_REG: 785 break; 786 787 case LDPR_UNDEF: 788 if (!GV->isDeclarationForLinker()) 789 assert(GV->hasComdat()); 790 break; 791 792 case LDPR_PREVAILING_DEF_IRONLY: { 793 Keep.push_back(GV); 794 // The IR linker has to be able to map this value to a declaration, 795 // so we can only internalize after linking. 796 if (!Used.count(GV)) 797 Internalize.insert(GV->getName()); 798 break; 799 } 800 801 case LDPR_PREVAILING_DEF: 802 Keep.push_back(GV); 803 // There is a non IR use, so we have to force optimizations to keep this. 804 switch (GV->getLinkage()) { 805 default: 806 break; 807 case GlobalValue::LinkOnceAnyLinkage: 808 GV->setLinkage(GlobalValue::WeakAnyLinkage); 809 break; 810 case GlobalValue::LinkOnceODRLinkage: 811 GV->setLinkage(GlobalValue::WeakODRLinkage); 812 break; 813 } 814 break; 815 816 case LDPR_PREVAILING_DEF_IRONLY_EXP: { 817 Keep.push_back(GV); 818 if (canBeOmittedFromSymbolTable(GV)) 819 Internalize.insert(GV->getName()); 820 break; 821 } 822 } 823 824 freeSymName(Sym); 825 } 826 827 return Obj.takeModule(); 828} 829 830static void saveBCFile(StringRef Path, Module &M) { 831 std::error_code EC; 832 raw_fd_ostream OS(Path, EC, sys::fs::OpenFlags::F_None); 833 if (EC) 834 message(LDPL_FATAL, "Failed to write the output file."); 835 WriteBitcodeToFile(&M, OS, /* ShouldPreserveUseListOrder */ false); 836} 837 838static void recordFile(std::string Filename, bool TempOutFile) { 839 if (add_input_file(Filename.c_str()) != LDPS_OK) 840 message(LDPL_FATAL, 841 "Unable to add .o file to the link. File left behind in: %s", 842 Filename.c_str()); 843 if (TempOutFile) 844 Cleanup.push_back(Filename.c_str()); 845} 846 847void ThinLTOTaskInfo::cleanup() { 848 // Close the output file descriptor before we pass it to gold. 849 OS->close(); 850 851 recordFile(Filename, TempOutFile); 852} 853 854namespace { 855/// Class to manage optimization and code generation for a module, possibly 856/// in a thread (ThinLTO). 857class CodeGen { 858 /// The module for which this will generate code. 859 std::unique_ptr<llvm::Module> M; 860 861 /// The output stream to generate code into. 862 raw_fd_ostream *OS; 863 864 /// The task ID when this was invoked in a thread (ThinLTO). 865 int TaskID; 866 867 /// The module summary index for ThinLTO tasks. 868 const ModuleSummaryIndex *CombinedIndex; 869 870 /// The target machine for generating code for this module. 871 std::unique_ptr<TargetMachine> TM; 872 873 /// Filename to use as base when save-temps is enabled, used to get 874 /// a unique and identifiable save-temps output file for each ThinLTO backend. 875 std::string SaveTempsFilename; 876 877 /// Map from a module name to the corresponding buffer holding a view of the 878 /// bitcode provided via the get_view gold callback. 879 StringMap<MemoryBufferRef> *ModuleMap; 880 881 // Functions to import into this module. 882 FunctionImporter::ImportMapTy *ImportList; 883 884 // Map of globals defined in this module to their summary. 885 std::map<GlobalValue::GUID, GlobalValueSummary *> *DefinedGlobals; 886 887public: 888 /// Constructor used by full LTO. 889 CodeGen(std::unique_ptr<llvm::Module> M) 890 : M(std::move(M)), OS(nullptr), TaskID(-1), CombinedIndex(nullptr), 891 ModuleMap(nullptr) { 892 initTargetMachine(); 893 } 894 /// Constructor used by ThinLTO. 895 CodeGen(std::unique_ptr<llvm::Module> M, raw_fd_ostream *OS, int TaskID, 896 const ModuleSummaryIndex *CombinedIndex, std::string Filename, 897 StringMap<MemoryBufferRef> *ModuleMap, 898 FunctionImporter::ImportMapTy *ImportList, 899 std::map<GlobalValue::GUID, GlobalValueSummary *> *DefinedGlobals) 900 : M(std::move(M)), OS(OS), TaskID(TaskID), CombinedIndex(CombinedIndex), 901 SaveTempsFilename(std::move(Filename)), ModuleMap(ModuleMap), 902 ImportList(ImportList), DefinedGlobals(DefinedGlobals) { 903 assert(options::thinlto == !!CombinedIndex && 904 "Expected module summary index iff performing ThinLTO"); 905 initTargetMachine(); 906 } 907 908 /// Invoke LTO passes and the code generator for the module. 909 void runAll(); 910 911 /// Invoke the actual code generation to emit Module's object to file. 912 void runCodegenPasses(); 913 914private: 915 const Target *TheTarget; 916 std::string TripleStr; 917 std::string FeaturesString; 918 TargetOptions Options; 919 920 /// Create a target machine for the module. Must be unique for each 921 /// module/task. 922 void initTargetMachine(); 923 924 std::unique_ptr<TargetMachine> createTargetMachine(); 925 926 /// Run all LTO passes on the module. 927 void runLTOPasses(); 928 929 /// Sets up output files necessary to perform optional multi-threaded 930 /// split code generation, and invokes the code generation implementation. 931 /// If BCFileName is not empty, saves bitcode for module partitions into 932 /// {BCFileName}0 .. {BCFileName}N. 933 void runSplitCodeGen(const SmallString<128> &BCFilename); 934}; 935} 936 937static SubtargetFeatures getFeatures(Triple &TheTriple) { 938 SubtargetFeatures Features; 939 Features.getDefaultSubtargetFeatures(TheTriple); 940 for (const std::string &A : MAttrs) 941 Features.AddFeature(A); 942 return Features; 943} 944 945static CodeGenOpt::Level getCGOptLevel() { 946 switch (options::OptLevel) { 947 case 0: 948 return CodeGenOpt::None; 949 case 1: 950 return CodeGenOpt::Less; 951 case 2: 952 return CodeGenOpt::Default; 953 case 3: 954 return CodeGenOpt::Aggressive; 955 } 956 llvm_unreachable("Invalid optimization level"); 957} 958 959void CodeGen::initTargetMachine() { 960 TripleStr = M->getTargetTriple(); 961 Triple TheTriple(TripleStr); 962 963 std::string ErrMsg; 964 TheTarget = TargetRegistry::lookupTarget(TripleStr, ErrMsg); 965 if (!TheTarget) 966 message(LDPL_FATAL, "Target not found: %s", ErrMsg.c_str()); 967 968 SubtargetFeatures Features = getFeatures(TheTriple); 969 FeaturesString = Features.getString(); 970 Options = InitTargetOptionsFromCodeGenFlags(); 971 972 // Disable the new X86 relax relocations since gold might not support them. 973 // FIXME: Check the gold version or add a new option to enable them. 974 Options.RelaxELFRelocations = false; 975 976 TM = createTargetMachine(); 977} 978 979std::unique_ptr<TargetMachine> CodeGen::createTargetMachine() { 980 CodeGenOpt::Level CGOptLevel = getCGOptLevel(); 981 982 return std::unique_ptr<TargetMachine>(TheTarget->createTargetMachine( 983 TripleStr, options::mcpu, FeaturesString, Options, RelocationModel, 984 CodeModel::Default, CGOptLevel)); 985} 986 987void CodeGen::runLTOPasses() { 988 M->setDataLayout(TM->createDataLayout()); 989 990 if (CombinedIndex) { 991 // Apply summary-based LinkOnce/Weak resolution decisions. 992 thinLTOResolveWeakForLinkerModule(*M, *DefinedGlobals); 993 994 // Apply summary-based internalization decisions. Skip if there are no 995 // defined globals from the summary since not only is it unnecessary, but 996 // if this module did not have a summary section the internalizer will 997 // assert if it finds any definitions in this module that aren't in the 998 // DefinedGlobals set. 999 if (!DefinedGlobals->empty()) 1000 thinLTOInternalizeModule(*M, *DefinedGlobals); 1001 1002 // Create a loader that will parse the bitcode from the buffers 1003 // in the ModuleMap. 1004 ModuleLoader Loader(M->getContext(), *ModuleMap); 1005 1006 // Perform function importing. 1007 FunctionImporter Importer(*CombinedIndex, Loader); 1008 Importer.importFunctions(*M, *ImportList); 1009 } 1010 1011 legacy::PassManager passes; 1012 passes.add(createTargetTransformInfoWrapperPass(TM->getTargetIRAnalysis())); 1013 1014 PassManagerBuilder PMB; 1015 PMB.LibraryInfo = new TargetLibraryInfoImpl(Triple(TM->getTargetTriple())); 1016 PMB.Inliner = createFunctionInliningPass(); 1017 // Unconditionally verify input since it is not verified before this 1018 // point and has unknown origin. 1019 PMB.VerifyInput = true; 1020 PMB.VerifyOutput = !options::DisableVerify; 1021 PMB.LoopVectorize = true; 1022 PMB.SLPVectorize = true; 1023 PMB.OptLevel = options::OptLevel; 1024 if (options::thinlto) 1025 PMB.populateThinLTOPassManager(passes); 1026 else 1027 PMB.populateLTOPassManager(passes); 1028 passes.run(*M); 1029} 1030 1031/// Open a file and return the new file descriptor given a base input 1032/// file name, a flag indicating whether a temp file should be generated, 1033/// and an optional task id. The new filename generated is 1034/// returned in \p NewFilename. 1035static int openOutputFile(SmallString<128> InFilename, bool TempOutFile, 1036 SmallString<128> &NewFilename, int TaskID = -1) { 1037 int FD; 1038 if (TempOutFile) { 1039 std::error_code EC = 1040 sys::fs::createTemporaryFile("lto-llvm", "o", FD, NewFilename); 1041 if (EC) 1042 message(LDPL_FATAL, "Could not create temporary file: %s", 1043 EC.message().c_str()); 1044 } else { 1045 NewFilename = InFilename; 1046 if (TaskID >= 0) 1047 NewFilename += utostr(TaskID); 1048 std::error_code EC = 1049 sys::fs::openFileForWrite(NewFilename, FD, sys::fs::F_None); 1050 if (EC) 1051 message(LDPL_FATAL, "Could not open file: %s", EC.message().c_str()); 1052 } 1053 return FD; 1054} 1055 1056void CodeGen::runCodegenPasses() { 1057 assert(OS && "Output stream must be set before emitting to file"); 1058 legacy::PassManager CodeGenPasses; 1059 if (TM->addPassesToEmitFile(CodeGenPasses, *OS, 1060 TargetMachine::CGFT_ObjectFile)) 1061 report_fatal_error("Failed to setup codegen"); 1062 CodeGenPasses.run(*M); 1063} 1064 1065void CodeGen::runSplitCodeGen(const SmallString<128> &BCFilename) { 1066 SmallString<128> Filename; 1067 // Note that openOutputFile will append a unique ID for each task 1068 if (!options::obj_path.empty()) 1069 Filename = options::obj_path; 1070 else if (options::TheOutputType == options::OT_SAVE_TEMPS) 1071 Filename = output_name + ".o"; 1072 1073 // Note that the default parallelism is 1 instead of the 1074 // hardware_concurrency, as there are behavioral differences between 1075 // parallelism levels (e.g. symbol ordering will be different, and some uses 1076 // of inline asm currently have issues with parallelism >1). 1077 unsigned int MaxThreads = options::Parallelism ? options::Parallelism : 1; 1078 1079 std::vector<SmallString<128>> Filenames(MaxThreads); 1080 std::vector<SmallString<128>> BCFilenames(MaxThreads); 1081 bool TempOutFile = Filename.empty(); 1082 { 1083 // Open a file descriptor for each backend task. This is done in a block 1084 // so that the output file descriptors are closed before gold opens them. 1085 std::list<llvm::raw_fd_ostream> OSs; 1086 std::vector<llvm::raw_pwrite_stream *> OSPtrs(MaxThreads); 1087 for (unsigned I = 0; I != MaxThreads; ++I) { 1088 int FD = openOutputFile(Filename, TempOutFile, Filenames[I], 1089 // Only append ID if there are multiple tasks. 1090 MaxThreads > 1 ? I : -1); 1091 OSs.emplace_back(FD, true); 1092 OSPtrs[I] = &OSs.back(); 1093 } 1094 1095 std::list<llvm::raw_fd_ostream> BCOSs; 1096 std::vector<llvm::raw_pwrite_stream *> BCOSPtrs; 1097 if (!BCFilename.empty() && MaxThreads > 1) { 1098 for (unsigned I = 0; I != MaxThreads; ++I) { 1099 int FD = openOutputFile(BCFilename, false, BCFilenames[I], I); 1100 BCOSs.emplace_back(FD, true); 1101 BCOSPtrs.push_back(&BCOSs.back()); 1102 } 1103 } 1104 1105 // Run backend tasks. 1106 splitCodeGen(std::move(M), OSPtrs, BCOSPtrs, 1107 [&]() { return createTargetMachine(); }); 1108 } 1109 1110 for (auto &Filename : Filenames) 1111 recordFile(Filename.c_str(), TempOutFile); 1112} 1113 1114void CodeGen::runAll() { 1115 runLTOPasses(); 1116 1117 SmallString<128> OptFilename; 1118 if (options::TheOutputType == options::OT_SAVE_TEMPS) { 1119 OptFilename = output_name; 1120 // If the CodeGen client provided a filename, use it. Always expect 1121 // a provided filename if we are in a task (i.e. ThinLTO backend). 1122 assert(!SaveTempsFilename.empty() || TaskID == -1); 1123 if (!SaveTempsFilename.empty()) 1124 OptFilename = SaveTempsFilename; 1125 OptFilename += ".opt.bc"; 1126 saveBCFile(OptFilename, *M); 1127 } 1128 1129 // If we are already in a thread (i.e. ThinLTO), just perform 1130 // codegen passes directly. 1131 if (TaskID >= 0) 1132 runCodegenPasses(); 1133 // Otherwise attempt split code gen. 1134 else 1135 runSplitCodeGen(OptFilename); 1136} 1137 1138/// Links the module in \p View from file \p F into the combined module 1139/// saved in the IRMover \p L. 1140static void linkInModule(LLVMContext &Context, IRMover &L, claimed_file &F, 1141 const void *View, StringRef Name, 1142 raw_fd_ostream *ApiFile, StringSet<> &Internalize, 1143 bool SetName = false) { 1144 std::vector<GlobalValue *> Keep; 1145 StringMap<unsigned> Realign; 1146 std::unique_ptr<Module> M = getModuleForFile(Context, F, View, Name, ApiFile, 1147 Internalize, Keep, Realign); 1148 if (!M.get()) 1149 return; 1150 if (!options::triple.empty()) 1151 M->setTargetTriple(options::triple.c_str()); 1152 else if (M->getTargetTriple().empty()) { 1153 M->setTargetTriple(DefaultTriple); 1154 } 1155 1156 // For ThinLTO we want to propagate the source file name to ensure 1157 // we can create the correct global identifiers matching those in the 1158 // original module. 1159 if (SetName) 1160 L.getModule().setSourceFileName(M->getSourceFileName()); 1161 1162 if (Error E = L.move(std::move(M), Keep, 1163 [](GlobalValue &, IRMover::ValueAdder) {})) { 1164 handleAllErrors(std::move(E), [&](const llvm::ErrorInfoBase &EIB) { 1165 message(LDPL_FATAL, "Failed to link module %s: %s", Name.str().c_str(), 1166 EIB.message().c_str()); 1167 }); 1168 } 1169 1170 for (const auto &I : Realign) { 1171 GlobalValue *Dst = L.getModule().getNamedValue(I.first()); 1172 if (!Dst) 1173 continue; 1174 cast<GlobalVariable>(Dst)->setAlignment(I.second); 1175 } 1176} 1177 1178/// Perform the ThinLTO backend on a single module, invoking the LTO and codegen 1179/// pipelines. 1180static void thinLTOBackendTask(claimed_file &F, const void *View, 1181 StringRef Name, raw_fd_ostream *ApiFile, 1182 const ModuleSummaryIndex &CombinedIndex, 1183 raw_fd_ostream *OS, unsigned TaskID, 1184 StringMap<MemoryBufferRef> &ModuleMap, 1185 FunctionImporter::ImportMapTy &ImportList, 1186 std::map<GlobalValue::GUID, GlobalValueSummary *> &DefinedGlobals) { 1187 // Need to use a separate context for each task 1188 LLVMContext Context; 1189 Context.setDiscardValueNames(options::TheOutputType != 1190 options::OT_SAVE_TEMPS); 1191 Context.enableDebugTypeODRUniquing(); // Merge debug info types. 1192 Context.setDiagnosticHandler(diagnosticHandlerForContext, nullptr, true); 1193 1194 std::unique_ptr<llvm::Module> NewModule(new llvm::Module(Name, Context)); 1195 IRMover L(*NewModule.get()); 1196 1197 StringSet<> Dummy; 1198 linkInModule(Context, L, F, View, Name, ApiFile, Dummy, true); 1199 if (renameModuleForThinLTO(*NewModule, CombinedIndex)) 1200 message(LDPL_FATAL, "Failed to rename module for ThinLTO"); 1201 1202 CodeGen codeGen(std::move(NewModule), OS, TaskID, &CombinedIndex, Name, 1203 &ModuleMap, &ImportList, &DefinedGlobals); 1204 codeGen.runAll(); 1205} 1206 1207/// Launch each module's backend pipeline in a separate task in a thread pool. 1208static void 1209thinLTOBackends(raw_fd_ostream *ApiFile, 1210 const ModuleSummaryIndex &CombinedIndex, 1211 StringMap<MemoryBufferRef> &ModuleMap, 1212 StringMap<FunctionImporter::ImportMapTy> &ImportLists, 1213 StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>> 1214 &ModuleToDefinedGVSummaries) { 1215 unsigned TaskCount = 0; 1216 std::vector<ThinLTOTaskInfo> Tasks; 1217 Tasks.reserve(Modules.size()); 1218 unsigned int MaxThreads = options::Parallelism 1219 ? options::Parallelism 1220 : thread::hardware_concurrency(); 1221 1222 // Create ThreadPool in nested scope so that threads will be joined 1223 // on destruction. 1224 { 1225 ThreadPool ThinLTOThreadPool(MaxThreads); 1226 for (claimed_file &F : Modules) { 1227 // Do all the gold callbacks in the main thread, since gold is not thread 1228 // safe by default. 1229 const void *View = getSymbolsAndView(F); 1230 if (!View) 1231 continue; 1232 1233 SmallString<128> Filename; 1234 if (!options::obj_path.empty()) 1235 // Note that openOutputFile will append a unique ID for each task 1236 Filename = options::obj_path; 1237 else if (options::TheOutputType == options::OT_SAVE_TEMPS) { 1238 // Use the input file name so that we get a unique and identifiable 1239 // output file for each ThinLTO backend task. 1240 Filename = F.name; 1241 Filename += ".thinlto.o"; 1242 } 1243 bool TempOutFile = Filename.empty(); 1244 1245 SmallString<128> NewFilename; 1246 int FD = openOutputFile(Filename, TempOutFile, NewFilename, 1247 // Only append the TaskID if we will use the 1248 // non-unique obj_path. 1249 !options::obj_path.empty() ? TaskCount : -1); 1250 TaskCount++; 1251 std::unique_ptr<raw_fd_ostream> OS = 1252 llvm::make_unique<raw_fd_ostream>(FD, true); 1253 1254 // Enqueue the task 1255 ThinLTOThreadPool.async(thinLTOBackendTask, std::ref(F), View, F.name, 1256 ApiFile, std::ref(CombinedIndex), OS.get(), 1257 TaskCount, std::ref(ModuleMap), 1258 std::ref(ImportLists[F.name]), 1259 std::ref(ModuleToDefinedGVSummaries[F.name])); 1260 1261 // Record the information needed by the task or during its cleanup 1262 // to a ThinLTOTaskInfo instance. For information needed by the task 1263 // the unique_ptr ownership is transferred to the ThinLTOTaskInfo. 1264 Tasks.emplace_back(std::move(OS), NewFilename.c_str(), TempOutFile); 1265 } 1266 } 1267 1268 for (auto &Task : Tasks) 1269 Task.cleanup(); 1270} 1271 1272/// Parse the thinlto_prefix_replace option into the \p OldPrefix and 1273/// \p NewPrefix strings, if it was specified. 1274static void getThinLTOOldAndNewPrefix(std::string &OldPrefix, 1275 std::string &NewPrefix) { 1276 StringRef PrefixReplace = options::thinlto_prefix_replace; 1277 assert(PrefixReplace.empty() || PrefixReplace.find(";") != StringRef::npos); 1278 std::pair<StringRef, StringRef> Split = PrefixReplace.split(";"); 1279 OldPrefix = Split.first.str(); 1280 NewPrefix = Split.second.str(); 1281} 1282 1283/// Given the original \p Path to an output file, replace any path 1284/// prefix matching \p OldPrefix with \p NewPrefix. Also, create the 1285/// resulting directory if it does not yet exist. 1286static std::string getThinLTOOutputFile(const std::string &Path, 1287 const std::string &OldPrefix, 1288 const std::string &NewPrefix) { 1289 if (OldPrefix.empty() && NewPrefix.empty()) 1290 return Path; 1291 SmallString<128> NewPath(Path); 1292 llvm::sys::path::replace_path_prefix(NewPath, OldPrefix, NewPrefix); 1293 StringRef ParentPath = llvm::sys::path::parent_path(NewPath.str()); 1294 if (!ParentPath.empty()) { 1295 // Make sure the new directory exists, creating it if necessary. 1296 if (std::error_code EC = llvm::sys::fs::create_directories(ParentPath)) 1297 llvm::errs() << "warning: could not create directory '" << ParentPath 1298 << "': " << EC.message() << '\n'; 1299 } 1300 return NewPath.str(); 1301} 1302 1303/// Perform ThinLTO link, which creates the combined index file. 1304/// Also, either launch backend threads or (under thinlto-index-only) 1305/// emit individual index files for distributed backends and exit. 1306static ld_plugin_status thinLTOLink(raw_fd_ostream *ApiFile) { 1307 // Map from a module name to the corresponding buffer holding a view of the 1308 // bitcode provided via the get_view gold callback. 1309 StringMap<MemoryBufferRef> ModuleMap; 1310 // Map to own RAII objects that manage the file opening and releasing 1311 // interfaces with gold. 1312 DenseMap<void *, std::unique_ptr<PluginInputFile>> HandleToInputFile; 1313 1314 // Keep track of symbols that must not be internalized because they 1315 // are referenced outside of a single IR module. 1316 DenseSet<GlobalValue::GUID> Preserve; 1317 1318 // Keep track of the prevailing copy for each GUID, for use in resolving 1319 // weak linkages. 1320 DenseMap<GlobalValue::GUID, const GlobalValueSummary *> PrevailingCopy; 1321 1322 ModuleSummaryIndex CombinedIndex; 1323 uint64_t NextModuleId = 0; 1324 for (claimed_file &F : Modules) { 1325 if (!HandleToInputFile.count(F.leader_handle)) 1326 HandleToInputFile.insert(std::make_pair( 1327 F.leader_handle, llvm::make_unique<PluginInputFile>(F.handle))); 1328 // Pass this into getModuleSummaryIndexForFile 1329 const void *View = getSymbolsAndView(F); 1330 if (!View) 1331 continue; 1332 1333 MemoryBufferRef ModuleBuffer(StringRef((const char *)View, F.filesize), 1334 F.name); 1335 assert(ModuleMap.find(ModuleBuffer.getBufferIdentifier()) == 1336 ModuleMap.end() && 1337 "Expect unique Buffer Identifier"); 1338 ModuleMap[ModuleBuffer.getBufferIdentifier()] = ModuleBuffer; 1339 1340 std::unique_ptr<ModuleSummaryIndex> Index = getModuleSummaryIndexForFile(F); 1341 1342 // Use gold's symbol resolution information to identify symbols referenced 1343 // by more than a single IR module (i.e. referenced by multiple IR modules 1344 // or by a non-IR module). Cross references introduced by importing are 1345 // checked separately via the export lists. Also track the prevailing copy 1346 // for later symbol resolution. 1347 for (auto &Sym : F.syms) { 1348 ld_plugin_symbol_resolution Resolution = 1349 (ld_plugin_symbol_resolution)Sym.resolution; 1350 GlobalValue::GUID SymGUID = GlobalValue::getGUID(Sym.name); 1351 if (Resolution != LDPR_PREVAILING_DEF_IRONLY) 1352 Preserve.insert(SymGUID); 1353 1354 if (Index && (Resolution == LDPR_PREVAILING_DEF || 1355 Resolution == LDPR_PREVAILING_DEF_IRONLY || 1356 Resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)) 1357 PrevailingCopy[SymGUID] = Index->getGlobalValueSummary(SymGUID); 1358 } 1359 1360 // Skip files without a module summary. 1361 if (Index) 1362 CombinedIndex.mergeFrom(std::move(Index), ++NextModuleId); 1363 } 1364 1365 // Collect for each module the list of function it defines (GUID -> 1366 // Summary). 1367 StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>> 1368 ModuleToDefinedGVSummaries(NextModuleId); 1369 CombinedIndex.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries); 1370 1371 StringMap<FunctionImporter::ImportMapTy> ImportLists(NextModuleId); 1372 StringMap<FunctionImporter::ExportSetTy> ExportLists(NextModuleId); 1373 ComputeCrossModuleImport(CombinedIndex, ModuleToDefinedGVSummaries, 1374 ImportLists, ExportLists); 1375 1376 auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) { 1377 const auto &Prevailing = PrevailingCopy.find(GUID); 1378 assert(Prevailing != PrevailingCopy.end()); 1379 return Prevailing->second == S; 1380 }; 1381 1382 // Callback for internalization, to prevent internalization of symbols 1383 // that were not candidates initially, and those that are being imported 1384 // (which introduces new cross references). 1385 auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) { 1386 const auto &ExportList = ExportLists.find(ModuleIdentifier); 1387 return (ExportList != ExportLists.end() && 1388 ExportList->second.count(GUID)) || 1389 Preserve.count(GUID); 1390 }; 1391 1392 thinLTOResolveWeakForLinkerInIndex( 1393 CombinedIndex, isPrevailing, 1394 [](StringRef ModuleIdentifier, GlobalValue::GUID GUID, 1395 GlobalValue::LinkageTypes NewLinkage) {}); 1396 1397 // Use global summary-based analysis to identify symbols that can be 1398 // internalized (because they aren't exported or preserved as per callback). 1399 // Changes are made in the index, consumed in the ThinLTO backends. 1400 thinLTOInternalizeAndPromoteInIndex(CombinedIndex, isExported); 1401 1402 if (options::thinlto_emit_imports_files && !options::thinlto_index_only) 1403 message(LDPL_WARNING, 1404 "thinlto-emit-imports-files ignored unless thinlto-index-only"); 1405 1406 if (options::thinlto_index_only) { 1407 // If the thinlto-prefix-replace option was specified, parse it and 1408 // extract the old and new prefixes. 1409 std::string OldPrefix, NewPrefix; 1410 getThinLTOOldAndNewPrefix(OldPrefix, NewPrefix); 1411 1412 // For each input bitcode file, generate an individual index that 1413 // contains summaries only for its own global values, and for any that 1414 // should be imported. 1415 for (claimed_file &F : Modules) { 1416 std::error_code EC; 1417 1418 std::string NewModulePath = 1419 getThinLTOOutputFile(F.name, OldPrefix, NewPrefix); 1420 raw_fd_ostream OS((Twine(NewModulePath) + ".thinlto.bc").str(), EC, 1421 sys::fs::OpenFlags::F_None); 1422 if (EC) 1423 message(LDPL_FATAL, "Unable to open %s.thinlto.bc for writing: %s", 1424 NewModulePath.c_str(), EC.message().c_str()); 1425 // Build a map of module to the GUIDs and summary objects that should 1426 // be written to its index. 1427 std::map<std::string, GVSummaryMapTy> ModuleToSummariesForIndex; 1428 gatherImportedSummariesForModule(F.name, ModuleToDefinedGVSummaries, 1429 ImportLists, ModuleToSummariesForIndex); 1430 WriteIndexToFile(CombinedIndex, OS, &ModuleToSummariesForIndex); 1431 1432 if (options::thinlto_emit_imports_files) { 1433 if ((EC = EmitImportsFiles(F.name, 1434 (Twine(NewModulePath) + ".imports").str(), 1435 ImportLists))) 1436 message(LDPL_FATAL, "Unable to open %s.imports", 1437 NewModulePath.c_str(), EC.message().c_str()); 1438 } 1439 } 1440 1441 cleanup_hook(); 1442 exit(0); 1443 } 1444 1445 // Create OS in nested scope so that it will be closed on destruction. 1446 { 1447 std::error_code EC; 1448 raw_fd_ostream OS(output_name + ".thinlto.bc", EC, 1449 sys::fs::OpenFlags::F_None); 1450 if (EC) 1451 message(LDPL_FATAL, "Unable to open %s.thinlto.bc for writing: %s", 1452 output_name.data(), EC.message().c_str()); 1453 WriteIndexToFile(CombinedIndex, OS); 1454 } 1455 1456 thinLTOBackends(ApiFile, CombinedIndex, ModuleMap, ImportLists, 1457 ModuleToDefinedGVSummaries); 1458 return LDPS_OK; 1459} 1460 1461/// gold informs us that all symbols have been read. At this point, we use 1462/// get_symbols to see if any of our definitions have been overridden by a 1463/// native object file. Then, perform optimization and codegen. 1464static ld_plugin_status allSymbolsReadHook(raw_fd_ostream *ApiFile) { 1465 if (Modules.empty()) 1466 return LDPS_OK; 1467 1468 if (unsigned NumOpts = options::extra.size()) 1469 cl::ParseCommandLineOptions(NumOpts, &options::extra[0]); 1470 1471 if (options::thinlto) 1472 return thinLTOLink(ApiFile); 1473 1474 LLVMContext Context; 1475 Context.setDiscardValueNames(options::TheOutputType != 1476 options::OT_SAVE_TEMPS); 1477 Context.enableDebugTypeODRUniquing(); // Merge debug info types. 1478 Context.setDiagnosticHandler(diagnosticHandlerForContext, nullptr, true); 1479 1480 std::unique_ptr<Module> Combined(new Module("ld-temp.o", Context)); 1481 IRMover L(*Combined); 1482 1483 StringSet<> Internalize; 1484 for (claimed_file &F : Modules) { 1485 // RAII object to manage the file opening and releasing interfaces with 1486 // gold. 1487 PluginInputFile InputFile(F.handle); 1488 const void *View = getSymbolsAndView(F); 1489 if (!View) 1490 continue; 1491 linkInModule(Context, L, F, View, F.name, ApiFile, Internalize); 1492 } 1493 1494 for (const auto &Name : Internalize) { 1495 GlobalValue *GV = Combined->getNamedValue(Name.first()); 1496 if (GV) 1497 internalize(*GV); 1498 } 1499 1500 if (options::TheOutputType == options::OT_DISABLE) 1501 return LDPS_OK; 1502 1503 if (options::TheOutputType != options::OT_NORMAL) { 1504 std::string path; 1505 if (options::TheOutputType == options::OT_BC_ONLY) 1506 path = output_name; 1507 else 1508 path = output_name + ".bc"; 1509 saveBCFile(path, *Combined); 1510 if (options::TheOutputType == options::OT_BC_ONLY) 1511 return LDPS_OK; 1512 } 1513 1514 CodeGen codeGen(std::move(Combined)); 1515 codeGen.runAll(); 1516 1517 if (!options::extra_library_path.empty() && 1518 set_extra_library_path(options::extra_library_path.c_str()) != LDPS_OK) 1519 message(LDPL_FATAL, "Unable to set the extra library path."); 1520 1521 return LDPS_OK; 1522} 1523 1524static ld_plugin_status all_symbols_read_hook(void) { 1525 ld_plugin_status Ret; 1526 if (!options::generate_api_file) { 1527 Ret = allSymbolsReadHook(nullptr); 1528 } else { 1529 std::error_code EC; 1530 raw_fd_ostream ApiFile("apifile.txt", EC, sys::fs::F_None); 1531 if (EC) 1532 message(LDPL_FATAL, "Unable to open apifile.txt for writing: %s", 1533 EC.message().c_str()); 1534 Ret = allSymbolsReadHook(&ApiFile); 1535 } 1536 1537 llvm_shutdown(); 1538 1539 if (options::TheOutputType == options::OT_BC_ONLY || 1540 options::TheOutputType == options::OT_DISABLE) { 1541 if (options::TheOutputType == options::OT_DISABLE) { 1542 // Remove the output file here since ld.bfd creates the output file 1543 // early. 1544 std::error_code EC = sys::fs::remove(output_name); 1545 if (EC) 1546 message(LDPL_ERROR, "Failed to delete '%s': %s", output_name.c_str(), 1547 EC.message().c_str()); 1548 } 1549 exit(0); 1550 } 1551 1552 return Ret; 1553} 1554 1555static ld_plugin_status cleanup_hook(void) { 1556 for (std::string &Name : Cleanup) { 1557 std::error_code EC = sys::fs::remove(Name); 1558 if (EC) 1559 message(LDPL_ERROR, "Failed to delete '%s': %s", Name.c_str(), 1560 EC.message().c_str()); 1561 } 1562 1563 return LDPS_OK; 1564} 1565