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