Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===-LTOCodeGenerator.h - LLVM Link Time Optimizer -----------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file declares the LTOCodeGenerator class.
10
//
11
//   LTO compilation consists of three phases: Pre-IPO, IPO and Post-IPO.
12
//
13
//   The Pre-IPO phase compiles source code into bitcode file. The resulting
14
// bitcode files, along with object files and libraries, will be fed to the
15
// linker to through the IPO and Post-IPO phases. By using obj-file extension,
16
// the resulting bitcode file disguises itself as an object file, and therefore
17
// obviates the need of writing a special set of the make-rules only for LTO
18
// compilation.
19
//
20
//   The IPO phase perform inter-procedural analyses and optimizations, and
21
// the Post-IPO consists two sub-phases: intra-procedural scalar optimizations
22
// (SOPT), and intra-procedural target-dependent code generator (CG).
23
//
24
//   As of this writing, we don't separate IPO and the Post-IPO SOPT. They
25
// are intermingled together, and are driven by a single pass manager (see
26
// PassManagerBuilder::populateLTOPassManager()).
27
//   FIXME: populateLTOPassManager no longer exists.
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_LEGACY_LTOCODEGENERATOR_H
36
#define LLVM_LTO_LEGACY_LTOCODEGENERATOR_H
37
 
38
#include "llvm-c/lto.h"
39
#include "llvm/ADT/ArrayRef.h"
40
#include "llvm/ADT/SmallPtrSet.h"
41
#include "llvm/ADT/StringMap.h"
42
#include "llvm/ADT/StringSet.h"
43
#include "llvm/IR/GlobalValue.h"
44
#include "llvm/IR/Module.h"
45
#include "llvm/LTO/Config.h"
46
#include "llvm/LTO/LTO.h"
47
#include "llvm/Support/CommandLine.h"
48
#include "llvm/Support/Error.h"
49
#include "llvm/Support/ToolOutputFile.h"
50
#include "llvm/Target/TargetMachine.h"
51
#include "llvm/Target/TargetOptions.h"
52
#include <string>
53
#include <vector>
54
 
