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
//===-- llvm/Target/TargetMachine.h - Target Information --------*- C++ -*-===//
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 defines the TargetMachine and LLVMTargetMachine classes.
10
//
11
//===----------------------------------------------------------------------===//
12
 
13
#ifndef LLVM_TARGET_TARGETMACHINE_H
14
#define LLVM_TARGET_TARGETMACHINE_H
15
 
16
#include "llvm/ADT/StringRef.h"
17
#include "llvm/ADT/Triple.h"
18
#include "llvm/IR/DataLayout.h"
19
#include "llvm/IR/PassManager.h"
20
#include "llvm/Support/Allocator.h"
21
#include "llvm/Support/CodeGen.h"
22
#include "llvm/Support/Error.h"
23
#include "llvm/Support/PGOOptions.h"
24
#include "llvm/Target/CGPassBuilderOption.h"
25
#include "llvm/Target/TargetOptions.h"
26
#include <optional>
27
#include <string>
28
#include <utility>
29
 
30
namespace llvm {
31
 
32
class AAManager;
33
using ModulePassManager = PassManager<Module>;
34
 
35
class Function;
36
class GlobalValue;
37
class MachineFunctionPassManager;
38
class MachineFunctionAnalysisManager;
39
class MachineModuleInfoWrapperPass;
40
class Mangler;
41
class MCAsmInfo;
42
class MCContext;
43
class MCInstrInfo;
44
class MCRegisterInfo;
45
class MCStreamer;
46
class MCSubtargetInfo;
47
class MCSymbol;
48
class raw_pwrite_stream;
49
class PassBuilder;
50
struct PerFunctionMIParsingState;
51
class SMDiagnostic;
52
class SMRange;
53
class Target;
54
class TargetIntrinsicInfo;
55
class TargetIRAnalysis;
56
class TargetTransformInfo;
57
class TargetLoweringObjectFile;
58
class TargetPassConfig;
59
class TargetSubtargetInfo;
60
 
61
// The old pass manager infrastructure is hidden in a legacy namespace now.
62
namespace legacy {
63
class PassManagerBase;
64
}
65
using legacy::PassManagerBase;
66
 
67
struct MachineFunctionInfo;
68
namespace yaml {
69
struct MachineFunctionInfo;
70
}
71
 
72
//===----------------------------------------------------------------------===//
73
///
74
/// Primary interface to the complete machine description for the target
75
/// machine.  All target-specific information should be accessible through this
76
/// interface.
77
///
78
class TargetMachine {
79
protected: // Can only create subclasses.
80
  TargetMachine(const Target &T, StringRef DataLayoutString,
81
                const Triple &TargetTriple, StringRef CPU, StringRef FS,
82
                const TargetOptions &Options);
83
 
84
  /// The Target that this machine was created for.
85
  const Target &TheTarget;
86
 
87
  /// DataLayout for the target: keep ABI type size and alignment.
88
  ///
89
  /// The DataLayout is created based on the string representation provided
90
  /// during construction. It is kept here only to avoid reparsing the string
91
  /// but should not really be used during compilation, because it has an
92
  /// internal cache that is context specific.
93
  const DataLayout DL;
94
 
95
  /// Triple string, CPU name, and target feature strings the TargetMachine
96
  /// instance is created with.
97
  Triple TargetTriple;
98
  std::string TargetCPU;
99
  std::string TargetFS;
100
 
101
  Reloc::Model RM = Reloc::Static;
102
  CodeModel::Model CMModel = CodeModel::Small;
103
  CodeGenOpt::Level OptLevel = CodeGenOpt::Default;
104
 
105
  /// Contains target specific asm information.
106
  std::unique_ptr<const MCAsmInfo> AsmInfo;
107
  std::unique_ptr<const MCRegisterInfo> MRI;
108
  std::unique_ptr<const MCInstrInfo> MII;
109
  std::unique_ptr<const MCSubtargetInfo> STI;
110
 
111
  unsigned RequireStructuredCFG : 1;
112
  unsigned O0WantsFastISel : 1;
113
 
114
  // PGO related tunables.
115
  std::optional<PGOOptions> PGOOption;
116
 
117
public:
118
  const TargetOptions DefaultOptions;
119
  mutable TargetOptions Options;
120
 
121
  TargetMachine(const TargetMachine &) = delete;
122
  void operator=(const TargetMachine &) = delete;
123
  virtual ~TargetMachine();
124
 
125
  const Target &getTarget() const { return TheTarget; }
126
 
127
  const Triple &getTargetTriple() const { return TargetTriple; }
128
  StringRef getTargetCPU() const { return TargetCPU; }
129
  StringRef getTargetFeatureString() const { return TargetFS; }
130
  void setTargetFeatureString(StringRef FS) { TargetFS = std::string(FS); }
131
 
132
  /// Virtual method implemented by subclasses that returns a reference to that
133
  /// target's TargetSubtargetInfo-derived member variable.
134
  virtual const TargetSubtargetInfo *getSubtargetImpl(const Function &) const {
135
    return nullptr;
136
  }
137
  virtual TargetLoweringObjectFile *getObjFileLowering() const {
138
    return nullptr;
139
  }
140
 
141
  /// Create the target's instance of MachineFunctionInfo
142
  virtual MachineFunctionInfo *
143
  createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,
144
                            const TargetSubtargetInfo *STI) const {
145
    return nullptr;
146
  }
147
 
148
  /// Allocate and return a default initialized instance of the YAML
149
  /// representation for the MachineFunctionInfo.
150
  virtual yaml::MachineFunctionInfo *createDefaultFuncInfoYAML() const {
151
    return nullptr;
152
  }
153
 
154
  /// Allocate and initialize an instance of the YAML representation of the
155
  /// MachineFunctionInfo.
156
  virtual yaml::MachineFunctionInfo *
157
  convertFuncInfoToYAML(const MachineFunction &MF) const {
158
    return nullptr;
159
  }
160
 
161
  /// Parse out the target's MachineFunctionInfo from the YAML reprsentation.
162
  virtual bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &,
163
                                        PerFunctionMIParsingState &PFS,
164
                                        SMDiagnostic &Error,
165
                                        SMRange &SourceRange) const {
166
    return false;
167
  }
