LLVM  8.0.1
LTOCodeGenerator.h
Go to the documentation of this file.
1 //===-LTOCodeGenerator.h - LLVM Link Time Optimizer -----------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file declares the LTOCodeGenerator class.
11 //
12 // LTO compilation consists of three phases: Pre-IPO, IPO and Post-IPO.
13 //
14 // The Pre-IPO phase compiles source code into bitcode file. The resulting
15 // bitcode files, along with object files and libraries, will be fed to the
16 // linker to through the IPO and Post-IPO phases. By using obj-file extension,
17 // the resulting bitcode file disguises itself as an object file, and therefore
18 // obviates the need of writing a special set of the make-rules only for LTO
19 // compilation.
20 //
21 // The IPO phase perform inter-procedural analyses and optimizations, and
22 // the Post-IPO consists two sub-phases: intra-procedural scalar optimizations
23 // (SOPT), and intra-procedural target-dependent code generator (CG).
24 //
25 // As of this writing, we don't separate IPO and the Post-IPO SOPT. They
26 // are intermingled together, and are driven by a single pass manager (see
27 // PassManagerBuilder::populateLTOPassManager()).
28 //
29 // The "LTOCodeGenerator" is the driver for the IPO and Post-IPO stages.
30 // The "CodeGenerator" here is bit confusing. Don't confuse the "CodeGenerator"
31 // with the machine specific code generator.
32 //
33 //===----------------------------------------------------------------------===//
34 
35 #ifndef LLVM_LTO_LTOCODEGENERATOR_H
36 #define LLVM_LTO_LTOCODEGENERATOR_H
37 
38 #include "llvm-c/lto.h"
39 #include "llvm/ADT/SmallPtrSet.h"
40 #include "llvm/ADT/StringMap.h"
41 #include "llvm/ADT/StringSet.h"
42 #include "llvm/IR/GlobalValue.h"
43 #include "llvm/IR/Module.h"
44 #include "llvm/Support/Error.h"
48 #include <string>
49 #include <vector>
50 
51 /// Enable global value internalization in LTO.
53 
54 namespace llvm {
55 template <typename T> class ArrayRef;
56  class LLVMContext;
57  class DiagnosticInfo;
58  class Linker;
59  class Mangler;
60  class MemoryBuffer;
61  class TargetLibraryInfo;
62  class TargetMachine;
63  class raw_ostream;
64  class raw_pwrite_stream;
65 
66 //===----------------------------------------------------------------------===//
67 /// C++ class which implements the opaque lto_code_gen_t type.
68 ///
70  static const char *getVersionString();
71 
72  LTOCodeGenerator(LLVMContext &Context);
74 
75  /// Merge given module. Return true on success.
76  ///
77  /// Resets \a HasVerifiedInput.
78  bool addModule(struct LTOModule *);
79 
80  /// Set the destination module.
81  ///
82  /// Resets \a HasVerifiedInput.
83  void setModule(std::unique_ptr<LTOModule> M);
84 
85  void setAsmUndefinedRefs(struct LTOModule *);
86  void setTargetOptions(const TargetOptions &Options);
89 
90  /// Set the file type to be emitted (assembly or object code).
91  /// The default is TargetMachine::CGFT_ObjectFile.
92  void setFileType(TargetMachine::CodeGenFileType FT) { FileType = FT; }
93 
94  void setCpu(StringRef MCpu) { this->MCpu = MCpu; }
95  void setAttr(StringRef MAttr) { this->MAttr = MAttr; }
96  void setOptLevel(unsigned OptLevel);
97 
98  void setShouldInternalize(bool Value) { ShouldInternalize = Value; }
99  void setShouldEmbedUselists(bool Value) { ShouldEmbedUselists = Value; }
100 
101  /// Restore linkage of globals
102  ///
103  /// When set, the linkage of globals will be restored prior to code
104  /// generation. That is, a global symbol that had external linkage prior to
105  /// LTO will be emitted with external linkage again; and a local will remain
106  /// local. Note that this option only affects the end result - globals may
107  /// still be internalized in the process of LTO and may be modified and/or
108  /// deleted where legal.
109  ///
110  /// The default behavior will internalize globals (unless on the preserve
111  /// list) and, if parallel code generation is enabled, will externalize
112  /// all locals.
114  ShouldRestoreGlobalsLinkage = Value;
115  }
116 
117  void addMustPreserveSymbol(StringRef Sym) { MustPreserveSymbols[Sym] = 1; }
118 
119  /// Pass options to the driver and optimization passes.
120  ///
121  /// These options are not necessarily for debugging purpose (the function
122  /// name is misleading). This function should be called before
123  /// LTOCodeGenerator::compilexxx(), and
124  /// LTOCodeGenerator::writeMergedModules().
126 
127  /// Parse the options set in setCodeGenDebugOptions.
128  ///
129  /// Like \a setCodeGenDebugOptions(), this must be called before
130  /// LTOCodeGenerator::compilexxx() and
131  /// LTOCodeGenerator::writeMergedModules().
133 
134  /// Write the merged module to the file specified by the given path. Return
135  /// true on success.
136  ///
137  /// Calls \a verifyMergedModuleOnce().
138  bool writeMergedModules(StringRef Path);
139 
140  /// Compile the merged module into a *single* output file; the path to output
141  /// file is returned to the caller via argument "name". Return true on
142  /// success.
143  ///
144  /// \note It is up to the linker to remove the intermediate output file. Do
145  /// not try to remove the object file in LTOCodeGenerator's destructor as we
146  /// don't who (LTOCodeGenerator or the output file) will last longer.
147  bool compile_to_file(const char **Name, bool DisableVerify,
148  bool DisableInline, bool DisableGVNLoadPRE,
149  bool DisableVectorization);
150 
151  /// As with compile_to_file(), this function compiles the merged module into
152  /// single output file. Instead of returning the output file path to the
153  /// caller (linker), it brings the output to a buffer, and returns the buffer
154  /// to the caller. This function should delete the intermediate file once
155  /// its content is brought to memory. Return NULL if the compilation was not
156  /// successful.
157  std::unique_ptr<MemoryBuffer> compile(bool DisableVerify, bool DisableInline,
158  bool DisableGVNLoadPRE,
159  bool DisableVectorization);
160 
161  /// Optimizes the merged module. Returns true on success.
162  ///
163  /// Calls \a verifyMergedModuleOnce().
164  bool optimize(bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE,
165  bool DisableVectorization);
166 
167  /// Compiles the merged optimized module into a single output file. It brings
168  /// the output to a buffer, and returns the buffer to the caller. Return NULL
169  /// if the compilation was not successful.
170  std::unique_ptr<MemoryBuffer> compileOptimized();
171 
172  /// Compile the merged optimized module into out.size() output files each
173  /// representing a linkable partition of the module. If out contains more
174  /// than one element, code generation is done in parallel with out.size()
175  /// threads. Output files will be written to members of out. Returns true on
176  /// success.
177  ///
178  /// Calls \a verifyMergedModuleOnce().
180 
181  /// Enable the Freestanding mode: indicate that the optimizer should not
182  /// assume builtins are present on the target.
183  void setFreestanding(bool Enabled) { Freestanding = Enabled; }
184 
186 
187  LLVMContext &getContext() { return Context; }
188 
189  void resetMergedModule() { MergedModule.reset(); }
190  void DiagnosticHandler(const DiagnosticInfo &DI);
191 
192 private:
193  void initializeLTOPasses();
194 
195  /// Verify the merged module on first call.
196  ///
197  /// Sets \a HasVerifiedInput on first call and doesn't run again on the same
198  /// input.
199  void verifyMergedModuleOnce();
200 
201  bool compileOptimizedToFile(const char **Name);
202  void restoreLinkageForExternals();
203  void applyScopeRestrictions();
204  void preserveDiscardableGVs(
205  Module &TheModule,
207 
208  bool determineTarget();
209  std::unique_ptr<TargetMachine> createTargetMachine();
210 
211  void emitError(const std::string &ErrMsg);
212  void emitWarning(const std::string &ErrMsg);
213 
214  void finishOptimizationRemarks();
215 
216  LLVMContext &Context;
217  std::unique_ptr<Module> MergedModule;
218  std::unique_ptr<Linker> TheLinker;
219  std::unique_ptr<TargetMachine> TargetMach;
220  bool EmitDwarfDebugInfo = false;
221  bool ScopeRestrictionsDone = false;
222  bool HasVerifiedInput = false;
223  Optional<Reloc::Model> RelocModel;
224  StringSet<> MustPreserveSymbols;
225  StringSet<> AsmUndefinedRefs;
226  StringMap<GlobalValue::LinkageTypes> ExternalSymbols;
227  std::vector<std::string> CodegenOptions;
228  std::string FeatureStr;
229  std::string MCpu;
230  std::string MAttr;
231  std::string NativeObjectPath;
232  TargetOptions Options;
234  const Target *MArch = nullptr;
235  std::string TripleStr;
236  unsigned OptLevel = 2;
237  lto_diagnostic_handler_t DiagHandler = nullptr;
238  void *DiagContext = nullptr;
239  bool ShouldInternalize = EnableLTOInternalization;
240  bool ShouldEmbedUselists = false;
241  bool ShouldRestoreGlobalsLinkage = false;
243  std::unique_ptr<ToolOutputFile> DiagnosticOutputFile;
244  bool Freestanding = false;
245 };
246 }
247 #endif
This class represents lattice values for constants.
Definition: AllocatorList.h:24
LLVMContext & getContext()
std::unique_ptr< MemoryBuffer > compileOptimized()
Compiles the merged optimized module into a single output file.
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:65
An efficient, type-erasing, non-owning reference to a callable.
Definition: STLExtras.h:117
bool addModule(struct LTOModule *)
Merge given module.
bool optimize(bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE, bool DisableVectorization)
Optimizes the merged module.
void setShouldRestoreGlobalsLinkage(bool Value)
Restore linkage of globals.
void setAttr(StringRef MAttr)
amdgpu Simplify well known AMD library false Value Value const Twine & Name
std::unique_ptr< MemoryBuffer > compile(bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE, bool DisableVectorization)
As with compile_to_file(), this function compiles the merged module into single output file...
void setFileType(TargetMachine::CodeGenFileType FT)
Set the file type to be emitted (assembly or object code).
bool writeMergedModules(StringRef Path)
Write the merged module to the file specified by the given path.
static const char * getVersionString()
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: APInt.h:33
lto_debug_model
Definition: lto.h:77
void setShouldEmbedUselists(bool Value)
void setCodePICModel(Optional< Reloc::Model > Model)
This is the base abstract class for diagnostic reporting in the backend.
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:69
void setOptLevel(unsigned OptLevel)
void setTargetOptions(const TargetOptions &Options)
void setShouldInternalize(bool Value)
C++ class which implements the opaque lto_module_t type.
Definition: LTOModule.h:38
void setCodeGenDebugOptions(StringRef Opts)
Pass options to the driver and optimization passes.
llvm::cl::opt< bool > EnableLTOInternalization
Enable global value internalization in LTO.
C++ class which implements the opaque lto_code_gen_t type.
void(* lto_diagnostic_handler_t)(lto_codegen_diagnostic_severity_t severity, const char *diag, void *ctxt)
Diagnostic handler type.
Definition: lto.h:321
void setCpu(StringRef MCpu)
Module.h This file contains the declarations for the Module class.
static bool Enabled
Definition: Statistic.cpp:51
Target - Wrapper for Target specific information.
void addMustPreserveSymbol(StringRef Sym)
void DiagnosticHandler(const DiagnosticInfo &DI)
bool compile_to_file(const char **Name, bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE, bool DisableVectorization)
Compile the merged module into a single output file; the path to output file is returned to the calle...
static bool mustPreserveGV(const GlobalValue &GV)
Predicate for Internalize pass.
void setAsmUndefinedRefs(struct LTOModule *)
LLVM Value Representation.
Definition: Value.h:73
LTOCodeGenerator(LLVMContext &Context)
StringSet - A wrapper for StringMap that provides set-like functionality.
Definition: StringSet.h:28
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
void parseCodeGenDebugOptions()
Parse the options set in setCodeGenDebugOptions.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit...
void setModule(std::unique_ptr< LTOModule > M)
Set the destination module.
void setFreestanding(bool Enabled)
Enable the Freestanding mode: indicate that the optimizer should not assume builtins are present on t...
void setDiagnosticHandler(lto_diagnostic_handler_t, void *)
void setDebugInfo(lto_debug_model)