55
namespace llvm {
56
template <typename T> class ArrayRef;
57
  class LLVMContext;
58
  class DiagnosticInfo;
59
  class Linker;
60
  class Mangler;
61
  class MemoryBuffer;
62
  class TargetLibraryInfo;
63
  class TargetMachine;
64
  class raw_ostream;
65
  class raw_pwrite_stream;
66
 
67
/// Enable global value internalization in LTO.
68
extern cl::opt<bool> EnableLTOInternalization;
69
 
70
//===----------------------------------------------------------------------===//
71
/// C++ class which implements the opaque lto_code_gen_t type.
72
///
73
struct LTOCodeGenerator {
74
  static const char *getVersionString();
75
 
76
  LTOCodeGenerator(LLVMContext &Context);
77
  ~LTOCodeGenerator();
78
 
79
  /// Merge given module.  Return true on success.
80
  ///
81
  /// Resets \a HasVerifiedInput.
82
  bool addModule(struct LTOModule *);
83
 
84
  /// Set the destination module.
85
  ///
86
  /// Resets \a HasVerifiedInput.
87
  void setModule(std::unique_ptr<LTOModule> M);
88
 
89
  void setAsmUndefinedRefs(struct LTOModule *);
90
  void setTargetOptions(const TargetOptions &Options);
91
  void setDebugInfo(lto_debug_model);
92
  void setCodePICModel(std::optional<Reloc::Model> Model) {
93
    Config.RelocModel = Model;
94
  }
95
 
96
  /// Set the file type to be emitted (assembly or object code).
97
  /// The default is CGFT_ObjectFile.
98
  void setFileType(CodeGenFileType FT) { Config.CGFileType = FT; }
99
 
100
  void setCpu(StringRef MCpu) { Config.CPU = std::string(MCpu); }
101
  void setAttrs(std::vector<std::string> MAttrs) { Config.MAttrs = MAttrs; }
102
  void setOptLevel(unsigned OptLevel);
103
 
104
  void setShouldInternalize(bool Value) { ShouldInternalize = Value; }
105
  void setShouldEmbedUselists(bool Value) { ShouldEmbedUselists = Value; }
106
  void setSaveIRBeforeOptPath(std::string Value) {
107
    SaveIRBeforeOptPath = Value;
108
  }
109
 
110
  /// Restore linkage of globals
111
  ///
112
  /// When set, the linkage of globals will be restored prior to code
113
  /// generation. That is, a global symbol that had external linkage prior to
114
  /// LTO will be emitted with external linkage again; and a local will remain
115
  /// local. Note that this option only affects the end result - globals may
116
  /// still be internalized in the process of LTO and may be modified and/or
117
  /// deleted where legal.
118
  ///
119
  /// The default behavior will internalize globals (unless on the preserve
120
  /// list) and, if parallel code generation is enabled, will externalize
121
  /// all locals.
122
  void setShouldRestoreGlobalsLinkage(bool Value) {
123
    ShouldRestoreGlobalsLinkage = Value;
124
  }
125
 
126
  void addMustPreserveSymbol(StringRef Sym) { MustPreserveSymbols.insert(Sym); }
127
 
128
  /// Pass options to the driver and optimization passes.
129
  ///
130
  /// These options are not necessarily for debugging purpose (the function
131
  /// name is misleading).  This function should be called before
132
  /// LTOCodeGenerator::compilexxx(), and
133
  /// LTOCodeGenerator::writeMergedModules().
134
  void setCodeGenDebugOptions(ArrayRef<StringRef> Opts);
135
 
136
  /// Parse the options set in setCodeGenDebugOptions.
137
  ///
138
  /// Like \a setCodeGenDebugOptions(), this must be called before
139
  /// LTOCodeGenerator::compilexxx() and
140
  /// LTOCodeGenerator::writeMergedModules().
141
  void parseCodeGenDebugOptions();
142
 
143
  /// Write the merged module to the file specified by the given path.  Return
144
  /// true on success.
145
  ///
146
  /// Calls \a verifyMergedModuleOnce().
147
  bool writeMergedModules(StringRef Path);
148
 
149
  /// Compile the merged module into a *single* output file; the path to output
150
  /// file is returned to the caller via argument "name". Return true on
151
  /// success.
152
  ///
153
  /// \note It is up to the linker to remove the intermediate output file.  Do
154
  /// not try to remove the object file in LTOCodeGenerator's destructor as we
155
  /// don't who (LTOCodeGenerator or the output file) will last longer.
156
  bool compile_to_file(const char **Name);
157
 
158
  /// As with compile_to_file(), this function compiles the merged module into
159
  /// single output file. Instead of returning the output file path to the
160
  /// caller (linker), it brings the output to a buffer, and returns the buffer
161
  /// to the caller. This function should delete the intermediate file once
162
  /// its content is brought to memory. Return NULL if the compilation was not
163
  /// successful.
164
  std::unique_ptr<MemoryBuffer> compile();
165
 
166
  /// Optimizes the merged module.  Returns true on success.
167
  ///
168
  /// Calls \a verifyMergedModuleOnce().
169
  bool optimize();
170
 
171
  /// Compiles the merged optimized module into a single output file. It brings
172
  /// the output to a buffer, and returns the buffer to the caller. Return NULL
173
  /// if the compilation was not successful.
174
  std::unique_ptr<MemoryBuffer> compileOptimized();
175
 
176
  /// Compile the merged optimized module \p ParallelismLevel output files each
177
  /// representing a linkable partition of the module. If out contains more
178
  /// than one element, code generation is done in parallel with \p
179
  /// ParallelismLevel threads.  Output files will be written to the streams
180
  /// created using the \p AddStream callback. Returns true on success.
181
  ///
182
  /// Calls \a verifyMergedModuleOnce().
183
  bool compileOptimized(AddStreamFn AddStream, unsigned ParallelismLevel);
184
 
185
  /// Enable the Freestanding mode: indicate that the optimizer should not
186
  /// assume builtins are present on the target.
187
  void setFreestanding(bool Enabled) { Config.Freestanding = Enabled; }
188
 
189
  void setDisableVerify(bool Value) { Config.DisableVerify = Value; }
190
 
191
  void setDebugPassManager(bool Enabled) { Config.DebugPassManager = Enabled; }
192
 
193
  void setDiagnosticHandler(lto_diagnostic_handler_t, void *);
194
 
195
  LLVMContext &getContext() { return Context; }
196
 
197
  void resetMergedModule() { MergedModule.reset(); }
198
  void DiagnosticHandler(const DiagnosticInfo &DI);
199
 
200
private:
201
  /// Verify the merged module on first call.
202
  ///
203
  /// Sets \a HasVerifiedInput on first call and doesn't run again on the same
204
  /// input.
205
  void verifyMergedModuleOnce();
206
 
207
  bool compileOptimizedToFile(const char **Name);
208
  void restoreLinkageForExternals();
209
  void applyScopeRestrictions();
210
  void preserveDiscardableGVs(
211
      Module &TheModule,
212
      llvm::function_ref<bool(const GlobalValue &)> mustPreserveGV);
213
 
214
  bool determineTarget();
215
  std::unique_ptr<TargetMachine> createTargetMachine();
216
 
217
  bool useAIXSystemAssembler();
218
  bool runAIXSystemAssembler(SmallString<128> &AssemblyFile);
219
 
220
  void emitError(const std::string &ErrMsg);
221
  void emitWarning(const std::string &ErrMsg);
222
 
223
  void finishOptimizationRemarks();
224
 
225
  LLVMContext &Context;
226
  std::unique_ptr<Module> MergedModule;
227
  std::unique_ptr<Linker> TheLinker;
228
  std::unique_ptr<TargetMachine> TargetMach;
229
  bool EmitDwarfDebugInfo = false;
230
  bool ScopeRestrictionsDone = false;
231
  bool HasVerifiedInput = false;
232
  StringSet<> MustPreserveSymbols;
233
  StringSet<> AsmUndefinedRefs;
234
  StringMap<GlobalValue::LinkageTypes> ExternalSymbols;
235
  std::vector<std::string> CodegenOptions;
236
  std::string FeatureStr;
237
  std::string NativeObjectPath;
238
  const Target *MArch = nullptr;
239
  std::string TripleStr;
240
  lto_diagnostic_handler_t DiagHandler = nullptr;
241
  void *DiagContext = nullptr;
242
  bool ShouldInternalize = EnableLTOInternalization;
243
  bool ShouldEmbedUselists = false;
244
  bool ShouldRestoreGlobalsLinkage = false;
245
  std::unique_ptr<ToolOutputFile> DiagnosticOutputFile;
246
  std::unique_ptr<ToolOutputFile> StatsFile = nullptr;
247
  std::string SaveIRBeforeOptPath;
248
 
249
  lto::Config Config;
250
};
251
 
252
/// A convenience function that calls cl::ParseCommandLineOptions on the given
253
/// set of options.
254
void parseCommandLineOptions(std::vector<std::string> &Options);
255
}
256
#endif