168
 
169
  /// This method returns a pointer to the specified type of
170
  /// TargetSubtargetInfo.  In debug builds, it verifies that the object being
171
  /// returned is of the correct type.
172
  template <typename STC> const STC &getSubtarget(const Function &F) const {
173
    return *static_cast<const STC*>(getSubtargetImpl(F));
174
  }
175
 
176
  /// Create a DataLayout.
177
  const DataLayout createDataLayout() const { return DL; }
178
 
179
  /// Test if a DataLayout if compatible with the CodeGen for this target.
180
  ///
181
  /// The LLVM Module owns a DataLayout that is used for the target independent
182
  /// optimizations and code generation. This hook provides a target specific
183
  /// check on the validity of this DataLayout.
184
  bool isCompatibleDataLayout(const DataLayout &Candidate) const {
185
    return DL == Candidate;
186
  }
187
 
188
  /// Get the pointer size for this target.
189
  ///
190
  /// This is the only time the DataLayout in the TargetMachine is used.
191
  unsigned getPointerSize(unsigned AS) const {
192
    return DL.getPointerSize(AS);
193
  }
194
 
195
  unsigned getPointerSizeInBits(unsigned AS) const {
196
    return DL.getPointerSizeInBits(AS);
197
  }
198
 
199
  unsigned getProgramPointerSize() const {
200
    return DL.getPointerSize(DL.getProgramAddressSpace());
201
  }
202
 
203
  unsigned getAllocaPointerSize() const {
204
    return DL.getPointerSize(DL.getAllocaAddrSpace());
205
  }
206
 
207
  /// Reset the target options based on the function's attributes.
208
  // FIXME: Remove TargetOptions that affect per-function code generation
209
  // from TargetMachine.
210
  void resetTargetOptions(const Function &F) const;
211
 
212
  /// Return target specific asm information.
213
  const MCAsmInfo *getMCAsmInfo() const { return AsmInfo.get(); }
214
 
215
  const MCRegisterInfo *getMCRegisterInfo() const { return MRI.get(); }
216
  const MCInstrInfo *getMCInstrInfo() const { return MII.get(); }
217
  const MCSubtargetInfo *getMCSubtargetInfo() const { return STI.get(); }
218
 
219
  /// If intrinsic information is available, return it.  If not, return null.
220
  virtual const TargetIntrinsicInfo *getIntrinsicInfo() const {
221
    return nullptr;
222
  }
223
 
224
  bool requiresStructuredCFG() const { return RequireStructuredCFG; }
225
  void setRequiresStructuredCFG(bool Value) { RequireStructuredCFG = Value; }
226
 
227
  /// Returns the code generation relocation model. The choices are static, PIC,
228
  /// and dynamic-no-pic, and target default.
229
  Reloc::Model getRelocationModel() const;
230
 
231
  /// Returns the code model. The choices are small, kernel, medium, large, and
232
  /// target default.
