1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===-ThinLTOCodeGenerator.h - 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 declares the ThinLTOCodeGenerator class, similar to the 11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// LTOCodeGenerator but for the ThinLTO scheme. It provides an interface for 12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// linker plugin. 13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_LTO_THINLTOCODEGENERATOR_H 17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_LTO_THINLTOCODEGENERATOR_H 18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm-c/lto.h" 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/StringSet.h" 21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/Triple.h" 22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/ModuleSummaryIndex.h" 23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/CodeGen.h" 24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/MemoryBuffer.h" 25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Target/TargetOptions.h" 26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <string> 28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm { 30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass StringRef; 31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass LLVMContext; 32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass TargetMachine; 33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Helper to gather options relevant to the target machine creation 35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct TargetMachineBuilder { 36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Triple TheTriple; 37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string MCpu; 38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string MAttr; 39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetOptions Options; 40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Optional<Reloc::Model> RelocModel; 41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CodeGenOpt::Level CGOptLevel = CodeGenOpt::Default; 42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<TargetMachine> create() const; 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// This class define an interface similar to the LTOCodeGenerator, but adapted 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// for ThinLTO processing. 48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// The ThinLTOCodeGenerator is not intended to be reuse for multiple 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// compilation: the model is that the client adds modules to the generator and 50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// ask to perform the ThinLTO optimizations / codegen, and finally destroys the 51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// codegenerator. 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ThinLTOCodeGenerator { 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic: 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Add given module to the code generator. 55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void addModule(StringRef Identifier, StringRef Data); 56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Adds to a list of all global symbols that must exist in the final generated 59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * code. If a symbol is not listed there, it will be optimized away if it is 60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * inlined into every usage. 61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void preserveSymbol(StringRef Name); 63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Adds to a list of all global symbols that are cross-referenced between 66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * ThinLTO files. If the ThinLTO CodeGenerator can ensure that every 67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * references from a ThinLTO module to this symbol is optimized away, then 68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * the symbol can be discarded. 69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void crossReferenceSymbol(StringRef Name); 71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Process all the modules that were added to the code generator in parallel. 74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * 75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Client can access the resulting object files using getProducedBinaries() 76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void run(); 78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Return the "in memory" binaries produced by the code generator. 81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::vector<std::unique_ptr<MemoryBuffer>> &getProducedBinaries() { 83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return ProducedBinaries; 84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * \defgroup Options setters 88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * @{ 89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * \defgroup Cache controlling options 93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * 94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * These entry points control the ThinLTO cache. The cache is intended to 95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * support incremental build, and thus needs to be persistent accross build. 96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * The client enabled the cache by supplying a path to an existing directory. 97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * The code generator will use this to store objects files that may be reused 98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * during a subsequent build. 99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * To avoid filling the disk space, a few knobs are provided: 100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * - The pruning interval limit the frequency at which the garbage collector 101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * will try to scan the cache directory to prune it from expired entries. 102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Setting to -1 disable the pruning (default). 103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * - The pruning expiration time indicates to the garbage collector how old 104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * an entry needs to be to be removed. 105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * - Finally, the garbage collector can be instructed to prune the cache till 106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * the occupied space goes below a threshold. 107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * @{ 108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar struct CachingOptions { 111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string Path; // Path to the cache, empty to disable. 112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar int PruningInterval = 1200; // seconds, -1 to disable pruning. 113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned int Expiration = 7 * 24 * 3600; // seconds (1w default). 114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned MaxPercentageOfAvailableSpace = 75; // percentage. 115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Provide a path to a directory where to store the cached files for 118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// incremental build. 119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setCacheDir(std::string Path) { CacheOptions.Path = std::move(Path); } 120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Cache policy: interval (seconds) between two prune of the cache. Set to a 122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// negative value (default) to disable pruning. A value of 0 will be ignored. 123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setCachePruningInterval(int Interval) { 124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Interval) 125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CacheOptions.PruningInterval = Interval; 126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Cache policy: expiration (in seconds) for an entry. 129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// A value of 0 will be ignored. 130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setCacheEntryExpiration(unsigned Expiration) { 131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Expiration) 132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CacheOptions.Expiration = Expiration; 133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Sets the maximum cache size that can be persistent across build, in terms 137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * of percentage of the available space on the the disk. Set to 100 to 138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * indicate no limit, 50 to indicate that the cache size will not be left over 139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * half the available space. A value over 100 will be reduced to 100, and a 140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * value of 0 will be ignored. 141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * 142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * 143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * The formula looks like: 144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * AvailableSpace = FreeSpace + ExistingCacheSize 145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * NewCacheSize = AvailableSpace * P/100 146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * 147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setMaxCacheSizeRelativeToAvailableSpace(unsigned Percentage) { 149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (Percentage) 150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CacheOptions.MaxPercentageOfAvailableSpace = Percentage; 151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /**@}*/ 154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Set the path to a directory where to save temporaries at various stages of 156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// the processing. 157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setSaveTempsDir(std::string Path) { SaveTempsDir = std::move(Path); } 158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// CPU to use to initialize the TargetMachine 160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setCpu(std::string Cpu) { TMBuilder.MCpu = std::move(Cpu); } 161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Subtarget attributes 163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setAttr(std::string MAttr) { TMBuilder.MAttr = std::move(MAttr); } 164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// TargetMachine options 166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setTargetOptions(TargetOptions Options) { 167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TMBuilder.Options = std::move(Options); 168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// CodeModel 171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setCodePICModel(Optional<Reloc::Model> Model) { 172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TMBuilder.RelocModel = Model; 173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// CodeGen optimization level 176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setCodeGenOptLevel(CodeGenOpt::Level CGOptLevel) { 177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TMBuilder.CGOptLevel = CGOptLevel; 178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Disable CodeGen, only run the stages till codegen and stop. The output 181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// will be bitcode. 182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void disableCodeGen(bool Disable) { DisableCodeGen = Disable; } 183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Perform CodeGen only: disable all other stages. 185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void setCodeGenOnly(bool CGOnly) { CodeGenOnly = CGOnly; } 186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /**@}*/ 188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * \defgroup Set of APIs to run individual stages in isolation. 191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * @{ 192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Produce the combined summary index from all the bitcode files: 196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * "thin-link". 197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<ModuleSummaryIndex> linkCombinedIndex(); 199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform promotion and renaming of exported internal functions, 202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * and additionally resolve weak and linkonce symbols. 203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Index is updated to reflect linkage changes from weak resolution. 204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void promote(Module &Module, ModuleSummaryIndex &Index); 206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Compute and emit the imported files for module at \p ModulePath. 209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static void emitImports(StringRef ModulePath, StringRef OutputName, 211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleSummaryIndex &Index); 212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform cross-module importing for the module identified by 215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * ModuleIdentifier. 216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void crossModuleImport(Module &Module, ModuleSummaryIndex &Index); 218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Compute the list of summaries needed for importing into module. 221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static void gatherImportedSummariesForModule( 223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringRef ModulePath, ModuleSummaryIndex &Index, 224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::map<std::string, GVSummaryMapTy> &ModuleToSummariesForIndex); 225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform internalization. Index is updated to reflect linkage changes. 228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void internalize(Module &Module, ModuleSummaryIndex &Index); 230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform post-importing ThinLTO optimizations. 233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void optimize(Module &Module); 235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /** 237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar * Perform ThinLTO CodeGen. 238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar */ 239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<MemoryBuffer> codegen(Module &Module); 240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /**@}*/ 242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate: 244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Helper factory to build a TargetMachine 245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetMachineBuilder TMBuilder; 246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Vector holding the in-memory buffer containing the produced binaries. 248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::vector<std::unique_ptr<MemoryBuffer>> ProducedBinaries; 249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Vector holding the input buffers containing the bitcode modules to 251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// process. 252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::vector<MemoryBufferRef> Modules; 253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Set of symbols that need to be preserved outside of the set of bitcode 255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// files. 256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringSet<> PreservedSymbols; 257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Set of symbols that are cross-referenced between bitcode files. 259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar StringSet<> CrossReferencedSymbols; 260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Control the caching behavior. 262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CachingOptions CacheOptions; 263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Path to a directory to save the temporary bitcode files. 265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string SaveTempsDir; 266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Flag to enable/disable CodeGen. When set to true, the process stops after 268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// optimizations and a bitcode is produced. 269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool DisableCodeGen = false; 270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Flag to indicate that only the CodeGen will be performed, no cross-module 272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// importing or optimization. 273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool CodeGenOnly = false; 274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} 276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif 277