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/ReaderWriter.h" 18 #include "llvm/CodeGen/Analysis.h" 19 #include "llvm/IR/AutoUpgrade.h" 20 #include "llvm/IR/DiagnosticPrinter.h" 21 #include "llvm/IR/LegacyPassManager.h" 22 #include "llvm/LTO/LTOBackend.h" 23 #include "llvm/Linker/IRMover.h" 24 #include "llvm/Object/ModuleSummaryIndexObjectFile.h" 25 #include "llvm/Support/ManagedStatic.h" 26 #include "llvm/Support/MemoryBuffer.h" 27 #include "llvm/Support/Path.h" 28 #include "llvm/Support/SHA1.h" 29 #include "llvm/Support/SourceMgr.h" 30 #include "llvm/Support/TargetRegistry.h" 31 #include "llvm/Support/ThreadPool.h" 32 #include "llvm/Support/raw_ostream.h" 33 #include "llvm/Target/TargetMachine.h" 34 #include "llvm/Target/TargetOptions.h" 35 #include "llvm/Transforms/IPO.h" 36 #include "llvm/Transforms/IPO/PassManagerBuilder.h" 37 #include "llvm/Transforms/Utils/SplitModule.h" 38 39 #include <set> 40 41 using namespace llvm; 42 using namespace lto; 43 using namespace object; 44 45 #define DEBUG_TYPE "lto" 46 47 // Returns a unique hash for the Module considering the current list of 48 // export/import and other global analysis results. 49 // The hash is produced in \p Key. 50 static void computeCacheKey( 51 SmallString<40> &Key, const ModuleSummaryIndex &Index, StringRef ModuleID, 52 const FunctionImporter::ImportMapTy &ImportList, 53 const FunctionImporter::ExportSetTy &ExportList, 54 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 55 const GVSummaryMapTy &DefinedGlobals) { 56 // Compute the unique hash for this entry. 57 // This is based on the current compiler version, the module itself, the 58 // export list, the hash for every single module in the import list, the 59 // list of ResolvedODR for the module, and the list of preserved symbols. 60 SHA1 Hasher; 61 62 // Start with the compiler revision 63 Hasher.update(LLVM_VERSION_STRING); 64 #ifdef HAVE_LLVM_REVISION 65 Hasher.update(LLVM_REVISION); 66 #endif 67 68 // Include the hash for the current module 69 auto ModHash = Index.getModuleHash(ModuleID); 70 Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash))); 71 for (auto F : ExportList) 72 // The export list can impact the internalization, be conservative here 73 Hasher.update(ArrayRef<uint8_t>((uint8_t *)&F, sizeof(F))); 74 75 // Include the hash for every module we import functions from 76 for (auto &Entry : ImportList) { 77 auto ModHash = Index.getModuleHash(Entry.first()); 78 Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash))); 79 } 80 81 // Include the hash for the resolved ODR. 82 for (auto &Entry : ResolvedODR) { 83 Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.first, 84 sizeof(GlobalValue::GUID))); 85 Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.second, 86 sizeof(GlobalValue::LinkageTypes))); 87 } 88 89 // Include the hash for the linkage type to reflect internalization and weak 90 // resolution. 91 for (auto &GS : DefinedGlobals) { 92 GlobalValue::LinkageTypes Linkage = GS.second->linkage(); 93 Hasher.update( 94 ArrayRef<uint8_t>((const uint8_t *)&Linkage, sizeof(Linkage))); 95 } 96 97 Key = toHex(Hasher.result()); 98 } 99 100 // Simple helper to load a module from bitcode 101 std::unique_ptr<Module> 102 llvm::loadModuleFromBuffer(const MemoryBufferRef &Buffer, LLVMContext &Context, 103 bool Lazy) { 104 SMDiagnostic Err; 105 ErrorOr<std::unique_ptr<Module>> ModuleOrErr(nullptr); 106 if (Lazy) { 107 ModuleOrErr = 108 getLazyBitcodeModule(MemoryBuffer::getMemBuffer(Buffer, false), Context, 109 /* ShouldLazyLoadMetadata */ Lazy); 110 } else { 111 ModuleOrErr = parseBitcodeFile(Buffer, Context); 112 } 113 if (std::error_code EC = ModuleOrErr.getError()) { 114 Err = SMDiagnostic(Buffer.getBufferIdentifier(), SourceMgr::DK_Error, 115 EC.message()); 116 Err.print("ThinLTO", errs()); 117 report_fatal_error("Can't load module, abort."); 118 } 119 return std::move(ModuleOrErr.get()); 120 } 121 122 static void thinLTOResolveWeakForLinkerGUID( 123 GlobalValueSummaryList &GVSummaryList, GlobalValue::GUID GUID, 124 DenseSet<GlobalValueSummary *> &GlobalInvolvedWithAlias, 125 function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)> 126 isPrevailing, 127 function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)> 128 recordNewLinkage) { 129 for (auto &S : GVSummaryList) { 130 if (GlobalInvolvedWithAlias.count(S.get())) 131 continue; 132 GlobalValue::LinkageTypes OriginalLinkage = S->linkage(); 133 if (!GlobalValue::isWeakForLinker(OriginalLinkage)) 134 continue; 135 // We need to emit only one of these. The prevailing module will keep it, 136 // but turned into a weak, while the others will drop it when possible. 137 if (isPrevailing(GUID, S.get())) { 138 if (GlobalValue::isLinkOnceLinkage(OriginalLinkage)) 139 S->setLinkage(GlobalValue::getWeakLinkage( 140 GlobalValue::isLinkOnceODRLinkage(OriginalLinkage))); 141 } 142 // Alias can't be turned into available_externally. 143 else if (!isa<AliasSummary>(S.get()) && 144 (GlobalValue::isLinkOnceODRLinkage(OriginalLinkage) || 145 GlobalValue::isWeakODRLinkage(OriginalLinkage))) 146 S->setLinkage(GlobalValue::AvailableExternallyLinkage); 147 if (S->linkage() != OriginalLinkage) 148 recordNewLinkage(S->modulePath(), GUID, S->linkage()); 149 } 150 } 151 152 // Resolve Weak and LinkOnce values in the \p Index. 153 // 154 // We'd like to drop these functions if they are no longer referenced in the 155 // current module. However there is a chance that another module is still 156 // referencing them because of the import. We make sure we always emit at least 157 // one copy. 158 void llvm::thinLTOResolveWeakForLinkerInIndex( 159 ModuleSummaryIndex &Index, 160 function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)> 161 isPrevailing, 162 function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)> 163 recordNewLinkage) { 164 // We won't optimize the globals that are referenced by an alias for now 165 // Ideally we should turn the alias into a global and duplicate the definition 166 // when needed. 167 DenseSet<GlobalValueSummary *> GlobalInvolvedWithAlias; 168 for (auto &I : Index) 169 for (auto &S : I.second) 170 if (auto AS = dyn_cast<AliasSummary>(S.get())) 171 GlobalInvolvedWithAlias.insert(&AS->getAliasee()); 172 173 for (auto &I : Index) 174 thinLTOResolveWeakForLinkerGUID(I.second, I.first, GlobalInvolvedWithAlias, 175 isPrevailing, recordNewLinkage); 176 } 177 178 static void thinLTOInternalizeAndPromoteGUID( 179 GlobalValueSummaryList &GVSummaryList, GlobalValue::GUID GUID, 180 function_ref<bool(StringRef, GlobalValue::GUID)> isExported) { 181 for (auto &S : GVSummaryList) { 182 if (isExported(S->modulePath(), GUID)) { 183 if (GlobalValue::isLocalLinkage(S->linkage())) 184 S->setLinkage(GlobalValue::ExternalLinkage); 185 } else if (!GlobalValue::isLocalLinkage(S->linkage())) 186 S->setLinkage(GlobalValue::InternalLinkage); 187 } 188 } 189 190 // Update the linkages in the given \p Index to mark exported values 191 // as external and non-exported values as internal. 192 void llvm::thinLTOInternalizeAndPromoteInIndex( 193 ModuleSummaryIndex &Index, 194 function_ref<bool(StringRef, GlobalValue::GUID)> isExported) { 195 for (auto &I : Index) 196 thinLTOInternalizeAndPromoteGUID(I.second, I.first, isExported); 197 } 198 199 Expected<std::unique_ptr<InputFile>> InputFile::create(MemoryBufferRef Object) { 200 std::unique_ptr<InputFile> File(new InputFile); 201 std::string Msg; 202 auto DiagHandler = [](const DiagnosticInfo &DI, void *MsgP) { 203 auto *Msg = reinterpret_cast<std::string *>(MsgP); 204 raw_string_ostream OS(*Msg); 205 DiagnosticPrinterRawOStream DP(OS); 206 DI.print(DP); 207 }; 208 File->Ctx.setDiagnosticHandler(DiagHandler, static_cast<void *>(&Msg)); 209 210 ErrorOr<std::unique_ptr<object::IRObjectFile>> IRObj = 211 IRObjectFile::create(Object, File->Ctx); 212 if (!Msg.empty()) 213 return make_error<StringError>(Msg, inconvertibleErrorCode()); 214 if (!IRObj) 215 return errorCodeToError(IRObj.getError()); 216 File->Obj = std::move(*IRObj); 217 218 File->Ctx.setDiagnosticHandler(nullptr, nullptr); 219 220 return std::move(File); 221 } 222 223 LTO::RegularLTOState::RegularLTOState(unsigned ParallelCodeGenParallelismLevel, 224 Config &Conf) 225 : ParallelCodeGenParallelismLevel(ParallelCodeGenParallelismLevel), 226 Ctx(Conf) {} 227 228 LTO::ThinLTOState::ThinLTOState(ThinBackend Backend) : Backend(Backend) { 229 if (!Backend) 230 this->Backend = createInProcessThinBackend(thread::hardware_concurrency()); 231 } 232 233 LTO::LTO(Config Conf, ThinBackend Backend, 234 unsigned ParallelCodeGenParallelismLevel) 235 : Conf(std::move(Conf)), 236 RegularLTO(ParallelCodeGenParallelismLevel, this->Conf), 237 ThinLTO(std::move(Backend)) {} 238 239 // Add the given symbol to the GlobalResolutions map, and resolve its partition. 240 void LTO::addSymbolToGlobalRes(IRObjectFile *Obj, 241 SmallPtrSet<GlobalValue *, 8> &Used, 242 const InputFile::Symbol &Sym, 243 SymbolResolution Res, unsigned Partition) { 244 GlobalValue *GV = Obj->getSymbolGV(Sym.I->getRawDataRefImpl()); 245 246 auto &GlobalRes = GlobalResolutions[Sym.getName()]; 247 if (GV) { 248 GlobalRes.UnnamedAddr &= GV->hasGlobalUnnamedAddr(); 249 if (Res.Prevailing) 250 GlobalRes.IRName = GV->getName(); 251 } 252 if (Res.VisibleToRegularObj || (GV && Used.count(GV)) || 253 (GlobalRes.Partition != GlobalResolution::Unknown && 254 GlobalRes.Partition != Partition)) 255 GlobalRes.Partition = GlobalResolution::External; 256 else 257 GlobalRes.Partition = Partition; 258 } 259 260 static void writeToResolutionFile(raw_ostream &OS, InputFile *Input, 261 ArrayRef<SymbolResolution> Res) { 262 StringRef Path = Input->getMemoryBufferRef().getBufferIdentifier(); 263 OS << Path << '\n'; 264 auto ResI = Res.begin(); 265 for (const InputFile::Symbol &Sym : Input->symbols()) { 266 assert(ResI != Res.end()); 267 SymbolResolution Res = *ResI++; 268 269 OS << "-r=" << Path << ',' << Sym.getName() << ','; 270 if (Res.Prevailing) 271 OS << 'p'; 272 if (Res.FinalDefinitionInLinkageUnit) 273 OS << 'l'; 274 if (Res.VisibleToRegularObj) 275 OS << 'x'; 276 OS << '\n'; 277 } 278 assert(ResI == Res.end()); 279 } 280 281 Error LTO::add(std::unique_ptr<InputFile> Input, 282 ArrayRef<SymbolResolution> Res) { 283 assert(!CalledGetMaxTasks); 284 285 if (Conf.ResolutionFile) 286 writeToResolutionFile(*Conf.ResolutionFile, Input.get(), Res); 287 288 // FIXME: move to backend 289 Module &M = Input->Obj->getModule(); 290 if (!Conf.OverrideTriple.empty()) 291 M.setTargetTriple(Conf.OverrideTriple); 292 else if (M.getTargetTriple().empty()) 293 M.setTargetTriple(Conf.DefaultTriple); 294 295 MemoryBufferRef MBRef = Input->Obj->getMemoryBufferRef(); 296 bool HasThinLTOSummary = hasGlobalValueSummary(MBRef, Conf.DiagHandler); 297 298 if (HasThinLTOSummary) 299 return addThinLTO(std::move(Input), Res); 300 else 301 return addRegularLTO(std::move(Input), Res); 302 } 303 304 // Add a regular LTO object to the link. 305 Error LTO::addRegularLTO(std::unique_ptr<InputFile> Input, 306 ArrayRef<SymbolResolution> Res) { 307 if (!RegularLTO.CombinedModule) { 308 RegularLTO.CombinedModule = 309 llvm::make_unique<Module>("ld-temp.o", RegularLTO.Ctx); 310 RegularLTO.Mover = llvm::make_unique<IRMover>(*RegularLTO.CombinedModule); 311 } 312 ErrorOr<std::unique_ptr<object::IRObjectFile>> ObjOrErr = 313 IRObjectFile::create(Input->Obj->getMemoryBufferRef(), RegularLTO.Ctx); 314 if (!ObjOrErr) 315 return errorCodeToError(ObjOrErr.getError()); 316 std::unique_ptr<object::IRObjectFile> Obj = std::move(*ObjOrErr); 317 318 Module &M = Obj->getModule(); 319 M.materializeMetadata(); 320 UpgradeDebugInfo(M); 321 322 SmallPtrSet<GlobalValue *, 8> Used; 323 collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); 324 325 std::vector<GlobalValue *> Keep; 326 327 for (GlobalVariable &GV : M.globals()) 328 if (GV.hasAppendingLinkage()) 329 Keep.push_back(&GV); 330 331 auto ResI = Res.begin(); 332 for (const InputFile::Symbol &Sym : 333 make_range(InputFile::symbol_iterator(Obj->symbol_begin()), 334 InputFile::symbol_iterator(Obj->symbol_end()))) { 335 assert(ResI != Res.end()); 336 SymbolResolution Res = *ResI++; 337 addSymbolToGlobalRes(Obj.get(), Used, Sym, Res, 0); 338 339 GlobalValue *GV = Obj->getSymbolGV(Sym.I->getRawDataRefImpl()); 340 if (Sym.getFlags() & object::BasicSymbolRef::SF_Undefined) 341 continue; 342 if (Res.Prevailing && GV) { 343 Keep.push_back(GV); 344 switch (GV->getLinkage()) { 345 default: 346 break; 347 case GlobalValue::LinkOnceAnyLinkage: 348 GV->setLinkage(GlobalValue::WeakAnyLinkage); 349 break; 350 case GlobalValue::LinkOnceODRLinkage: 351 GV->setLinkage(GlobalValue::WeakODRLinkage); 352 break; 353 } 354 } 355 // Common resolution: collect the maximum size/alignment over all commons. 356 // We also record if we see an instance of a common as prevailing, so that 357 // if none is prevailing we can ignore it later. 358 if (Sym.getFlags() & object::BasicSymbolRef::SF_Common) { 359 auto &CommonRes = RegularLTO.Commons[Sym.getIRName()]; 360 CommonRes.Size = std::max(CommonRes.Size, Sym.getCommonSize()); 361 CommonRes.Align = std::max(CommonRes.Align, Sym.getCommonAlignment()); 362 CommonRes.Prevailing |= Res.Prevailing; 363 } 364 365 // FIXME: use proposed local attribute for FinalDefinitionInLinkageUnit. 366 } 367 assert(ResI == Res.end()); 368 369 return RegularLTO.Mover->move(Obj->takeModule(), Keep, 370 [](GlobalValue &, IRMover::ValueAdder) {}); 371 } 372 373 // Add a ThinLTO object to the link. 374 Error LTO::addThinLTO(std::unique_ptr<InputFile> Input, 375 ArrayRef<SymbolResolution> Res) { 376 Module &M = Input->Obj->getModule(); 377 SmallPtrSet<GlobalValue *, 8> Used; 378 collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); 379 380 MemoryBufferRef MBRef = Input->Obj->getMemoryBufferRef(); 381 ErrorOr<std::unique_ptr<object::ModuleSummaryIndexObjectFile>> 382 SummaryObjOrErr = 383 object::ModuleSummaryIndexObjectFile::create(MBRef, Conf.DiagHandler); 384 if (!SummaryObjOrErr) 385 return errorCodeToError(SummaryObjOrErr.getError()); 386 ThinLTO.CombinedIndex.mergeFrom((*SummaryObjOrErr)->takeIndex(), 387 ThinLTO.ModuleMap.size()); 388 389 auto ResI = Res.begin(); 390 for (const InputFile::Symbol &Sym : Input->symbols()) { 391 assert(ResI != Res.end()); 392 SymbolResolution Res = *ResI++; 393 addSymbolToGlobalRes(Input->Obj.get(), Used, Sym, Res, 394 ThinLTO.ModuleMap.size() + 1); 395 396 GlobalValue *GV = Input->Obj->getSymbolGV(Sym.I->getRawDataRefImpl()); 397 if (Res.Prevailing && GV) 398 ThinLTO.PrevailingModuleForGUID[GV->getGUID()] = 399 MBRef.getBufferIdentifier(); 400 } 401 assert(ResI == Res.end()); 402 403 ThinLTO.ModuleMap[MBRef.getBufferIdentifier()] = MBRef; 404 return Error(); 405 } 406 407 unsigned LTO::getMaxTasks() const { 408 CalledGetMaxTasks = true; 409 return RegularLTO.ParallelCodeGenParallelismLevel + ThinLTO.ModuleMap.size(); 410 } 411 412 Error LTO::run(AddStreamFn AddStream, NativeObjectCache Cache) { 413 // Save the status of having a regularLTO combined module, as 414 // this is needed for generating the ThinLTO Task ID, and 415 // the CombinedModule will be moved at the end of runRegularLTO. 416 bool HasRegularLTO = RegularLTO.CombinedModule != nullptr; 417 // Invoke regular LTO if there was a regular LTO module to start with. 418 if (HasRegularLTO) 419 if (auto E = runRegularLTO(AddStream)) 420 return E; 421 return runThinLTO(AddStream, Cache, HasRegularLTO); 422 } 423 424 Error LTO::runRegularLTO(AddStreamFn AddStream) { 425 // Make sure commons have the right size/alignment: we kept the largest from 426 // all the prevailing when adding the inputs, and we apply it here. 427 const DataLayout &DL = RegularLTO.CombinedModule->getDataLayout(); 428 for (auto &I : RegularLTO.Commons) { 429 if (!I.second.Prevailing) 430 // Don't do anything if no instance of this common was prevailing. 431 continue; 432 GlobalVariable *OldGV = RegularLTO.CombinedModule->getNamedGlobal(I.first); 433 if (OldGV && DL.getTypeAllocSize(OldGV->getValueType()) == I.second.Size) { 434 // Don't create a new global if the type is already correct, just make 435 // sure the alignment is correct. 436 OldGV->setAlignment(I.second.Align); 437 continue; 438 } 439 ArrayType *Ty = 440 ArrayType::get(Type::getInt8Ty(RegularLTO.Ctx), I.second.Size); 441 auto *GV = new GlobalVariable(*RegularLTO.CombinedModule, Ty, false, 442 GlobalValue::CommonLinkage, 443 ConstantAggregateZero::get(Ty), ""); 444 GV->setAlignment(I.second.Align); 445 if (OldGV) { 446 OldGV->replaceAllUsesWith(ConstantExpr::getBitCast(GV, OldGV->getType())); 447 GV->takeName(OldGV); 448 OldGV->eraseFromParent(); 449 } else { 450 GV->setName(I.first); 451 } 452 } 453 454 if (Conf.PreOptModuleHook && 455 !Conf.PreOptModuleHook(0, *RegularLTO.CombinedModule)) 456 return Error(); 457 458 if (!Conf.CodeGenOnly) { 459 for (const auto &R : GlobalResolutions) { 460 if (R.second.IRName.empty()) 461 continue; 462 if (R.second.Partition != 0 && 463 R.second.Partition != GlobalResolution::External) 464 continue; 465 466 GlobalValue *GV = 467 RegularLTO.CombinedModule->getNamedValue(R.second.IRName); 468 // Ignore symbols defined in other partitions. 469 if (!GV || GV->hasLocalLinkage()) 470 continue; 471 GV->setUnnamedAddr(R.second.UnnamedAddr ? GlobalValue::UnnamedAddr::Global 472 : GlobalValue::UnnamedAddr::None); 473 if (R.second.Partition == 0) 474 GV->setLinkage(GlobalValue::InternalLinkage); 475 } 476 477 if (Conf.PostInternalizeModuleHook && 478 !Conf.PostInternalizeModuleHook(0, *RegularLTO.CombinedModule)) 479 return Error(); 480 } 481 return backend(Conf, AddStream, RegularLTO.ParallelCodeGenParallelismLevel, 482 std::move(RegularLTO.CombinedModule)); 483 } 484 485 /// This class defines the interface to the ThinLTO backend. 486 class lto::ThinBackendProc { 487 protected: 488 Config &Conf; 489 ModuleSummaryIndex &CombinedIndex; 490 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries; 491 492 public: 493 ThinBackendProc(Config &Conf, ModuleSummaryIndex &CombinedIndex, 494 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries) 495 : Conf(Conf), CombinedIndex(CombinedIndex), 496 ModuleToDefinedGVSummaries(ModuleToDefinedGVSummaries) {} 497 498 virtual ~ThinBackendProc() {} 499 virtual Error start( 500 unsigned Task, MemoryBufferRef MBRef, 501 const FunctionImporter::ImportMapTy &ImportList, 502 const FunctionImporter::ExportSetTy &ExportList, 503 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 504 MapVector<StringRef, MemoryBufferRef> &ModuleMap) = 0; 505 virtual Error wait() = 0; 506 }; 507 508 class InProcessThinBackend : public ThinBackendProc { 509 ThreadPool BackendThreadPool; 510 AddStreamFn AddStream; 511 NativeObjectCache Cache; 512 513 Optional<Error> Err; 514 std::mutex ErrMu; 515 516 public: 517 InProcessThinBackend( 518 Config &Conf, ModuleSummaryIndex &CombinedIndex, 519 unsigned ThinLTOParallelismLevel, 520 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries, 521 AddStreamFn AddStream, NativeObjectCache Cache) 522 : ThinBackendProc(Conf, CombinedIndex, ModuleToDefinedGVSummaries), 523 BackendThreadPool(ThinLTOParallelismLevel), 524 AddStream(std::move(AddStream)), Cache(std::move(Cache)) {} 525 526 Error runThinLTOBackendThread( 527 AddStreamFn AddStream, NativeObjectCache Cache, unsigned Task, 528 MemoryBufferRef MBRef, ModuleSummaryIndex &CombinedIndex, 529 const FunctionImporter::ImportMapTy &ImportList, 530 const FunctionImporter::ExportSetTy &ExportList, 531 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 532 const GVSummaryMapTy &DefinedGlobals, 533 MapVector<StringRef, MemoryBufferRef> &ModuleMap) { 534 auto RunThinBackend = [&](AddStreamFn AddStream) { 535 LTOLLVMContext BackendContext(Conf); 536 ErrorOr<std::unique_ptr<Module>> MOrErr = 537 parseBitcodeFile(MBRef, BackendContext); 538 assert(MOrErr && "Unable to load module in thread?"); 539 540 return thinBackend(Conf, Task, AddStream, **MOrErr, CombinedIndex, 541 ImportList, DefinedGlobals, ModuleMap); 542 }; 543 544 if (!Cache) 545 return RunThinBackend(AddStream); 546 547 SmallString<40> Key; 548 // The module may be cached, this helps handling it. 549 computeCacheKey(Key, CombinedIndex, MBRef.getBufferIdentifier(), 550 ImportList, ExportList, ResolvedODR, DefinedGlobals); 551 if (AddStreamFn CacheAddStream = Cache(Task, Key)) 552 return RunThinBackend(CacheAddStream); 553 554 return Error(); 555 } 556 557 Error start( 558 unsigned Task, MemoryBufferRef MBRef, 559 const FunctionImporter::ImportMapTy &ImportList, 560 const FunctionImporter::ExportSetTy &ExportList, 561 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 562 MapVector<StringRef, MemoryBufferRef> &ModuleMap) override { 563 StringRef ModulePath = MBRef.getBufferIdentifier(); 564 assert(ModuleToDefinedGVSummaries.count(ModulePath)); 565 const GVSummaryMapTy &DefinedGlobals = 566 ModuleToDefinedGVSummaries.find(ModulePath)->second; 567 BackendThreadPool.async( 568 [=](MemoryBufferRef MBRef, ModuleSummaryIndex &CombinedIndex, 569 const FunctionImporter::ImportMapTy &ImportList, 570 const FunctionImporter::ExportSetTy &ExportList, 571 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> 572 &ResolvedODR, 573 const GVSummaryMapTy &DefinedGlobals, 574 MapVector<StringRef, MemoryBufferRef> &ModuleMap) { 575 Error E = runThinLTOBackendThread( 576 AddStream, Cache, Task, MBRef, CombinedIndex, ImportList, 577 ExportList, ResolvedODR, DefinedGlobals, ModuleMap); 578 if (E) { 579 std::unique_lock<std::mutex> L(ErrMu); 580 if (Err) 581 Err = joinErrors(std::move(*Err), std::move(E)); 582 else 583 Err = std::move(E); 584 } 585 }, 586 MBRef, std::ref(CombinedIndex), std::ref(ImportList), 587 std::ref(ExportList), std::ref(ResolvedODR), std::ref(DefinedGlobals), 588 std::ref(ModuleMap)); 589 return Error(); 590 } 591 592 Error wait() override { 593 BackendThreadPool.wait(); 594 if (Err) 595 return std::move(*Err); 596 else 597 return Error(); 598 } 599 }; 600 601 ThinBackend lto::createInProcessThinBackend(unsigned ParallelismLevel) { 602 return [=](Config &Conf, ModuleSummaryIndex &CombinedIndex, 603 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries, 604 AddStreamFn AddStream, NativeObjectCache Cache) { 605 return llvm::make_unique<InProcessThinBackend>( 606 Conf, CombinedIndex, ParallelismLevel, ModuleToDefinedGVSummaries, 607 AddStream, Cache); 608 }; 609 } 610 611 // Given the original \p Path to an output file, replace any path 612 // prefix matching \p OldPrefix with \p NewPrefix. Also, create the 613 // resulting directory if it does not yet exist. 614 std::string lto::getThinLTOOutputFile(const std::string &Path, 615 const std::string &OldPrefix, 616 const std::string &NewPrefix) { 617 if (OldPrefix.empty() && NewPrefix.empty()) 618 return Path; 619 SmallString<128> NewPath(Path); 620 llvm::sys::path::replace_path_prefix(NewPath, OldPrefix, NewPrefix); 621 StringRef ParentPath = llvm::sys::path::parent_path(NewPath.str()); 622 if (!ParentPath.empty()) { 623 // Make sure the new directory exists, creating it if necessary. 624 if (std::error_code EC = llvm::sys::fs::create_directories(ParentPath)) 625 llvm::errs() << "warning: could not create directory '" << ParentPath 626 << "': " << EC.message() << '\n'; 627 } 628 return NewPath.str(); 629 } 630 631 class WriteIndexesThinBackend : public ThinBackendProc { 632 std::string OldPrefix, NewPrefix; 633 bool ShouldEmitImportsFiles; 634 635 std::string LinkedObjectsFileName; 636 std::unique_ptr<llvm::raw_fd_ostream> LinkedObjectsFile; 637 638 public: 639 WriteIndexesThinBackend( 640 Config &Conf, ModuleSummaryIndex &CombinedIndex, 641 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries, 642 std::string OldPrefix, std::string NewPrefix, bool ShouldEmitImportsFiles, 643 std::string LinkedObjectsFileName) 644 : ThinBackendProc(Conf, CombinedIndex, ModuleToDefinedGVSummaries), 645 OldPrefix(OldPrefix), NewPrefix(NewPrefix), 646 ShouldEmitImportsFiles(ShouldEmitImportsFiles), 647 LinkedObjectsFileName(LinkedObjectsFileName) {} 648 649 Error start( 650 unsigned Task, MemoryBufferRef MBRef, 651 const FunctionImporter::ImportMapTy &ImportList, 652 const FunctionImporter::ExportSetTy &ExportList, 653 const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 654 MapVector<StringRef, MemoryBufferRef> &ModuleMap) override { 655 StringRef ModulePath = MBRef.getBufferIdentifier(); 656 std::string NewModulePath = 657 getThinLTOOutputFile(ModulePath, OldPrefix, NewPrefix); 658 659 std::error_code EC; 660 if (!LinkedObjectsFileName.empty()) { 661 if (!LinkedObjectsFile) { 662 LinkedObjectsFile = llvm::make_unique<raw_fd_ostream>( 663 LinkedObjectsFileName, EC, sys::fs::OpenFlags::F_None); 664 if (EC) 665 return errorCodeToError(EC); 666 } 667 *LinkedObjectsFile << NewModulePath << '\n'; 668 } 669 670 std::map<std::string, GVSummaryMapTy> ModuleToSummariesForIndex; 671 gatherImportedSummariesForModule(ModulePath, ModuleToDefinedGVSummaries, 672 ImportList, ModuleToSummariesForIndex); 673 674 raw_fd_ostream OS(NewModulePath + ".thinlto.bc", EC, 675 sys::fs::OpenFlags::F_None); 676 if (EC) 677 return errorCodeToError(EC); 678 WriteIndexToFile(CombinedIndex, OS, &ModuleToSummariesForIndex); 679 680 if (ShouldEmitImportsFiles) 681 return errorCodeToError( 682 EmitImportsFiles(ModulePath, NewModulePath + ".imports", ImportList)); 683 return Error(); 684 } 685 686 Error wait() override { return Error(); } 687 }; 688 689 ThinBackend lto::createWriteIndexesThinBackend(std::string OldPrefix, 690 std::string NewPrefix, 691 bool ShouldEmitImportsFiles, 692 std::string LinkedObjectsFile) { 693 return [=](Config &Conf, ModuleSummaryIndex &CombinedIndex, 694 const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries, 695 AddStreamFn AddStream, NativeObjectCache Cache) { 696 return llvm::make_unique<WriteIndexesThinBackend>( 697 Conf, CombinedIndex, ModuleToDefinedGVSummaries, OldPrefix, NewPrefix, 698 ShouldEmitImportsFiles, LinkedObjectsFile); 699 }; 700 } 701 702 Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache, 703 bool HasRegularLTO) { 704 if (ThinLTO.ModuleMap.empty()) 705 return Error(); 706 707 if (Conf.CombinedIndexHook && !Conf.CombinedIndexHook(ThinLTO.CombinedIndex)) 708 return Error(); 709 710 // Collect for each module the list of function it defines (GUID -> 711 // Summary). 712 StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>> 713 ModuleToDefinedGVSummaries(ThinLTO.ModuleMap.size()); 714 ThinLTO.CombinedIndex.collectDefinedGVSummariesPerModule( 715 ModuleToDefinedGVSummaries); 716 // Create entries for any modules that didn't have any GV summaries 717 // (either they didn't have any GVs to start with, or we suppressed 718 // generation of the summaries because they e.g. had inline assembly 719 // uses that couldn't be promoted/renamed on export). This is so 720 // InProcessThinBackend::start can still launch a backend thread, which 721 // is passed the map of summaries for the module, without any special 722 // handling for this case. 723 for (auto &Mod : ThinLTO.ModuleMap) 724 if (!ModuleToDefinedGVSummaries.count(Mod.first)) 725 ModuleToDefinedGVSummaries.try_emplace(Mod.first); 726 727 StringMap<FunctionImporter::ImportMapTy> ImportLists( 728 ThinLTO.ModuleMap.size()); 729 StringMap<FunctionImporter::ExportSetTy> ExportLists( 730 ThinLTO.ModuleMap.size()); 731 ComputeCrossModuleImport(ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries, 732 ImportLists, ExportLists); 733 734 std::set<GlobalValue::GUID> ExportedGUIDs; 735 for (auto &Res : GlobalResolutions) { 736 if (!Res.second.IRName.empty() && 737 Res.second.Partition == GlobalResolution::External) 738 ExportedGUIDs.insert(GlobalValue::getGUID(Res.second.IRName)); 739 } 740 741 auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) { 742 return ThinLTO.PrevailingModuleForGUID[GUID] == S->modulePath(); 743 }; 744 auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) { 745 const auto &ExportList = ExportLists.find(ModuleIdentifier); 746 return (ExportList != ExportLists.end() && 747 ExportList->second.count(GUID)) || 748 ExportedGUIDs.count(GUID); 749 }; 750 thinLTOInternalizeAndPromoteInIndex(ThinLTO.CombinedIndex, isExported); 751 752 StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR; 753 auto recordNewLinkage = [&](StringRef ModuleIdentifier, 754 GlobalValue::GUID GUID, 755 GlobalValue::LinkageTypes NewLinkage) { 756 ResolvedODR[ModuleIdentifier][GUID] = NewLinkage; 757 }; 758 759 thinLTOResolveWeakForLinkerInIndex(ThinLTO.CombinedIndex, isPrevailing, 760 recordNewLinkage); 761 762 std::unique_ptr<ThinBackendProc> BackendProc = 763 ThinLTO.Backend(Conf, ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries, 764 AddStream, Cache); 765 766 // Partition numbers for ThinLTO jobs start at 1 (see comments for 767 // GlobalResolution in LTO.h). Task numbers, however, start at 768 // ParallelCodeGenParallelismLevel if an LTO module is present, as tasks 0 769 // through ParallelCodeGenParallelismLevel-1 are reserved for parallel code 770 // generation partitions. 771 unsigned Task = 772 HasRegularLTO ? RegularLTO.ParallelCodeGenParallelismLevel : 0; 773 unsigned Partition = 1; 774 775 for (auto &Mod : ThinLTO.ModuleMap) { 776 if (Error E = BackendProc->start(Task, Mod.second, ImportLists[Mod.first], 777 ExportLists[Mod.first], 778 ResolvedODR[Mod.first], ThinLTO.ModuleMap)) 779 return E; 780 781 ++Task; 782 ++Partition; 783 } 784 785 return BackendProc->wait(); 786 } 787