233
  CodeModel::Model getCodeModel() const { return CMModel; }
234
 
235
  /// Set the code model.
236
  void setCodeModel(CodeModel::Model CM) { CMModel = CM; }
237
 
238
  bool isPositionIndependent() const;
239
 
240
  bool shouldAssumeDSOLocal(const Module &M, const GlobalValue *GV) const;
241
 
242
  /// Returns true if this target uses emulated TLS.
243
  bool useEmulatedTLS() const;
244
 
245
  /// Returns the TLS model which should be used for the given global variable.
246
  TLSModel::Model getTLSModel(const GlobalValue *GV) const;
247
 
248
  /// Returns the optimization level: None, Less, Default, or Aggressive.
249
  CodeGenOpt::Level getOptLevel() const;
250
 
251
  /// Overrides the optimization level.
252
  void setOptLevel(CodeGenOpt::Level Level);
253
 
254
  void setFastISel(bool Enable) { Options.EnableFastISel = Enable; }
255
  bool getO0WantsFastISel() { return O0WantsFastISel; }
256
  void setO0WantsFastISel(bool Enable) { O0WantsFastISel = Enable; }
257
  void setGlobalISel(bool Enable) { Options.EnableGlobalISel = Enable; }
258
  void setGlobalISelAbort(GlobalISelAbortMode Mode) {
259
    Options.GlobalISelAbort = Mode;
260
  }
261
  void setMachineOutliner(bool Enable) {
262
    Options.EnableMachineOutliner = Enable;
263
  }
264
  void setSupportsDefaultOutlining(bool Enable) {
265
    Options.SupportsDefaultOutlining = Enable;
266
  }
267
  void setSupportsDebugEntryValues(bool Enable) {
268
    Options.SupportsDebugEntryValues = Enable;
269
  }
270
 
271
  void setCFIFixup(bool Enable) { Options.EnableCFIFixup = Enable; }
272
 
273
  bool getAIXExtendedAltivecABI() const {
274
    return Options.EnableAIXExtendedAltivecABI;
275
  }
276
 
277
  bool getUniqueSectionNames() const { return Options.UniqueSectionNames; }
278
 
279
  /// Return true if unique basic block section names must be generated.
280
  bool getUniqueBasicBlockSectionNames() const {
281
    return Options.UniqueBasicBlockSectionNames;
282
  }
283
 
284
  /// Return true if data objects should be emitted into their own section,
285
  /// corresponds to -fdata-sections.
286
  bool getDataSections() const {
287
    return Options.DataSections;
288
  }
289
 
290
  /// Return true if functions should be emitted into their own section,
291
  /// corresponding to -ffunction-sections.
292
  bool getFunctionSections() const {
293
    return Options.FunctionSections;
294
  }
295
 
296
  /// Return true if visibility attribute should not be emitted in XCOFF,
297
  /// corresponding to -mignore-xcoff-visibility.
298
  bool getIgnoreXCOFFVisibility() const {
299
    return Options.IgnoreXCOFFVisibility;
300
  }
301
 
302
  /// Return true if XCOFF traceback table should be emitted,
303
  /// corresponding to -xcoff-traceback-table.
304
  bool getXCOFFTracebackTable() const { return Options.XCOFFTracebackTable; }
305
 
306
  /// If basic blocks should be emitted into their own section,
307
  /// corresponding to -fbasic-block-sections.
308
  llvm::BasicBlockSection getBBSectionsType() const {
309
    return Options.BBSections;
310
  }
311
 
312
  /// Get the list of functions and basic block ids that need unique sections.
313
  const MemoryBuffer *getBBSectionsFuncListBuf() const {
314
    return Options.BBSectionsFuncListBuf.get();
315
  }
316
 
317
  /// Returns true if a cast between SrcAS and DestAS is a noop.
318
  virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const {
319
    return false;
320
  }
321
 
322
  void setPGOOption(std::optional<PGOOptions> PGOOpt) { PGOOption = PGOOpt; }
323
  const std::optional<PGOOptions> &getPGOOption() const { return PGOOption; }
324
 
325
  /// If the specified generic pointer could be assumed as a pointer to a
326
  /// specific address space, return that address space.
327
  ///
328
  /// Under offloading programming, the offloading target may be passed with
329
  /// values only prepared on the host side and could assume certain
330
  /// properties.
331
  virtual unsigned getAssumedAddrSpace(const Value *V) const { return -1; }
332
 
333
  /// If the specified predicate checks whether a generic pointer falls within
334
  /// a specified address space, return that generic pointer and the address
335
  /// space being queried.
336
  ///
