1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===-ThinLTOCodeGenerator.cpp - LLVM Link Time Optimizer -----------------===// 2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// The LLVM Compiler Infrastructure 4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details. 7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file implements the Thin Link Time Optimization library. This library is 11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// intended to be used by linker to optimize code at link time. 12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/LTO/legacy/ThinLTOCodeGenerator.h" 16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifdef HAVE_LLVM_REVISION 18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "LLVMLTORevision.h" 19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/Statistic.h" 22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/StringExtras.h" 23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/ModuleSummaryAnalysis.h" 24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/TargetLibraryInfo.h" 25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/TargetTransformInfo.h" 26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Bitcode/BitcodeWriterPass.h" 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Bitcode/ReaderWriter.h" 28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/ObjectMemoryBuffer.h" 29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/DiagnosticPrinter.h" 30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/LLVMContext.h" 31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/LegacyPassManager.h" 32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/Mangler.h" 33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IRReader/IRReader.h" 34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/LTO/LTO.h" 35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Linker/Linker.h" 36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/MC/SubtargetFeature.h" 37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Object/IRObjectFile.h" 38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Object/ModuleSummaryIndexObjectFile.h" 39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/CachePruning.h" 40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Debug.h" 41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/Path.h" 42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/SHA1.h" 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/TargetRegistry.h" 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/ThreadPool.h" 45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Target/TargetMachine.h" 46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/IPO.h" 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/IPO/FunctionImport.h" 48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/IPO/Internalize.h" 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/IPO/PassManagerBuilder.h" 50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/ObjCARC.h" 51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/Utils/FunctionImportUtils.h" 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <numeric> 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm; 56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define DEBUG_TYPE "thinlto" 58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm { 60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Flags -discard-value-names, defined in LTOCodeGenerator.cpp 61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarextern cl::opt<bool> LTODiscardValueNames; 62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace { 65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic cl::opt<int> ThreadCount("threads", 67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar cl::init(std::thread::hardware_concurrency())); 68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void diagnosticHandler(const DiagnosticInfo &DI) { 70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DiagnosticPrinterRawOStream DP(errs()); 71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DI.print(DP); 72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs() << '\n'; 73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Simple helper to save temporary files for debug. 76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void saveTempBitcode(const Module &TheModule, StringRef TempDir, 77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned count, StringRef Suffix) { 78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (TempDir.empty()) 79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // User asked to save temps, let dump the bitcode file after import. 81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto SaveTempPath = TempDir + llvm::utostr(count) + Suffix; 82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::error_code EC; 83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_fd_ostream OS(SaveTempPath.str(), EC, sys::fs::F_None); 84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (EC) 85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error(Twine("Failed to open ") + SaveTempPath + 86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar " to save optimized bitcode\n"); 87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar WriteBitcodeToFile(&TheModule, OS, /* ShouldPreserveUseListOrder */ true); 88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic const GlobalValueSummary * 91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainargetFirstDefinitionForLinker(const GlobalValueSummaryList &GVSummaryList) { 92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // If there is any strong definition anywhere, get it. 93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto StrongDefForLinker = llvm::find_if( 94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GVSummaryList, [](const std::unique_ptr<GlobalValueSummary> &Summary) { 95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto Linkage = Summary->linkage(); 96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return !GlobalValue::isAvailableExternallyLinkage(Linkage) && 97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar !GlobalValue::isWeakForLinker(Linkage); 98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }); 99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (StrongDefForLinker != GVSummaryList.end()) 100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return StrongDefForLinker->get(); 101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Get the first *linker visible* definition for this global in the summary 102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // list. 103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto FirstDefForLinker = llvm::find_if( 104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GVSummaryList, [](const std::unique_ptr<GlobalValueSummary> &Summary) { 105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto Linkage = Summary->linkage(); 106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return !GlobalValue::isAvailableExternallyLinkage(Linkage); 107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }); 108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Extern templates can be emitted as available_externally. 109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (FirstDefForLinker == GVSummaryList.end()) 110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return nullptr; 111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return FirstDefForLinker->get(); 112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Populate map of GUID to the prevailing copy for any multiply defined 115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// symbols. Currently assume first copy is prevailing, or any strong 116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// definition. Can be refined with Linker information in the future. 117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void computePrevailingCopies( 118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const ModuleSummaryIndex &Index, 119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DenseMap<GlobalValue::GUID, const GlobalValueSummary *> &PrevailingCopy) { 120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto HasMultipleCopies = [&](const GlobalValueSummaryList &GVSummaryList) { 121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return GVSummaryList.size() > 1; 122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &I : Index) { 125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (HasMultipleCopies(I.second)) 126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PrevailingCopy[I.first] = getFirstDefinitionForLinker(I.second); 127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic StringMap<MemoryBufferRef> 131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainargenerateModuleMap(const std::vector<MemoryBufferRef> &Modules) { 132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<MemoryBufferRef> ModuleMap; 133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &ModuleBuffer : Modules) { 134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(ModuleMap.find(ModuleBuffer.getBufferIdentifier()) == 135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleMap.end() && 136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar "Expect unique Buffer Identifier"); 137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleMap[ModuleBuffer.getBufferIdentifier()] = ModuleBuffer; 138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return ModuleMap; 140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void promoteModule(Module &TheModule, const ModuleSummaryIndex &Index) { 143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (renameModuleForThinLTO(TheModule, Index)) 144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error("renameModuleForThinLTO failed"); 145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void 148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarcrossImportIntoModule(Module &TheModule, const ModuleSummaryIndex &Index, 149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<MemoryBufferRef> &ModuleMap, 150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const FunctionImporter::ImportMapTy &ImportList) { 151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleLoader Loader(TheModule.getContext(), ModuleMap); 152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FunctionImporter Importer(Index, Loader); 153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Importer.importFunctions(TheModule, ImportList); 154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void optimizeModule(Module &TheModule, TargetMachine &TM) { 157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Populate the PassManager 158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PassManagerBuilder PMB; 159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PMB.LibraryInfo = new TargetLibraryInfoImpl(TM.getTargetTriple()); 160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PMB.Inliner = createFunctionInliningPass(); 161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // FIXME: should get it from the bitcode? 162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PMB.OptLevel = 3; 163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PMB.LoopVectorize = true; 164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PMB.SLPVectorize = true; 165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PMB.VerifyInput = true; 166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PMB.VerifyOutput = false; 167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar legacy::PassManager PM; 169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Add the TTI (required to inform the vectorizer about register size for 171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // instance) 172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PM.add(createTargetTransformInfoWrapperPass(TM.getTargetIRAnalysis())); 173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Add optimizations 175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PMB.populateThinLTOPassManager(PM); 176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PM.run(TheModule); 178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Convert the PreservedSymbols map from "Name" based to "GUID" based. 181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic DenseSet<GlobalValue::GUID> 182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarcomputeGUIDPreservedSymbols(const StringSet<> &PreservedSymbols, 183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const Triple &TheTriple) { 184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DenseSet<GlobalValue::GUID> GUIDPreservedSymbols(PreservedSymbols.size()); 185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &Entry : PreservedSymbols) { 186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringRef Name = Entry.first(); 187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (TheTriple.isOSBinFormatMachO() && Name.size() > 0 && Name[0] == '_') 188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Name = Name.drop_front(); 189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GUIDPreservedSymbols.insert(GlobalValue::getGUID(Name)); 190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return GUIDPreservedSymbols; 192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::unique_ptr<MemoryBuffer> codegenModule(Module &TheModule, 195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetMachine &TM) { 196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SmallVector<char, 128> OutputBuffer; 197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // CodeGen 199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar { 200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_svector_ostream OS(OutputBuffer); 201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar legacy::PassManager PM; 202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // If the bitcode files contain ARC code and were compiled with optimization, 204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // the ObjCARCContractPass must be run, so do it unconditionally here. 205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PM.add(createObjCARCContractPass()); 206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Setup the codegen now. 208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (TM.addPassesToEmitFile(PM, OS, TargetMachine::CGFT_ObjectFile, 209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /* DisableVerify */ true)) 210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error("Failed to setup codegen"); 211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Run codegen now. resulting binary is in OutputBuffer. 213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PM.run(TheModule); 214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return make_unique<ObjectMemoryBuffer>(std::move(OutputBuffer)); 216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Manage caching for a single Module. 219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ModuleCacheEntry { 220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SmallString<128> EntryPath; 221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic: 223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Create a cache entry. This compute a unique hash for the Module considering 224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // the current list of export/import, and offer an interface to query to 225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // access the content in the cache. 226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleCacheEntry( 227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringRef CachePath, const ModuleSummaryIndex &Index, StringRef ModuleID, 228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const FunctionImporter::ImportMapTy &ImportList, 229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const FunctionImporter::ExportSetTy &ExportList, 230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR, 231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const GVSummaryMapTy &DefinedFunctions, 232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const DenseSet<GlobalValue::GUID> &PreservedSymbols) { 233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (CachePath.empty()) 234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Compute the unique hash for this entry 237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // This is based on the current compiler version, the module itself, the 238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // export list, the hash for every single module in the import list, the 239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // list of ResolvedODR for the module, and the list of preserved symbols. 240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SHA1 Hasher; 242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Start with the compiler revision 244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Hasher.update(LLVM_VERSION_STRING); 245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifdef HAVE_LLVM_REVISION 246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Hasher.update(LLVM_REVISION); 247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif 248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Include the hash for the current module 250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModHash = Index.getModuleHash(ModuleID); 251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash))); 252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto F : ExportList) 253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // The export list can impact the internalization, be conservative here 254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Hasher.update(ArrayRef<uint8_t>((uint8_t *)&F, sizeof(F))); 255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Include the hash for every module we import functions from 257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &Entry : ImportList) { 258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModHash = Index.getModuleHash(Entry.first()); 259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Hasher.update(ArrayRef<uint8_t>((uint8_t *)&ModHash[0], sizeof(ModHash))); 260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Include the hash for the resolved ODR. 263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &Entry : ResolvedODR) { 264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.first, 265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar sizeof(GlobalValue::GUID))); 266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Hasher.update(ArrayRef<uint8_t>((const uint8_t *)&Entry.second, 267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar sizeof(GlobalValue::LinkageTypes))); 268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Include the hash for the preserved symbols. 271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &Entry : PreservedSymbols) { 272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (DefinedFunctions.count(Entry)) 273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Hasher.update( 274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ArrayRef<uint8_t>((const uint8_t *)&Entry, sizeof(GlobalValue::GUID))); 275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar sys::path::append(EntryPath, CachePath, toHex(Hasher.result())); 278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Access the path to this entry in the cache. 281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringRef getEntryPath() { return EntryPath; } 282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Try loading the buffer for this cache entry. 284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ErrorOr<std::unique_ptr<MemoryBuffer>> tryLoadingBuffer() { 285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (EntryPath.empty()) 286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return std::error_code(); 287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return MemoryBuffer::getFile(EntryPath); 288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Cache the Produced object file 291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<MemoryBuffer> 292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar write(std::unique_ptr<MemoryBuffer> OutputBuffer) { 293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (EntryPath.empty()) 294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return OutputBuffer; 295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Write to a temporary to avoid race condition 297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SmallString<128> TempFilename; 298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar int TempFD; 299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::error_code EC = 300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar sys::fs::createTemporaryFile("Thin", "tmp.o", TempFD, TempFilename); 301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (EC) { 302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs() << "Error: " << EC.message() << "\n"; 303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error("ThinLTO: Can't get a temporary file"); 304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar { 306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_fd_ostream OS(TempFD, /* ShouldClose */ true); 307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << OutputBuffer->getBuffer(); 308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 309de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Rename to final destination (hopefully race condition won't matter here) 310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar EC = sys::fs::rename(TempFilename, EntryPath); 311de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (EC) { 312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar sys::fs::remove(TempFilename); 313de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_fd_ostream OS(EntryPath, EC, sys::fs::F_None); 314de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (EC) 315de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error(Twine("Failed to open ") + EntryPath + 316de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar " to save cached entry\n"); 317de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OS << OutputBuffer->getBuffer(); 318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ReloadedBufferOrErr = MemoryBuffer::getFile(EntryPath); 320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto EC = ReloadedBufferOrErr.getError()) { 321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // FIXME diagnose 322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs() << "error: can't reload cached file '" << EntryPath 323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << "': " << EC.message() << "\n"; 324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return OutputBuffer; 325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return std::move(*ReloadedBufferOrErr); 327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic std::unique_ptr<MemoryBuffer> 331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarProcessThinLTOModule(Module &TheModule, ModuleSummaryIndex &Index, 332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<MemoryBufferRef> &ModuleMap, TargetMachine &TM, 333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const FunctionImporter::ImportMapTy &ImportList, 334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const FunctionImporter::ExportSetTy &ExportList, 335de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols, 336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const GVSummaryMapTy &DefinedGlobals, 337de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const ThinLTOCodeGenerator::CachingOptions &CacheOptions, 338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool DisableCodeGen, StringRef SaveTempsDir, 339de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned count) { 340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // "Benchmark"-like optimization: single-source case 342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool SingleModule = (ModuleMap.size() == 1); 343de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!SingleModule) { 345de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar promoteModule(TheModule, Index); 346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Apply summary-based LinkOnce/Weak resolution decisions. 348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar thinLTOResolveWeakForLinkerModule(TheModule, DefinedGlobals); 349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Save temps: after promotion. 351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar saveTempBitcode(TheModule, SaveTempsDir, count, ".1.promoted.bc"); 352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Be friendly and don't nuke totally the module when the client didn't 355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // supply anything to preserve. 356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!ExportList.empty() || !GUIDPreservedSymbols.empty()) { 357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Apply summary-based internalization decisions. 358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar thinLTOInternalizeModule(TheModule, DefinedGlobals); 359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Save internalized bitcode 362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar saveTempBitcode(TheModule, SaveTempsDir, count, ".2.internalized.bc"); 363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!SingleModule) { 365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar crossImportIntoModule(TheModule, Index, ModuleMap, ImportList); 366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Save temps: after cross-module import. 368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar saveTempBitcode(TheModule, SaveTempsDir, count, ".3.imported.bc"); 369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar optimizeModule(TheModule, TM); 372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar saveTempBitcode(TheModule, SaveTempsDir, count, ".4.opt.bc"); 374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (DisableCodeGen) { 376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Configured to stop before CodeGen, serialize the bitcode and return. 377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SmallVector<char, 128> OutputBuffer; 378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar { 379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_svector_ostream OS(OutputBuffer); 380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleSummaryIndexBuilder IndexBuilder(&TheModule); 381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar WriteBitcodeToFile(&TheModule, OS, true, &IndexBuilder.getIndex()); 382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return make_unique<ObjectMemoryBuffer>(std::move(OutputBuffer)); 384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return codegenModule(TheModule, TM); 387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Resolve LinkOnce/Weak symbols. Record resolutions in the \p ResolvedODR map 390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// for caching, and in the \p Index for application during the ThinLTO 391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// backends. This is needed for correctness for exported symbols (ensure 392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// at least one copy kept) and a compile-time optimization (to drop duplicate 393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// copies when possible). 394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void resolveWeakForLinkerInIndex( 395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleSummaryIndex &Index, 396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> 397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar &ResolvedODR) { 398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DenseMap<GlobalValue::GUID, const GlobalValueSummary *> PrevailingCopy; 400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar computePrevailingCopies(Index, PrevailingCopy); 401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) { 403de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const auto &Prevailing = PrevailingCopy.find(GUID); 404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Not in map means that there was only one copy, which must be prevailing. 405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Prevailing == PrevailingCopy.end()) 406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return true; 407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Prevailing->second == S; 408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto recordNewLinkage = [&](StringRef ModuleIdentifier, 411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalValue::GUID GUID, 412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalValue::LinkageTypes NewLinkage) { 413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ResolvedODR[ModuleIdentifier][GUID] = NewLinkage; 414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar thinLTOResolveWeakForLinkerInIndex(Index, isPrevailing, recordNewLinkage); 417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 418de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 419de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Initialize the TargetMachine builder for a given Triple 420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void initTMBuilder(TargetMachineBuilder &TMBuilder, 421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const Triple &TheTriple) { 422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Set a default CPU for Darwin triples (copied from LTOCodeGenerator). 423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // FIXME this looks pretty terrible... 424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (TMBuilder.MCpu.empty() && TheTriple.isOSDarwin()) { 425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (TheTriple.getArch() == llvm::Triple::x86_64) 426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TMBuilder.MCpu = "core2"; 427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar else if (TheTriple.getArch() == llvm::Triple::x86) 428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TMBuilder.MCpu = "yonah"; 429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar else if (TheTriple.getArch() == llvm::Triple::aarch64) 430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TMBuilder.MCpu = "cyclone"; 431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TMBuilder.TheTriple = std::move(TheTriple); 433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // end anonymous namespace 436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::addModule(StringRef Identifier, StringRef Data) { 438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MemoryBufferRef Buffer(Data, Identifier); 439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Modules.empty()) { 440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // First module added, so initialize the triple and some options 441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LLVMContext Context; 442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Triple TheTriple(getBitcodeTargetTriple(Buffer, Context)); 443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar initTMBuilder(TMBuilder, Triple(TheTriple)); 444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef NDEBUG 446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar else { 447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LLVMContext Context; 448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(TMBuilder.TheTriple.str() == 449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar getBitcodeTargetTriple(Buffer, Context) && 450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar "ThinLTO modules with different triple not supported"); 451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif 453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Modules.push_back(Buffer); 454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::preserveSymbol(StringRef Name) { 457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PreservedSymbols.insert(Name); 458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 460de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::crossReferenceSymbol(StringRef Name) { 461de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // FIXME: At the moment, we don't take advantage of this extra information, 462de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // we're conservatively considering cross-references as preserved. 463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // CrossReferencedSymbols.insert(Name); 464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PreservedSymbols.insert(Name); 465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// TargetMachine factory 468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::unique_ptr<TargetMachine> TargetMachineBuilder::create() const { 469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string ErrMsg; 470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const Target *TheTarget = 471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetRegistry::lookupTarget(TheTriple.str(), ErrMsg); 472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!TheTarget) { 473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error("Can't load target for this Triple: " + ErrMsg); 474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Use MAttr as the default set of features. 477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SubtargetFeatures Features(MAttr); 478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Features.getDefaultSubtargetFeatures(TheTriple); 479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string FeatureStr = Features.getString(); 480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return std::unique_ptr<TargetMachine>(TheTarget->createTargetMachine( 481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TheTriple.str(), MCpu, FeatureStr, Options, RelocModel, 482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CodeModel::Default, CGOptLevel)); 483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 484de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 485de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/** 486de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Produce the combined summary index from all the bitcode files: 487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * "thin-link". 488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 489de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::unique_ptr<ModuleSummaryIndex> ThinLTOCodeGenerator::linkCombinedIndex() { 490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<ModuleSummaryIndex> CombinedIndex; 491de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint64_t NextModuleId = 0; 492de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &ModuleBuffer : Modules) { 493de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ErrorOr<std::unique_ptr<object::ModuleSummaryIndexObjectFile>> ObjOrErr = 494de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar object::ModuleSummaryIndexObjectFile::create(ModuleBuffer, 495de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar diagnosticHandler); 496de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (std::error_code EC = ObjOrErr.getError()) { 497de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // FIXME diagnose 498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar errs() << "error: can't create ModuleSummaryIndexObjectFile for buffer: " 499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << EC.message() << "\n"; 500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return nullptr; 501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto Index = (*ObjOrErr)->takeIndex(); 503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (CombinedIndex) { 504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CombinedIndex->mergeFrom(std::move(Index), ++NextModuleId); 505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } else { 506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CombinedIndex = std::move(Index); 507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return CombinedIndex; 510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/** 513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform promotion and renaming of exported internal functions. 514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Index is updated to reflect linkage changes from weak resolution. 515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::promote(Module &TheModule, 517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleSummaryIndex &Index) { 518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleCount = Index.modulePaths().size(); 519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleIdentifier = TheModule.getModuleIdentifier(); 520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Collect for each module the list of function it defines (GUID -> Summary). 521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries; 522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries); 523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Generate import/export list 525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount); 526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount); 527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists, 528de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportLists); 529de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Resolve LinkOnce/Weak symbols. 531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR; 532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar resolveWeakForLinkerInIndex(Index, ResolvedODR); 533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 534de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar thinLTOResolveWeakForLinkerModule( 535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TheModule, ModuleToDefinedGVSummaries[ModuleIdentifier]); 536de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar promoteModule(TheModule, Index); 538de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 539de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 540de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/** 541de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform cross-module importing for the module identified by ModuleIdentifier. 542de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 543de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::crossModuleImport(Module &TheModule, 544de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleSummaryIndex &Index) { 545de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleMap = generateModuleMap(Modules); 546de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleCount = Index.modulePaths().size(); 547de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 548de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Collect for each module the list of function it defines (GUID -> Summary). 549de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount); 550de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries); 551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 552de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Generate import/export list 553de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount); 554de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount); 555de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists, 556de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportLists); 557de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto &ImportList = ImportLists[TheModule.getModuleIdentifier()]; 558de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 559de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar crossImportIntoModule(TheModule, Index, ModuleMap, ImportList); 560de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 561de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 562de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/** 563de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Compute the list of summaries needed for importing into module. 564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 565de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::gatherImportedSummariesForModule( 566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringRef ModulePath, ModuleSummaryIndex &Index, 567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::map<std::string, GVSummaryMapTy> &ModuleToSummariesForIndex) { 568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleCount = Index.modulePaths().size(); 569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Collect for each module the list of function it defines (GUID -> Summary). 571de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount); 572de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries); 573de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 574de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Generate import/export list 575de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount); 576de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount); 577de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists, 578de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportLists); 579de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 580de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar llvm::gatherImportedSummariesForModule(ModulePath, ModuleToDefinedGVSummaries, 581de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ImportLists, 582de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleToSummariesForIndex); 583de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 584de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 585de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/** 586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Emit the list of files needed for importing into module. 587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 588de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::emitImports(StringRef ModulePath, 589de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringRef OutputName, 590de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleSummaryIndex &Index) { 591de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleCount = Index.modulePaths().size(); 592de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Collect for each module the list of function it defines (GUID -> Summary). 594de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount); 595de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries); 596de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 597de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Generate import/export list 598de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount); 599de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount); 600de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists, 601de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportLists); 602de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 603de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::error_code EC; 604de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if ((EC = EmitImportsFiles(ModulePath, OutputName, ImportLists))) 605de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error(Twine("Failed to open ") + OutputName + 606de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar " to save imports lists\n"); 607de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 608de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 609de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/** 610de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform internalization. Index is updated to reflect linkage changes. 611de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 612de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::internalize(Module &TheModule, 613de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleSummaryIndex &Index) { 614de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar initTMBuilder(TMBuilder, Triple(TheModule.getTargetTriple())); 615de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleCount = Index.modulePaths().size(); 616de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleIdentifier = TheModule.getModuleIdentifier(); 617de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 618de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Convert the preserved symbols set from string to GUID 619de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto GUIDPreservedSymbols = 620de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar computeGUIDPreservedSymbols(PreservedSymbols, TMBuilder.TheTriple); 621de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 622de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Collect for each module the list of function it defines (GUID -> Summary). 623de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount); 624de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Index.collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries); 625de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 626de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Generate import/export list 627de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount); 628de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount); 629de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ComputeCrossModuleImport(Index, ModuleToDefinedGVSummaries, ImportLists, 630de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportLists); 631de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto &ExportList = ExportLists[ModuleIdentifier]; 632de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 633de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Be friendly and don't nuke totally the module when the client didn't 634de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // supply anything to preserve. 635de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (ExportList.empty() && GUIDPreservedSymbols.empty()) 636de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 637de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 638de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Internalization 639de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) { 640de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const auto &ExportList = ExportLists.find(ModuleIdentifier); 641de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return (ExportList != ExportLists.end() && 642de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportList->second.count(GUID)) || 643de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GUIDPreservedSymbols.count(GUID); 644de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 645de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar thinLTOInternalizeAndPromoteInIndex(Index, isExported); 646de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar thinLTOInternalizeModule(TheModule, 647de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleToDefinedGVSummaries[ModuleIdentifier]); 648de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 649de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 650de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/** 651de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform post-importing ThinLTO optimizations. 652de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 653de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::optimize(Module &TheModule) { 654de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar initTMBuilder(TMBuilder, Triple(TheModule.getTargetTriple())); 655de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 656de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Optimize now 657de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar optimizeModule(TheModule, *TMBuilder.create()); 658de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 659de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 660de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/** 661de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform ThinLTO CodeGen. 662de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 663de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::unique_ptr<MemoryBuffer> ThinLTOCodeGenerator::codegen(Module &TheModule) { 664de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar initTMBuilder(TMBuilder, Triple(TheModule.getTargetTriple())); 665de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return codegenModule(TheModule, *TMBuilder.create()); 666de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 667de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 668de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Main entry point for the ThinLTO processing 669de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid ThinLTOCodeGenerator::run() { 670de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (CodeGenOnly) { 671de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Perform only parallel codegen and return. 672de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ThreadPool Pool; 673de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(ProducedBinaries.empty() && "The generator should not be reused"); 674de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProducedBinaries.resize(Modules.size()); 675de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar int count = 0; 676de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &ModuleBuffer : Modules) { 677de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Pool.async([&](int count) { 678de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LLVMContext Context; 679de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Context.setDiscardValueNames(LTODiscardValueNames); 680de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 681de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Parse module now 682de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto TheModule = loadModuleFromBuffer(ModuleBuffer, Context, false); 683de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 684de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // CodeGen 685de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProducedBinaries[count] = codegen(*TheModule); 686de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }, count++); 687de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 688de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 689de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 690de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 691de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 692de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Sequential linking phase 693de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto Index = linkCombinedIndex(); 694de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 695de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Save temps: index. 696de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (!SaveTempsDir.empty()) { 697de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto SaveTempPath = SaveTempsDir + "index.bc"; 698de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::error_code EC; 699de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_fd_ostream OS(SaveTempPath, EC, sys::fs::F_None); 700de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (EC) 701de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar report_fatal_error(Twine("Failed to open ") + SaveTempPath + 702de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar " to save optimized bitcode\n"); 703de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar WriteIndexToFile(*Index, OS); 704de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 705de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 706de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Prepare the resulting object vector 707de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(ProducedBinaries.empty() && "The generator should not be reused"); 708de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProducedBinaries.resize(Modules.size()); 709de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 710de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Prepare the module map. 711de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleMap = generateModuleMap(Modules); 712de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleCount = Modules.size(); 713de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 714de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Collect for each module the list of function it defines (GUID -> Summary). 715de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<GVSummaryMapTy> ModuleToDefinedGVSummaries(ModuleCount); 716de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Index->collectDefinedGVSummariesPerModule(ModuleToDefinedGVSummaries); 717de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 718de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Collect the import/export lists for all modules from the call-graph in the 719de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // combined index. 720de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ImportMapTy> ImportLists(ModuleCount); 721de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<FunctionImporter::ExportSetTy> ExportLists(ModuleCount); 722de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ComputeCrossModuleImport(*Index, ModuleToDefinedGVSummaries, ImportLists, 723de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportLists); 724de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 725de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Convert the preserved symbols set from string to GUID, this is needed for 726de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // computing the caching hash and the internalization. 727de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto GUIDPreservedSymbols = 728de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar computeGUIDPreservedSymbols(PreservedSymbols, TMBuilder.TheTriple); 729de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 730de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // We use a std::map here to be able to have a defined ordering when 731de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // producing a hash for the cache entry. 732de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // FIXME: we should be able to compute the caching hash for the entry based 733de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // on the index, and nuke this map. 734de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR; 735de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 736de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Resolve LinkOnce/Weak symbols, this has to be computed early because it 737de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // impacts the caching. 738de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar resolveWeakForLinkerInIndex(*Index, ResolvedODR); 739de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 740de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) { 741de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const auto &ExportList = ExportLists.find(ModuleIdentifier); 742de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return (ExportList != ExportLists.end() && 743de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportList->second.count(GUID)) || 744de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GUIDPreservedSymbols.count(GUID); 745de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 746de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 747de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Use global summary-based analysis to identify symbols that can be 748de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // internalized (because they aren't exported or preserved as per callback). 749de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Changes are made in the index, consumed in the ThinLTO backends. 750de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar thinLTOInternalizeAndPromoteInIndex(*Index, isExported); 751de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 752de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Make sure that every module has an entry in the ExportLists and 753de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // ResolvedODR maps to enable threaded access to these maps below. 754de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &DefinedGVSummaries : ModuleToDefinedGVSummaries) { 755de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportLists[DefinedGVSummaries.first()]; 756de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ResolvedODR[DefinedGVSummaries.first()]; 757de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 758de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 759de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Compute the ordering we will process the inputs: the rough heuristic here 760de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // is to sort them per size so that the largest module get schedule as soon as 761de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // possible. This is purely a compile-time optimization. 762de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::vector<int> ModulesOrdering; 763de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModulesOrdering.resize(Modules.size()); 764de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::iota(ModulesOrdering.begin(), ModulesOrdering.end(), 0); 765de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::sort(ModulesOrdering.begin(), ModulesOrdering.end(), 766de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar [&](int LeftIndex, int RightIndex) { 767de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto LSize = Modules[LeftIndex].getBufferSize(); 768de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto RSize = Modules[RightIndex].getBufferSize(); 769de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return LSize > RSize; 770de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }); 771de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 772de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Parallel optimizer + codegen 773de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar { 774de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ThreadPool Pool(ThreadCount); 775de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto IndexCount : ModulesOrdering) { 776de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto &ModuleBuffer = Modules[IndexCount]; 777de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Pool.async([&](int count) { 778de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ModuleIdentifier = ModuleBuffer.getBufferIdentifier(); 779de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto &ExportList = ExportLists[ModuleIdentifier]; 780de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 781de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto &DefinedFunctions = ModuleToDefinedGVSummaries[ModuleIdentifier]; 782de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 783de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // The module may be cached, this helps handling it. 784de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleCacheEntry CacheEntry(CacheOptions.Path, *Index, ModuleIdentifier, 785de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ImportLists[ModuleIdentifier], ExportList, 786de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ResolvedODR[ModuleIdentifier], 787de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DefinedFunctions, GUIDPreservedSymbols); 788de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 789de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar { 790de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto ErrOrBuffer = CacheEntry.tryLoadingBuffer(); 791de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DEBUG(dbgs() << "Cache " << (ErrOrBuffer ? "hit" : "miss") << " '" 792de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << CacheEntry.getEntryPath() << "' for buffer " << count 793de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar << " " << ModuleIdentifier << "\n"); 794de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 795de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (ErrOrBuffer) { 796de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Cache Hit! 797de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProducedBinaries[count] = std::move(ErrOrBuffer.get()); 798de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return; 799de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 800de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 801de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 802de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LLVMContext Context; 803de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Context.setDiscardValueNames(LTODiscardValueNames); 804de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Context.enableDebugTypeODRUniquing(); 805de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 806de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Parse module now 807de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto TheModule = loadModuleFromBuffer(ModuleBuffer, Context, false); 808de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 809de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Save temps: original file. 810de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar saveTempBitcode(*TheModule, SaveTempsDir, count, ".0.original.bc"); 811de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 812de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto &ImportList = ImportLists[ModuleIdentifier]; 813de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Run the main process now, and generates a binary 814de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto OutputBuffer = ProcessThinLTOModule( 815de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar *TheModule, *Index, ModuleMap, *TMBuilder.create(), ImportList, 816de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ExportList, GUIDPreservedSymbols, 817de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleToDefinedGVSummaries[ModuleIdentifier], CacheOptions, 818de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DisableCodeGen, SaveTempsDir, count); 819de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 820de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OutputBuffer = CacheEntry.write(std::move(OutputBuffer)); 821de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ProducedBinaries[count] = std::move(OutputBuffer); 822de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }, IndexCount); 823de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 824de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 825de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 826de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CachePruning(CacheOptions.Path) 827de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar .setPruningInterval(CacheOptions.PruningInterval) 828de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar .setEntryExpiration(CacheOptions.Expiration) 829de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar .setMaxSize(CacheOptions.MaxPercentageOfAvailableSpace) 830de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar .prune(); 831de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 832de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // If statistics were requested, print them out now. 833de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (llvm::AreStatisticsEnabled()) 834de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar llvm::PrintStatistics(); 835de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 836