1 //===-LTO.cpp - LLVM Link Time Optimizer ----------------------------------===// 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 file implements functions and classes used to support LTO. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/LTO/LTO.h" 15 #include "llvm/Analysis/TargetLibraryInfo.h" 16 #include "llvm/Analysis/TargetTransformInfo.h" 17 #include "llvm/Bitcode/BitcodeReader.h" 18 #include "llvm/Bitcode/BitcodeWriter.h" 19 #include "llvm/CodeGen/Analysis.h" 20 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 21 #include "llvm/IR/AutoUpgrade.h" 22 #include "llvm/IR/DiagnosticPrinter.h" 23 #include "llvm/IR/LegacyPassManager.h" 24 #include "llvm/IR/Mangler.h" 25 #include "llvm/IR/Metadata.h" 26 #include "llvm/LTO/LTOBackend.h" 27 #include "llvm/Linker/IRMover.h" 28 #include "llvm/Object/ModuleSummaryIndexObjectFile.h" 29 #include "llvm/Support/Error.h" 30 #include "llvm/Support/ManagedStatic.h" 31 #include "llvm/Support/MemoryBuffer.h" 32 #include "llvm/Support/Path.h" 33 #include "llvm/Support/SHA1.h" 34 #include "llvm/Support/SourceMgr.h" 35 #include "llvm/Support/TargetRegistry.h" 36 #include "llvm/Support/ThreadPool.h" 37 #include "llvm/Support/Threading.h" 38 #include "llvm/Support/raw_ostream.h" 39 #include "llvm/Target/TargetMachine.h" 40 #include "llvm/Target/TargetOptions.h" 41 #include "llvm/Transforms/IPO.h" 42 #include "llvm/Transforms/IPO/PassManagerBuilder.h" 43 #include "llvm/Transforms/Utils/SplitModule.h" 44 45 #include <set> 46 47 using namespace llvm; 48 using namespace lto; 49 using namespace object; 50 51 #define DEBUG_TYPE "lto" 52 53 // The values are (type identifier, summary) pairs. 54 typedef DenseMap< 55 GlobalValue::GUID, 56 TinyPtrVector<const std::pair<const std::string, TypeIdSummary> *>> 57 TypeIdSummariesByGuidTy; 58 59 // Returns a unique hash for the Module considering the current list of 60 // export/import and other global analysis results. 61 // The hash is produced in \p Key. 62 static void computeCacheKey( 63 SmallString<40> &Key, const Config &Conf, const ModuleSummaryIndex &Index, 64 StringRef ModuleID, const FunctionImporter::ImportMapTy &ImportList, 65 const FunctionImporter::ExportSetTy &ExportList, 66 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 67 const GVSummaryMapTy &DefinedGlobals, 68 const TypeIdSummariesByGuidTy &TypeIdSummariesByGuid) { 69 // Compute the unique hash for this entry. 70 // This is based on the current compiler version, the module itself, the 71 // export list, the hash for every single module in the import list, the 72 // list of ResolvedODR for the module, and the list of preserved symbols. 73 SHA1 Hasher; 74 75 // Start with the compiler revision 76 Hasher.update(LLVM_VERSION_STRING); 77 #ifdef HAVE_LLVM_REVISION 78 Hasher.update(LLVM_REVISION); 79 #endif 80 81 // Include the parts of the LTO configuration that affect code generation. 82 auto AddString = [&](StringRef Str) { 83 Hasher.update(Str); 84 Hasher.update(ArrayRef<uint8_t>{0}); 85 }; 86 auto AddUnsigned = [&](unsigned I) { 87 uint8_t Data[4]; 88 Data[0] = I; 89 Data[1] = I >> 8; 90 Data[2] = I >> 16; 91 Data[3] = I >> 24; 92 Hasher.update(ArrayRef<uint8_t>{Data, 4}); 93 }; 94 auto AddUint64 = [&](uint64_t I) { 95 uint8_t Data[8]; 96 Data[0] = I; 97 Data[1] = I >> 8; 98 Data[2] = I >> 16; 99 Data[3] = I >> 24; 100 Data[4] = I >> 32; 101 Data[5] = I >> 40; 102 Data[6] = I >> 48; 103 Data[7] = I >> 56; 104 Hasher.update(ArrayRef<uint8_t>{Data, 8}); 105 }; 106 AddString(Conf.CPU); 107 // FIXME: Hash more of Options. For now all clients initialize Options from 108 // command-line flags (which is unsupported in production), but may set 109 // RelaxELFRelocations. The clang driver can also pass FunctionSections, 110 // DataSections and DebuggerTuning via command line flags. 111 AddUnsigned(Conf.Options.RelaxELFRelocations); 112 AddUnsigned(Conf.Options.FunctionSections); 113 AddUnsigned(Conf.Options.DataSections); 114 AddUnsigned((unsigned)Conf.Options.DebuggerTuning); 115 for (auto &A : Conf.MAttrs) 116 AddString(A); 117 AddUnsigned(Conf.RelocModel); 118 AddUnsigned(Conf.CodeModel); 119 AddUnsigned(Conf.CGOptLevel); 120 AddUnsigned(Conf.CGFileType); 121 AddUnsigned(Conf.OptLevel); 122 AddString(Conf.OptPipeline); 123 AddString(Conf.AAPipeline); 124 AddString(Conf.OverrideTriple); 125 AddString(Conf.DefaultTriple); 126 127 // Include the hash for the current module 128 auto ModHash = Index.getModuleHash(ModuleID); 129 Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash))); 130 for (auto F : ExportList) 131 // The export list can impact the internalization, be conservative here 132 Hasher.update(ArrayRef<uint8_t>((uint8_t *)&F, sizeof(F))); 133 134 // Include the hash for every module we import functions from. The set of 135 // imported symbols for each module may affect code generation and is 136 // sensitive to link order, so include that as well. 137 for (auto &Entry : ImportList) { 138 auto ModHash = Index.getModuleHash(Entry.first()); 139 Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash))); 140 141 AddUint64(Entry.second.size()); 142 for (auto &Fn : Entry.second) 143 AddUint64(Fn.first); 144 } 145 146 // Include the hash for the resolved ODR. 147 for (auto &Entry : ResolvedODR) { 148 Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.first, 149 sizeof(GlobalValue::GUID))); 150 Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.second, 151 sizeof(GlobalValue::LinkageTypes))); 152 } 153 154 std::set<GlobalValue::GUID> UsedTypeIds; 155 156 auto AddUsedTypeIds = [&](GlobalValueSummary *GS) { 157 auto *FS = dyn_cast_or_null<FunctionSummary>(GS); 158 if (!FS) 159 return; 160 for (auto &TT : FS->type_tests()) 161 UsedTypeIds.insert(TT); 162 for (auto &TT : FS->type_test_assume_vcalls()) 163 UsedTypeIds.insert(TT.GUID); 164 for (auto &TT : FS->type_checked_load_vcalls()) 165 UsedTypeIds.insert(TT.GUID); 166 for (auto &TT : FS->type_test_assume_const_vcalls()) 167 UsedTypeIds.insert(TT.VFunc.GUID); 168 for (auto &TT : FS->type_checked_load_const_vcalls()) 169 UsedTypeIds.insert(TT.VFunc.GUID); 170 }; 171 172 // Include the hash for the linkage type to reflect internalization and weak 173 // resolution, and collect any used type identifier resolutions. 174 for (auto &GS : DefinedGlobals) { 175 GlobalValue::LinkageTypes Linkage = GS.second->linkage(); 176 Hasher.update( 177 ArrayRef<uint8_t>((const uint8_t *)&Linkage, sizeof(Linkage))); 178 AddUsedTypeIds(GS.second); 179 } 180 181 // Imported functions may introduce new uses of type identifier resolutions, 182 // so we need to collect their used resolutions as well. 183 for (auto &ImpM : ImportList) 184 for (auto &ImpF : ImpM.second) 185 AddUsedTypeIds(Index.findSummaryInModule(ImpF.first, ImpM.first())); 186 187 auto AddTypeIdSummary = [&](StringRef TId, const TypeIdSummary &S) { 188 AddString(TId); 189 190 AddUnsigned(S.TTRes.TheKind); 191 AddUnsigned(S.TTRes.SizeM1BitWidth); 192 193 AddUint64(S.WPDRes.size()); 194 for (auto &WPD : S.WPDRes) { 195 AddUnsigned(WPD.first); 196 AddUnsigned(WPD.second.TheKind); 197 AddString(WPD.second.SingleImplName); 198 199 AddUint64(WPD.second.ResByArg.size()); 200 for (auto &ByArg : WPD.second.ResByArg) { 201 AddUint64(ByArg.first.size()); 202 for (uint64_t Arg : ByArg.first) 203 AddUint64(Arg); 204 AddUnsigned(ByArg.second.TheKind); 205 AddUint64(ByArg.second.Info); 206 } 207 } 208 }; 209 210 // Include the hash for all type identifiers used by this module. 211 for (GlobalValue::GUID TId : UsedTypeIds) { 212 auto SummariesI = TypeIdSummariesByGuid.find(TId); 213 if (SummariesI != TypeIdSummariesByGuid.end()) 214 for (auto *Summary : SummariesI->second) 215 AddTypeIdSummary(Summary->first, Summary->second); 216 } 217 218 if (!Conf.SampleProfile.empty()) { 219 auto FileOrErr = MemoryBuffer::getFile(Conf.SampleProfile); 220 if (FileOrErr) 221 Hasher.update(FileOrErr.get()->getBuffer()); 222 } 223 224 Key = toHex(Hasher.result()); 225 } 226 227 static void thinLTOResolveWeakForLinkerGUID( 228 GlobalValueSummaryList &GVSummaryList, GlobalValue::GUID GUID, 229 DenseSet<GlobalValueSummary *> &GlobalInvolvedWithAlias, 230 function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)> 231 isPrevailing, 232 function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)> 233 recordNewLinkage) { 234 for (auto &S : GVSummaryList) { 235 GlobalValue::LinkageTypes OriginalLinkage = S->linkage(); 236 if (!GlobalValue::isWeakForLinker(OriginalLinkage)) 237 continue; 238 // We need to emit only one of these. The prevailing module will keep it, 239 // but turned into a weak, while the others will drop it when possible. 240 // This is both a compile-time optimization and a correctness 241 // transformation. This is necessary for correctness when we have exported 242 // a reference - we need to convert the linkonce to weak to 243 // ensure a copy is kept to satisfy the exported reference. 244 // FIXME: We may want to split the compile time and correctness 245 // aspects into separate routines. 246 if (isPrevailing(GUID, S.get())) { 247 if (GlobalValue::isLinkOnceLinkage(OriginalLinkage)) 248 S->setLinkage(GlobalValue::getWeakLinkage( 249 GlobalValue::isLinkOnceODRLinkage(OriginalLinkage))); 250 } 251 // Alias and aliasee can't be turned into available_externally. 252 else if (!isa<AliasSummary>(S.get()) && 253 !GlobalInvolvedWithAlias.count(S.get())) 254 S->setLinkage(GlobalValue::AvailableExternallyLinkage); 255 if (S->linkage() != OriginalLinkage) 256 recordNewLinkage(S->modulePath(), GUID, S->linkage()); 257 } 258 } 259 260 // Resolve Weak and LinkOnce values in the \p Index. 261 // 262 // We'd like to drop these functions if they are no longer referenced in the 263 // current module. However there is a chance that another module is still 264 // referencing them because of the import. We make sure we always emit at least 265 // one copy. 266 void llvm::thinLTOResolveWeakForLinkerInIndex( 267 ModuleSummaryIndex &Index, 268 function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)> 269 isPrevailing, 270 function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)> 271 recordNewLinkage) { 272 // We won't optimize the globals that are referenced by an alias for now 273 // Ideally we should turn the alias into a global and duplicate the definition 274 // when needed. 275 DenseSet<GlobalValueSummary *> GlobalInvolvedWithAlias; 276 for (auto &I : Index) 277 for (auto &S : I.second) 278 if (auto AS = dyn_cast<AliasSummary>(S.get())) 279 GlobalInvolvedWithAlias.insert(&AS->getAliasee()); 280 281 for (auto &I : Index) 282 thinLTOResolveWeakForLinkerGUID(I.second, I.first, GlobalInvolvedWithAlias, 283 isPrevailing, recordNewLinkage); 284 } 285 286 static void thinLTOInternalizeAndPromoteGUID( 287 GlobalValueSummaryList &GVSummaryList, GlobalValue::GUID GUID, 288 function_ref<bool(StringRef, GlobalValue::GUID)> isExported) { 289 for (auto &S : GVSummaryList) { 290 if (isExported(S->modulePath(), GUID)) { 291 if (GlobalValue::isLocalLinkage(S->linkage())) 292 S->setLinkage(GlobalValue::ExternalLinkage); 293 } else if (!GlobalValue::isLocalLinkage(S->linkage())) 294 S->setLinkage(GlobalValue::InternalLinkage); 295 } 296 } 297 298 // Update the linkages in the given \p Index to mark exported values 299 // as external and non-exported values as internal. 300 void llvm::thinLTOInternalizeAndPromoteInIndex( 301 ModuleSummaryIndex &Index, 302 function_ref<bool(StringRef, GlobalValue::GUID)> isExported) { 303 for (auto &I : Index) 304 thinLTOInternalizeAndPromoteGUID(I.second, I.first, isExported); 305 } 306 307 struct InputFile::InputModule { 308 BitcodeModule BM; 309 std::unique_ptr<Module> Mod; 310 311 // The range of ModuleSymbolTable entries for this input module. 312 size_t SymBegin, SymEnd; 313 }; 314 315 // Requires a destructor for std::vector<InputModule>. 316 InputFile::~InputFile() = default; 317 318 Expected<std::unique_ptr<InputFile>> InputFile::create(MemoryBufferRef Object) { 319 std::unique_ptr<InputFile> File(new InputFile); 320 321 ErrorOr<MemoryBufferRef> BCOrErr = 322 IRObjectFile::findBitcodeInMemBuffer(Object); 323 if (!BCOrErr) 324 return errorCodeToError(BCOrErr.getError()); 325 326 Expected<std::vector<BitcodeModule>> BMsOrErr = 327 getBitcodeModuleList(*BCOrErr); 328 if (!BMsOrErr) 329 return BMsOrErr.takeError(); 330 331 if (BMsOrErr->empty()) 332 return make_error<StringError>("Bitcode file does not contain any modules", 333 inconvertibleErrorCode()); 334 335 // Create an InputModule for each module in the InputFile, and add it to the 336 // ModuleSymbolTable. 337 for (auto BM : *BMsOrErr) { 338 Expected<std::unique_ptr<Module>> MOrErr = 339 BM.getLazyModule(File->Ctx, /*ShouldLazyLoadMetadata*/ true, 340 /*IsImporting*/ false); 341 if (!MOrErr) 342 return MOrErr.takeError(); 343 344 size_t SymBegin = File->SymTab.symbols().size(); 345 File->SymTab.addModule(MOrErr->get()); 346 size_t SymEnd = File->SymTab.symbols().size(); 347 348 for (const auto &C : (*MOrErr)->getComdatSymbolTable()) { 349 auto P = File->ComdatMap.insert( 350 std::make_pair(&C.second, File->Comdats.size())); 351 assert(P.second); 352 (void)P; 353 File->Comdats.push_back(C.first()); 354 } 355 356 File->Mods.push_back({BM, std::move(*MOrErr), SymBegin, SymEnd}); 357 } 358 359 return std::move(File); 360 } 361 362 Expected<int> InputFile::Symbol::getComdatIndex() const { 363 if (!isGV()) 364 return -1; 365 const GlobalObject *GO = getGV()->getBaseObject(); 366 if (!GO) 367 return make_error<StringError>("Unable to determine comdat of alias!", 368 inconvertibleErrorCode()); 369 if (const Comdat *C = GO->getComdat()) { 370 auto I = File->ComdatMap.find(C); 371 assert(I != File->ComdatMap.end()); 372 return I->second; 373 } 374 return -1; 375 } 376 377 Expected<std::string> InputFile::getLinkerOpts() { 378 std::string LinkerOpts; 379 raw_string_ostream LOS(LinkerOpts); 380 // Extract linker options from module metadata. 381 for (InputModule &Mod : Mods) { 382 std::unique_ptr<Module> &M = Mod.Mod; 383 if (auto E = M->materializeMetadata()) 384 return std::move(E); 385 if (Metadata *Val = M->getModuleFlag("Linker Options")) { 386 MDNode *LinkerOptions = cast<MDNode>(Val); 387 for (const MDOperand &MDOptions : LinkerOptions->operands()) 388 for (const MDOperand &MDOption : cast<MDNode>(MDOptions)->operands()) 389 LOS << " " << cast<MDString>(MDOption)->getString(); 390 } 391 } 392 393 // Synthesize export flags for symbols with dllexport storage. 394 const Triple TT(Mods[0].Mod->getTargetTriple()); 395 Mangler M; 396 for (const ModuleSymbolTable::Symbol &Sym : SymTab.symbols()) 397 if (auto *GV = Sym.dyn_cast<GlobalValue*>()) 398 emitLinkerFlagsForGlobalCOFF(LOS, GV, TT, M); 399 LOS.flush(); 400 return LinkerOpts; 401 } 402 403 StringRef InputFile::getName() const { 404 return Mods[0].BM.getModuleIdentifier(); 405 } 406 407 StringRef InputFile::getSourceFileName() const { 408 return Mods[0].Mod->getSourceFileName(); 409 } 410 411 iterator_range<InputFile::symbol_iterator> 412 InputFile::module_symbols(InputModule &IM) { 413 return llvm::make_range( 414 symbol_iterator(SymTab.symbols().data() + IM.SymBegin, SymTab, this), 415 symbol_iterator(SymTab.symbols().data() + IM.SymEnd, SymTab, this)); 416 } 417 418 LTO::RegularLTOState::RegularLTOState(unsigned ParallelCodeGenParallelismLevel, 419 Config &Conf) 420 : ParallelCodeGenParallelismLevel(ParallelCodeGenParallelismLevel), 421 Ctx(Conf) {} 422 423 LTO::ThinLTOState::ThinLTOState(ThinBackend Backend) : Backend(Backend) { 424 if (!Backend) 425 this->Backend = 426 createInProcessThinBackend(llvm::heavyweight_hardware_concurrency()); 427 } 428 429 LTO::LTO(Config Conf, ThinBackend Backend, 430 unsigned ParallelCodeGenParallelismLevel) 431 : Conf(std::move(Conf)), 432 RegularLTO(ParallelCodeGenParallelismLevel, this->Conf), 433 ThinLTO(std::move(Backend)) {} 434 435 // Requires a destructor for MapVector<BitcodeModule>. 436 LTO::~LTO() = default; 437 438 // Add the given symbol to the GlobalResolutions map, and resolve its partition. 439 void LTO::addSymbolToGlobalRes(SmallPtrSet<GlobalValue *, 8> &Used, 440 const InputFile::Symbol &Sym, 441 SymbolResolution Res, unsigned Partition) { 442 GlobalValue *GV = Sym.isGV() ? Sym.getGV() : nullptr; 443 444 auto &GlobalRes = GlobalResolutions[Sym.getName()]; 445 if (GV) { 446 GlobalRes.UnnamedAddr &= GV->hasGlobalUnnamedAddr(); 447 if (Res.Prevailing) 448 GlobalRes.IRName = GV->getName(); 449 } 450 // Set the partition to external if we know it is used elsewhere, e.g. 451 // it is visible to a regular object, is referenced from llvm.compiler_used, 452 // or was already recorded as being referenced from a different partition. 453 if (Res.VisibleToRegularObj || (GV && Used.count(GV)) || 454 (GlobalRes.Partition != GlobalResolution::Unknown && 455 GlobalRes.Partition != Partition)) { 456 GlobalRes.Partition = GlobalResolution::External; 457 } else 458 // First recorded reference, save the current partition. 459 GlobalRes.Partition = Partition; 460 461 // Flag as visible outside of ThinLTO if visible from a regular object or 462 // if this is a reference in the regular LTO partition. 463 GlobalRes.VisibleOutsideThinLTO |= 464 (Res.VisibleToRegularObj || (Partition == GlobalResolution::RegularLTO)); 465 } 466 467 static void writeToResolutionFile(raw_ostream &OS, InputFile *Input, 468 ArrayRef<SymbolResolution> Res) { 469 StringRef Path = Input->getName(); 470 OS << Path << '\n'; 471 auto ResI = Res.begin(); 472 for (const InputFile::Symbol &Sym : Input->symbols()) { 473 assert(ResI != Res.end()); 474 SymbolResolution Res = *ResI++; 475 476 OS << "-r=" << Path << ',' << Sym.getName() << ','; 477 if (Res.Prevailing) 478 OS << 'p'; 479 if (Res.FinalDefinitionInLinkageUnit) 480 OS << 'l'; 481 if (Res.VisibleToRegularObj) 482 OS << 'x'; 483 OS << '\n'; 484 } 485 OS.flush(); 486 assert(ResI == Res.end()); 487 } 488 489 Error LTO::add(std::unique_ptr<InputFile> Input, 490 ArrayRef<SymbolResolution> Res) { 491 assert(!CalledGetMaxTasks); 492 493 if (Conf.ResolutionFile) 494 writeToResolutionFile(*Conf.ResolutionFile, Input.get(), Res); 495 496 const SymbolResolution *ResI = Res.begin(); 497 for (InputFile::InputModule &IM : Input->Mods) 498 if (Error Err = addModule(*Input, IM, ResI, Res.end())) 499 return Err; 500 501 assert(ResI == Res.end()); 502 return Error::success(); 503 } 504 505 Error LTO::addModule(InputFile &Input, InputFile::InputModule &IM, 506 const SymbolResolution *&ResI, 507 const SymbolResolution *ResE) { 508 // FIXME: move to backend 509 Module &M = *IM.Mod; 510 511 if (M.getDataLayoutStr().empty()) 512 return make_error<StringError>("input module has no datalayout", 513 inconvertibleErrorCode()); 514 515 if (!Conf.OverrideTriple.empty()) 516 M.setTargetTriple(Conf.OverrideTriple); 517 else if (M.getTargetTriple().empty()) 518 M.setTargetTriple(Conf.DefaultTriple); 519 520 Expected<bool> HasThinLTOSummary = IM.BM.hasSummary(); 521 if (!HasThinLTOSummary) 522 return HasThinLTOSummary.takeError(); 523 524 if (*HasThinLTOSummary) 525 return addThinLTO(IM.BM, M, Input.module_symbols(IM), ResI, ResE); 526 else 527 return addRegularLTO(IM.BM, ResI, ResE); 528 } 529 530 // Add a regular LTO object to the link. 531 Error LTO::addRegularLTO(BitcodeModule BM, const SymbolResolution *&ResI, 532 const SymbolResolution *ResE) { 533 if (!RegularLTO.CombinedModule) { 534 RegularLTO.CombinedModule = 535 llvm::make_unique<Module>("ld-temp.o", RegularLTO.Ctx); 536 RegularLTO.Mover = llvm::make_unique<IRMover>(*RegularLTO.CombinedModule); 537 } 538 Expected<std::unique_ptr<Module>> MOrErr = 539 BM.getLazyModule(RegularLTO.Ctx, /*ShouldLazyLoadMetadata*/ true, 540 /*IsImporting*/ false); 541 if (!MOrErr) 542 return MOrErr.takeError(); 543 544 Module &M = **MOrErr; 545 if (Error Err = M.materializeMetadata()) 546 return Err; 547 UpgradeDebugInfo(M); 548 549 ModuleSymbolTable SymTab; 550 SymTab.addModule(&M); 551 552 SmallPtrSet<GlobalValue *, 8> Used; 553 collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); 554 555 std::vector<GlobalValue *> Keep; 556 557 for (GlobalVariable &GV : M.globals()) 558 if (GV.hasAppendingLinkage()) 559 Keep.push_back(&GV); 560 561 DenseSet<GlobalObject *> AliasedGlobals; 562 for (auto &GA : M.aliases()) 563 if (GlobalObject *GO = GA.getBaseObject()) 564 AliasedGlobals.insert(GO); 565 566 for (const InputFile::Symbol &Sym : 567 make_range(InputFile::symbol_iterator(SymTab.symbols().begin(), SymTab, 568 nullptr), 569 InputFile::symbol_iterator(SymTab.symbols().end(), SymTab, 570 nullptr))) { 571 assert(ResI != ResE); 572 SymbolResolution Res = *ResI++; 573 addSymbolToGlobalRes(Used, Sym, Res, 0); 574 575 if (Sym.isGV()) { 576 GlobalValue *GV = Sym.getGV(); 577 if (Res.Prevailing) { 578 if (Sym.getFlags() & object::BasicSymbolRef::SF_Undefined) 579 continue; 580 Keep.push_back(GV); 581 switch (GV->getLinkage()) { 582 default: 583 break; 584 case GlobalValue::LinkOnceAnyLinkage: 585 GV->setLinkage(GlobalValue::WeakAnyLinkage); 586 break; 587 case GlobalValue::LinkOnceODRLinkage: 588 GV->setLinkage(GlobalValue::WeakODRLinkage); 589 break; 590 } 591 } else if (isa<GlobalObject>(GV) && 592 (GV->hasLinkOnceODRLinkage() || GV->hasWeakODRLinkage() || 593 GV->hasAvailableExternallyLinkage()) && 594 !AliasedGlobals.count(cast<GlobalObject>(GV))) { 595 // Either of the above three types of linkage indicates that the 596 // chosen prevailing symbol will have the same semantics as this copy of 597 // the symbol, so we can link it with available_externally linkage. We 598 // only need to do this if the symbol is undefined. 599 GlobalValue *CombinedGV = 600 RegularLTO.CombinedModule->getNamedValue(GV->getName()); 601 if (!CombinedGV || CombinedGV->isDeclaration()) { 602 Keep.push_back(GV); 603 GV->setLinkage(GlobalValue::AvailableExternallyLinkage); 604 cast<GlobalObject>(GV)->setComdat(nullptr); 605 } 606 } 607 } 608 // Common resolution: collect the maximum size/alignment over all commons. 609 // We also record if we see an instance of a common as prevailing, so that 610 // if none is prevailing we can ignore it later. 611 if (Sym.getFlags() & object::BasicSymbolRef::SF_Common) { 612 // FIXME: We should figure out what to do about commons defined by asm. 613 // For now they aren't reported correctly by ModuleSymbolTable. 614 auto &CommonRes = RegularLTO.Commons[Sym.getGV()->getName()]; 615 CommonRes.Size = std::max(CommonRes.Size, Sym.getCommonSize()); 616 CommonRes.Align = std::max(CommonRes.Align, Sym.getCommonAlignment()); 617 CommonRes.Prevailing |= Res.Prevailing; 618 } 619 620 // FIXME: use proposed local attribute for FinalDefinitionInLinkageUnit. 621 } 622 623 return RegularLTO.Mover->move(std::move(*MOrErr), Keep, 624 [](GlobalValue &, IRMover::ValueAdder) {}, 625 /* IsPerformingImport */ false); 626 } 627 628 // Add a ThinLTO object to the link. 629 // FIXME: This function should not need to take as many parameters once we have 630 // a bitcode symbol table. 631 Error LTO::addThinLTO(BitcodeModule BM, Module &M, 632 iterator_range<InputFile::symbol_iterator> Syms, 633 const SymbolResolution *&ResI, 634 const SymbolResolution *ResE) { 635 SmallPtrSet<GlobalValue *, 8> Used; 636 collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); 637 638 Expected<std::unique_ptr<ModuleSummaryIndex>> SummaryOrErr = BM.getSummary(); 639 if (!SummaryOrErr) 640 return SummaryOrErr.takeError(); 641 ThinLTO.CombinedIndex.mergeFrom(std::move(*SummaryOrErr), 642 ThinLTO.ModuleMap.size()); 643 644 for (const InputFile::Symbol &Sym : Syms) { 645 assert(ResI != ResE); 646 SymbolResolution Res = *ResI++; 647 addSymbolToGlobalRes(Used, Sym, Res, ThinLTO.ModuleMap.size() + 1); 648 649 if (Res.Prevailing && Sym.isGV()) 650 ThinLTO.PrevailingModuleForGUID[Sym.getGV()->getGUID()] = 651 BM.getModuleIdentifier(); 652 } 653 654 if (!ThinLTO.ModuleMap.insert({BM.getModuleIdentifier(), BM}).second) 655 return make_error<StringError>( 656 "Expected at most one ThinLTO module per bitcode file", 657 inconvertibleErrorCode()); 658 659 return Error::success(); 660 } 661 662 unsigned LTO::getMaxTasks() const { 663 CalledGetMaxTasks = true; 664 return RegularLTO.ParallelCodeGenParallelismLevel + ThinLTO.ModuleMap.size(); 665 } 666 667 Error LTO::run(AddStreamFn AddStream, NativeObjectCache Cache) { 668 // Save the status of having a regularLTO combined module, as 669 // this is needed for generating the ThinLTO Task ID, and 670 // the CombinedModule will be moved at the end of runRegularLTO. 671 bool HasRegularLTO = RegularLTO.CombinedModule != nullptr; 672 // Invoke regular LTO if there was a regular LTO module to start with. 673 if (HasRegularLTO) 674 if (auto E = runRegularLTO(AddStream)) 675 return E; 676 return runThinLTO(AddStream, Cache, HasRegularLTO); 677 } 678 679 Error LTO::runRegularLTO(AddStreamFn AddStream) { 680 // Make sure commons have the right size/alignment: we kept the largest from 681 // all the prevailing when adding the inputs, and we apply it here. 682 const DataLayout &DL = RegularLTO.CombinedModule->getDataLayout(); 683 for (auto &I : RegularLTO.Commons) { 684 if (!I.second.Prevailing) 685 // Don't do anything if no instance of this common was prevailing. 686 continue; 687 GlobalVariable *OldGV = RegularLTO.CombinedModule->getNamedGlobal(I.first); 688 if (OldGV && DL.getTypeAllocSize(OldGV->getValueType()) == I.second.Size) { 689 // Don't create a new global if the type is already correct, just make 690 // sure the alignment is correct. 691 OldGV->setAlignment(I.second.Align); 692 continue; 693 } 694 ArrayType *Ty = 695 ArrayType::get(Type::getInt8Ty(RegularLTO.Ctx), I.second.Size); 696 auto *GV = new GlobalVariable(*RegularLTO.CombinedModule, Ty, false, 697 GlobalValue::CommonLinkage, 698 ConstantAggregateZero::get(Ty), ""); 699 GV->setAlignment(I.second.Align); 700 if (OldGV) { 701 OldGV->replaceAllUsesWith(ConstantExpr::getBitCast(GV, OldGV->getType())); 702 GV->takeName(OldGV); 703 OldGV->eraseFromParent(); 704 } else { 705 GV->setName(I.first); 706 } 707 } 708 709 if (Conf.PreOptModuleHook && 710 !Conf.PreOptModuleHook(0, *RegularLTO.CombinedModule)) 711 return Error::success(); 712 713 if (!Conf.CodeGenOnly) { 714 for (const auto &R : GlobalResolutions) { 715 if (R.second.IRName.empty()) 716 continue; 717 if (R.second.Partition != 0 && 718 R.second.Partition != GlobalResolution::External) 719 continue; 720 721 GlobalValue *GV = 722 RegularLTO.CombinedModule->getNamedValue(R.second.IRName); 723 // Ignore symbols defined in other partitions. 724 if (!GV || GV->hasLocalLinkage()) 725 continue; 726 GV->setUnnamedAddr(R.second.UnnamedAddr ? GlobalValue::UnnamedAddr::Global 727 : GlobalValue::UnnamedAddr::None); 728 if (R.second.Partition == 0) 729 GV->setLinkage(GlobalValue::InternalLinkage); 730 } 731 732 if (Conf.PostInternalizeModuleHook && 733 !Conf.PostInternalizeModuleHook(0, *RegularLTO.CombinedModule)) 734 return Error::success(); 735 } 736 return backend(Conf, AddStream, RegularLTO.ParallelCodeGenParallelismLevel, 737 std::move(RegularLTO.CombinedModule), ThinLTO.CombinedIndex); 738 } 739 740 /// This class defines the interface to the ThinLTO backend. 741 class lto::ThinBackendProc { 742 protected: 743 Config &Conf; 744 ModuleSummaryIndex &CombinedIndex; 745 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries; 746 747 public: 748 ThinBackendProc(Config &Conf, ModuleSummaryIndex &CombinedIndex, 749 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries) 750 : Conf(Conf), CombinedIndex(CombinedIndex), 751 ModuleToDefinedGVSummaries(ModuleToDefinedGVSummaries) {} 752 753 virtual ~ThinBackendProc() {} 754 virtual Error start( 755 unsigned Task, BitcodeModule BM, 756 const FunctionImporter::ImportMapTy &ImportList, 757 const FunctionImporter::ExportSetTy &ExportList, 758 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 759 MapVector<StringRef, BitcodeModule> &ModuleMap) = 0; 760 virtual Error wait() = 0; 761 }; 762 763 namespace { 764 class InProcessThinBackend : public ThinBackendProc { 765 ThreadPool BackendThreadPool; 766 AddStreamFn AddStream; 767 NativeObjectCache Cache; 768 TypeIdSummariesByGuidTy TypeIdSummariesByGuid; 769 770 Optional<Error> Err; 771 std::mutex ErrMu; 772 773 public: 774 InProcessThinBackend( 775 Config &Conf, ModuleSummaryIndex &CombinedIndex, 776 unsigned ThinLTOParallelismLevel, 777 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries, 778 AddStreamFn AddStream, NativeObjectCache Cache) 779 : ThinBackendProc(Conf, CombinedIndex, ModuleToDefinedGVSummaries), 780 BackendThreadPool(ThinLTOParallelismLevel), 781 AddStream(std::move(AddStream)), Cache(std::move(Cache)) { 782 // Create a mapping from type identifier GUIDs to type identifier summaries. 783 // This allows backends to use the type identifier GUIDs stored in the 784 // function summaries to determine which type identifier summaries affect 785 // each function without needing to compute GUIDs in each backend. 786 for (auto &TId : CombinedIndex.typeIds()) 787 TypeIdSummariesByGuid[GlobalValue::getGUID(TId.first)].push_back(&TId); 788 } 789 790 Error runThinLTOBackendThread( 791 AddStreamFn AddStream, NativeObjectCache Cache, unsigned Task, 792 BitcodeModule BM, ModuleSummaryIndex &CombinedIndex, 793 const FunctionImporter::ImportMapTy &ImportList, 794 const FunctionImporter::ExportSetTy &ExportList, 795 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 796 const GVSummaryMapTy &DefinedGlobals, 797 MapVector<StringRef, BitcodeModule> &ModuleMap, 798 const TypeIdSummariesByGuidTy &TypeIdSummariesByGuid) { 799 auto RunThinBackend = [&](AddStreamFn AddStream) { 800 LTOLLVMContext BackendContext(Conf); 801 Expected<std::unique_ptr<Module>> MOrErr = BM.parseModule(BackendContext); 802 if (!MOrErr) 803 return MOrErr.takeError(); 804 805 return thinBackend(Conf, Task, AddStream, **MOrErr, CombinedIndex, 806 ImportList, DefinedGlobals, ModuleMap); 807 }; 808 809 auto ModuleID = BM.getModuleIdentifier(); 810 811 if (!Cache || !CombinedIndex.modulePaths().count(ModuleID) || 812 all_of(CombinedIndex.getModuleHash(ModuleID), 813 [](uint32_t V) { return V == 0; })) 814 // Cache disabled or no entry for this module in the combined index or 815 // no module hash. 816 return RunThinBackend(AddStream); 817 818 SmallString<40> Key; 819 // The module may be cached, this helps handling it. 820 computeCacheKey(Key, Conf, CombinedIndex, ModuleID, ImportList, ExportList, 821 ResolvedODR, DefinedGlobals, TypeIdSummariesByGuid); 822 if (AddStreamFn CacheAddStream = Cache(Task, Key)) 823 return RunThinBackend(CacheAddStream); 824 825 return Error::success(); 826 } 827 828 Error start( 829 unsigned Task, BitcodeModule BM, 830 const FunctionImporter::ImportMapTy &ImportList, 831 const FunctionImporter::ExportSetTy &ExportList, 832 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 833 MapVector<StringRef, BitcodeModule> &ModuleMap) override { 834 StringRef ModulePath = BM.getModuleIdentifier(); 835 assert(ModuleToDefinedGVSummaries.count(ModulePath)); 836 const GVSummaryMapTy &DefinedGlobals = 837 ModuleToDefinedGVSummaries.find(ModulePath)->second; 838 BackendThreadPool.async( 839 [=](BitcodeModule BM, ModuleSummaryIndex &CombinedIndex, 840 const FunctionImporter::ImportMapTy &ImportList, 841 const FunctionImporter::ExportSetTy &ExportList, 842 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> 843 &ResolvedODR, 844 const GVSummaryMapTy &DefinedGlobals, 845 MapVector<StringRef, BitcodeModule> &ModuleMap, 846 const TypeIdSummariesByGuidTy &TypeIdSummariesByGuid) { 847 Error E = runThinLTOBackendThread( 848 AddStream, Cache, Task, BM, CombinedIndex, ImportList, ExportList, 849 ResolvedODR, DefinedGlobals, ModuleMap, TypeIdSummariesByGuid); 850 if (E) { 851 std::unique_lock<std::mutex> L(ErrMu); 852 if (Err) 853 Err = joinErrors(std::move(*Err), std::move(E)); 854 else 855 Err = std::move(E); 856 } 857 }, 858 BM, std::ref(CombinedIndex), std::ref(ImportList), std::ref(ExportList), 859 std::ref(ResolvedODR), std::ref(DefinedGlobals), std::ref(ModuleMap), 860 std::ref(TypeIdSummariesByGuid)); 861 return Error::success(); 862 } 863 864 Error wait() override { 865 BackendThreadPool.wait(); 866 if (Err) 867 return std::move(*Err); 868 else 869 return Error::success(); 870 } 871 }; 872 } // end anonymous namespace 873 874 ThinBackend lto::createInProcessThinBackend(unsigned ParallelismLevel) { 875 return [=](Config &Conf, ModuleSummaryIndex &CombinedIndex, 876 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries, 877 AddStreamFn AddStream, NativeObjectCache Cache) { 878 return llvm::make_unique<InProcessThinBackend>( 879 Conf, CombinedIndex, ParallelismLevel, ModuleToDefinedGVSummaries, 880 AddStream, Cache); 881 }; 882 } 883 884 // Given the original \p Path to an output file, replace any path 885 // prefix matching \p OldPrefix with \p NewPrefix. Also, create the 886 // resulting directory if it does not yet exist. 887 std::string lto::getThinLTOOutputFile(const std::string &Path, 888 const std::string &OldPrefix, 889 const std::string &NewPrefix) { 890 if (OldPrefix.empty() && NewPrefix.empty()) 891 return Path; 892 SmallString<128> NewPath(Path); 893 llvm::sys::path::replace_path_prefix(NewPath, OldPrefix, NewPrefix); 894 StringRef ParentPath = llvm::sys::path::parent_path(NewPath.str()); 895 if (!ParentPath.empty()) { 896 // Make sure the new directory exists, creating it if necessary. 897 if (std::error_code EC = llvm::sys::fs::create_directories(ParentPath)) 898 llvm::errs() << "warning: could not create directory '" << ParentPath 899 << "': " << EC.message() << '\n'; 900 } 901 return NewPath.str(); 902 } 903 904 namespace { 905 class WriteIndexesThinBackend : public ThinBackendProc { 906 std::string OldPrefix, NewPrefix; 907 bool ShouldEmitImportsFiles; 908 909 std::string LinkedObjectsFileName; 910 std::unique_ptr<llvm::raw_fd_ostream> LinkedObjectsFile; 911 912 public: 913 WriteIndexesThinBackend( 914 Config &Conf, ModuleSummaryIndex &CombinedIndex, 915 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries, 916 std::string OldPrefix, std::string NewPrefix, bool ShouldEmitImportsFiles, 917 std::string LinkedObjectsFileName) 918 : ThinBackendProc(Conf, CombinedIndex, ModuleToDefinedGVSummaries), 919 OldPrefix(OldPrefix), NewPrefix(NewPrefix), 920 ShouldEmitImportsFiles(ShouldEmitImportsFiles), 921 LinkedObjectsFileName(LinkedObjectsFileName) {} 922 923 Error start( 924 unsigned Task, BitcodeModule BM, 925 const FunctionImporter::ImportMapTy &ImportList, 926 const FunctionImporter::ExportSetTy &ExportList, 927 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 928 MapVector<StringRef, BitcodeModule> &ModuleMap) override { 929 StringRef ModulePath = BM.getModuleIdentifier(); 930 std::string NewModulePath = 931 getThinLTOOutputFile(ModulePath, OldPrefix, NewPrefix); 932 933 std::error_code EC; 934 if (!LinkedObjectsFileName.empty()) { 935 if (!LinkedObjectsFile) { 936 LinkedObjectsFile = llvm::make_unique<raw_fd_ostream>( 937 LinkedObjectsFileName, EC, sys::fs::OpenFlags::F_None); 938 if (EC) 939 return errorCodeToError(EC); 940 } 941 *LinkedObjectsFile << NewModulePath << '\n'; 942 } 943 944 std::map<std::string, GVSummaryMapTy> ModuleToSummariesForIndex; 945 gatherImportedSummariesForModule(ModulePath, ModuleToDefinedGVSummaries, 946 ImportList, ModuleToSummariesForIndex); 947 948 raw_fd_ostream OS(NewModulePath + ".thinlto.bc", EC, 949 sys::fs::OpenFlags::F_None); 950 if (EC) 951 return errorCodeToError(EC); 952 WriteIndexToFile(CombinedIndex, OS, &ModuleToSummariesForIndex); 953 954 if (ShouldEmitImportsFiles) 955 return errorCodeToError( 956 EmitImportsFiles(ModulePath, NewModulePath + ".imports", ImportList)); 957 return Error::success(); 958 } 959 960 Error wait() override { return Error::success(); } 961 }; 962 } // end anonymous namespace 963 964 ThinBackend lto::createWriteIndexesThinBackend(std::string OldPrefix, 965 std::string NewPrefix, 966 bool ShouldEmitImportsFiles, 967 std::string LinkedObjectsFile) { 968 return [=](Config &Conf, ModuleSummaryIndex &CombinedIndex, 969 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries, 970 AddStreamFn AddStream, NativeObjectCache Cache) { 971 return llvm::make_unique<WriteIndexesThinBackend>( 972 Conf, CombinedIndex, ModuleToDefinedGVSummaries, OldPrefix, NewPrefix, 973 ShouldEmitImportsFiles, LinkedObjectsFile); 974 }; 975 } 976 977 Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache, 978 bool HasRegularLTO) { 979 if (ThinLTO.ModuleMap.empty()) 980 return Error::success(); 981 982 if (Conf.CombinedIndexHook && !Conf.CombinedIndexHook(ThinLTO.CombinedIndex)) 983 return Error::success(); 984 985 // Collect for each module the list of function it defines (GUID -> 986 // Summary). 987 StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>> 988 ModuleToDefinedGVSummaries(ThinLTO.ModuleMap.size()); 989 ThinLTO.CombinedIndex.collectDefinedGVSummariesPerModule( 990 ModuleToDefinedGVSummaries); 991 // Create entries for any modules that didn't have any GV summaries 992 // (either they didn't have any GVs to start with, or we suppressed 993 // generation of the summaries because they e.g. had inline assembly 994 // uses that couldn't be promoted/renamed on export). This is so 995 // InProcessThinBackend::start can still launch a backend thread, which 996 // is passed the map of summaries for the module, without any special 997 // handling for this case. 998 for (auto &Mod : ThinLTO.ModuleMap) 999 if (!ModuleToDefinedGVSummaries.count(Mod.first)) 1000 ModuleToDefinedGVSummaries.try_emplace(Mod.first); 1001 1002 StringMap<FunctionImporter::ImportMapTy> ImportLists( 1003 ThinLTO.ModuleMap.size()); 1004 StringMap<FunctionImporter::ExportSetTy> ExportLists( 1005 ThinLTO.ModuleMap.size()); 1006 StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR; 1007 1008 if (Conf.OptLevel > 0) { 1009 // Compute "dead" symbols, we don't want to import/export these! 1010 DenseSet<GlobalValue::GUID> GUIDPreservedSymbols; 1011 for (auto &Res : GlobalResolutions) { 1012 if (Res.second.VisibleOutsideThinLTO && 1013 // IRName will be defined if we have seen the prevailing copy of 1014 // this value. If not, no need to preserve any ThinLTO copies. 1015 !Res.second.IRName.empty()) 1016 GUIDPreservedSymbols.insert(GlobalValue::getGUID(Res.second.IRName)); 1017 } 1018 1019 auto DeadSymbols = 1020 computeDeadSymbols(ThinLTO.CombinedIndex, GUIDPreservedSymbols); 1021 1022 ComputeCrossModuleImport(ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries, 1023 ImportLists, ExportLists, &DeadSymbols); 1024 1025 std::set<GlobalValue::GUID> ExportedGUIDs; 1026 for (auto &Res : GlobalResolutions) { 1027 // First check if the symbol was flagged as having external references. 1028 if (Res.second.Partition != GlobalResolution::External) 1029 continue; 1030 // IRName will be defined if we have seen the prevailing copy of 1031 // this value. If not, no need to mark as exported from a ThinLTO 1032 // partition (and we can't get the GUID). 1033 if (Res.second.IRName.empty()) 1034 continue; 1035 auto GUID = GlobalValue::getGUID(Res.second.IRName); 1036 // Mark exported unless index-based analysis determined it to be dead. 1037 if (!DeadSymbols.count(GUID)) 1038 ExportedGUIDs.insert(GlobalValue::getGUID(Res.second.IRName)); 1039 } 1040 1041 auto isPrevailing = [&](GlobalValue::GUID GUID, 1042 const GlobalValueSummary *S) { 1043 return ThinLTO.PrevailingModuleForGUID[GUID] == S->modulePath(); 1044 }; 1045 auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) { 1046 const auto &ExportList = ExportLists.find(ModuleIdentifier); 1047 return (ExportList != ExportLists.end() && 1048 ExportList->second.count(GUID)) || 1049 ExportedGUIDs.count(GUID); 1050 }; 1051 thinLTOInternalizeAndPromoteInIndex(ThinLTO.CombinedIndex, isExported); 1052 1053 auto recordNewLinkage = [&](StringRef ModuleIdentifier, 1054 GlobalValue::GUID GUID, 1055 GlobalValue::LinkageTypes NewLinkage) { 1056 ResolvedODR[ModuleIdentifier][GUID] = NewLinkage; 1057 }; 1058 1059 thinLTOResolveWeakForLinkerInIndex(ThinLTO.CombinedIndex, isPrevailing, 1060 recordNewLinkage); 1061 } 1062 1063 std::unique_ptr<ThinBackendProc> BackendProc = 1064 ThinLTO.Backend(Conf, ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries, 1065 AddStream, Cache); 1066 1067 // Task numbers start at ParallelCodeGenParallelismLevel if an LTO 1068 // module is present, as tasks 0 through ParallelCodeGenParallelismLevel-1 1069 // are reserved for parallel code generation partitions. 1070 unsigned Task = 1071 HasRegularLTO ? RegularLTO.ParallelCodeGenParallelismLevel : 0; 1072 for (auto &Mod : ThinLTO.ModuleMap) { 1073 if (Error E = BackendProc->start(Task, Mod.second, ImportLists[Mod.first], 1074 ExportLists[Mod.first], 1075 ResolvedODR[Mod.first], ThinLTO.ModuleMap)) 1076 return E; 1077 ++Task; 1078 } 1079 1080 return BackendProc->wait(); 1081 } 1082 1083 Expected<std::unique_ptr<tool_output_file>> 1084 lto::setupOptimizationRemarks(LLVMContext &Context, 1085 StringRef LTORemarksFilename, 1086 bool LTOPassRemarksWithHotness, int Count) { 1087 if (LTORemarksFilename.empty()) 1088 return nullptr; 1089 1090 std::string Filename = LTORemarksFilename; 1091 if (Count != -1) 1092 Filename += ".thin." + llvm::utostr(Count) + ".yaml"; 1093 1094 std::error_code EC; 1095 auto DiagnosticFile = 1096 llvm::make_unique<tool_output_file>(Filename, EC, sys::fs::F_None); 1097 if (EC) 1098 return errorCodeToError(EC); 1099 Context.setDiagnosticsOutputFile( 1100 llvm::make_unique<yaml::Output>(DiagnosticFile->os())); 1101 if (LTOPassRemarksWithHotness) 1102 Context.setDiagnosticHotnessRequested(true); 1103 DiagnosticFile->keep(); 1104 return std::move(DiagnosticFile); 1105 } 1106