337
  /// Such predicates could be specified in @llvm.assume intrinsics for the
338
  /// optimizer to assume that the given generic pointer always falls within
339
  /// the address space based on that predicate.
340
  virtual std::pair<const Value *, unsigned>
341
  getPredicatedAddrSpace(const Value *V) const {
342
    return std::make_pair(nullptr, -1);
343
  }
344
 
345
  /// Get a \c TargetIRAnalysis appropriate for the target.
346
  ///
347
  /// This is used to construct the new pass manager's target IR analysis pass,
348
  /// set up appropriately for this target machine. Even the old pass manager
349
  /// uses this to answer queries about the IR.
350
  TargetIRAnalysis getTargetIRAnalysis() const;
351
 
352
  /// Return a TargetTransformInfo for a given function.
353
  ///
354
  /// The returned TargetTransformInfo is specialized to the subtarget
355
  /// corresponding to \p F.
356
  virtual TargetTransformInfo getTargetTransformInfo(const Function &F) const;
357
 
358
  /// Allow the target to modify the pass pipeline.
359
  virtual void registerPassBuilderCallbacks(PassBuilder &) {}
360
 
361
  /// Allow the target to register alias analyses with the AAManager for use
362
  /// with the new pass manager. Only affects the "default" AAManager.
363
  virtual void registerDefaultAliasAnalyses(AAManager &) {}
364
 
365
  /// Add passes to the specified pass manager to get the specified file
366
  /// emitted.  Typically this will involve several steps of code generation.
367
  /// This method should return true if emission of this file type is not
368
  /// supported, or false on success.
369
  /// \p MMIWP is an optional parameter that, if set to non-nullptr,
370
  /// will be used to set the MachineModuloInfo for this PM.
371
  virtual bool
372
  addPassesToEmitFile(PassManagerBase &, raw_pwrite_stream &,
373
                      raw_pwrite_stream *, CodeGenFileType,
374
                      bool /*DisableVerify*/ = true,
375
                      MachineModuleInfoWrapperPass *MMIWP = nullptr) {
376
    return true;
377
  }
378
 
379
  /// Add passes to the specified pass manager to get machine code emitted with
380
  /// the MCJIT. This method returns true if machine code is not supported. It
381
  /// fills the MCContext Ctx pointer which can be used to build custom
382
  /// MCStreamer.
383
  ///
384
  virtual bool addPassesToEmitMC(PassManagerBase &, MCContext *&,
385
                                 raw_pwrite_stream &,
386
                                 bool /*DisableVerify*/ = true) {
387
    return true;
388
  }
389
 
390
  /// True if subtarget inserts the final scheduling pass on its own.
391
  ///
392
  /// Branch relaxation, which must happen after block placement, can
393
  /// on some targets (e.g. SystemZ) expose additional post-RA
394
  /// scheduling opportunities.
395
  virtual bool targetSchedulesPostRAScheduling() const { return false; };
396
 
397
  void getNameWithPrefix(SmallVectorImpl<char> &Name, const GlobalValue *GV,
398
                         Mangler &Mang, bool MayAlwaysUsePrivate = false) const;
399
  MCSymbol *getSymbol(const GlobalValue *GV) const;
400
 
401
  /// The integer bit size to use for SjLj based exception handling.
402
  static constexpr unsigned DefaultSjLjDataSize = 32;
403
  virtual unsigned getSjLjDataSize() const { return DefaultSjLjDataSize; }
404
 
405
  static std::pair<int, int> parseBinutilsVersion(StringRef Version);
406
 
407
  /// getAddressSpaceForPseudoSourceKind - Given the kind of memory
408
  /// (e.g. stack) the target returns the corresponding address space.
409
  virtual unsigned getAddressSpaceForPseudoSourceKind(unsigned Kind) const {
410
    return 0;
411
  }
412
};
413
 
