Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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
  526.