414
/// This class describes a target machine that is implemented with the LLVM
415
/// target-independent code generator.
416
///
417
class LLVMTargetMachine : public TargetMachine {
418
protected: // Can only create subclasses.
419
  LLVMTargetMachine(const Target &T, StringRef DataLayoutString,
420
                    const Triple &TT, StringRef CPU, StringRef FS,
421
                    const TargetOptions &Options, Reloc::Model RM,
422
                    CodeModel::Model CM, CodeGenOpt::Level OL);
423
 
424
  void initAsmInfo();
425
 
426
public:
427
  /// Get a TargetTransformInfo implementation for the target.
428
  ///
429
  /// The TTI returned uses the common code generator to answer queries about
430
  /// the IR.
431
  TargetTransformInfo getTargetTransformInfo(const Function &F) const override;
432
 
433
  /// Create a pass configuration object to be used by addPassToEmitX methods
434
  /// for generating a pipeline of CodeGen passes.
435
  virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
436
 
437
  /// Add passes to the specified pass manager to get the specified file
438
  /// emitted.  Typically this will involve several steps of code generation.
439
  /// \p MMIWP is an optional parameter that, if set to non-nullptr,
440
  /// will be used to set the MachineModuloInfo for this PM.
441
  bool
442
  addPassesToEmitFile(PassManagerBase &PM, raw_pwrite_stream &Out,
443
                      raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
444
                      bool DisableVerify = true,
445
                      MachineModuleInfoWrapperPass *MMIWP = nullptr) override;
446
 
447
  virtual Error buildCodeGenPipeline(ModulePassManager &,
448
                                     MachineFunctionPassManager &,
449
                                     MachineFunctionAnalysisManager &,
450
                                     raw_pwrite_stream &, raw_pwrite_stream *,
451
                                     CodeGenFileType, CGPassBuilderOption,
452
                                     PassInstrumentationCallbacks *) {
453
    return make_error<StringError>("buildCodeGenPipeline is not overridden",
454
                                   inconvertibleErrorCode());
455
  }
456
 
457
  virtual std::pair<StringRef, bool> getPassNameFromLegacyName(StringRef) {
458
    llvm_unreachable(
459
        "getPassNameFromLegacyName parseMIRPipeline is not overridden");
460
  }
461
 
462
  /// Add passes to the specified pass manager to get machine code emitted with
463
  /// the MCJIT. This method returns true if machine code is not supported. It
464
  /// fills the MCContext Ctx pointer which can be used to build custom
465
  /// MCStreamer.
466
  bool addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx,
467
                         raw_pwrite_stream &Out,
468
                         bool DisableVerify = true) override;
469
 
470
  /// Returns true if the target is expected to pass all machine verifier
471
  /// checks. This is a stopgap measure to fix targets one by one. We will
472
  /// remove this at some point and always enable the verifier when
473
  /// EXPENSIVE_CHECKS is enabled.
474
  virtual bool isMachineVerifierClean() const { return true; }
475
 
476
  /// Adds an AsmPrinter pass to the pipeline that prints assembly or
477
  /// machine code from the MI representation.
478
  bool addAsmPrinter(PassManagerBase &PM, raw_pwrite_stream &Out,
479
                     raw_pwrite_stream *DwoOut, CodeGenFileType FileType,
480
                     MCContext &Context);
481
 
482
  Expected<std::unique_ptr<MCStreamer>>
483
  createMCStreamer(raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,
484
                   CodeGenFileType FileType, MCContext &Ctx);
485
 
486
  /// True if the target uses physical regs (as nearly all targets do). False
487
  /// for stack machines such as WebAssembly and other virtual-register
488
  /// machines. If true, all vregs must be allocated before PEI. If false, then
489
  /// callee-save register spilling and scavenging are not needed or used. If
490
  /// false, implicitly defined registers will still be assumed to be physical
491
  /// registers, except that variadic defs will be allocated vregs.
492
  virtual bool usesPhysRegsForValues() const { return true; }
493
 
494
  /// True if the target wants to use interprocedural register allocation by
495
  /// default. The -enable-ipra flag can be used to override this.
496
  virtual bool useIPRA() const {
497
    return false;
498
  }
499
 
500
  /// The default variant to use in unqualified `asm` instructions.
501
  /// If this returns 0, `asm "$(foo$|bar$)"` will evaluate to `asm "foo"`.
502
  virtual int unqualifiedInlineAsmVariant() const { return 0; }
503
};
504
 
505
/// Helper method for getting the code model, returning Default if
506
/// CM does not have a value. The tiny and kernel models will produce
507
/// an error, so targets that support them or require more complex codemodel
508
/// selection logic should implement and call their own getEffectiveCodeModel.
509
inline CodeModel::Model
510
getEffectiveCodeModel(std::optional<CodeModel::Model> CM,
511
                      CodeModel::Model Default) {
512
  if (CM) {
513
    // By default, targets do not support the tiny and kernel models.
514
    if (*CM == CodeModel::Tiny)
515
      report_fatal_error("Target does not support the tiny CodeModel", false);
516
    if (*CM == CodeModel::Kernel)
517
      report_fatal_error("Target does not support the kernel CodeModel", false);
518
    return *CM;
519
  }
520
  return Default;
521
}
522
 
523
} // end namespace llvm
524
 
525
#endif // LLVM_TARGET_TARGETMACHINE_H