Home | History | Annotate | Download | only in Target
      1 //===-- llvm/Target/TargetMachine.h - Target Information --------*- C++ -*-===//
      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 defines the TargetMachine and LLVMTargetMachine classes.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_TARGET_TARGETMACHINE_H
     15 #define LLVM_TARGET_TARGETMACHINE_H
     16 
     17 #include "llvm/ADT/StringRef.h"
     18 #include "llvm/ADT/Triple.h"
     19 #include "llvm/IR/DataLayout.h"
     20 #include "llvm/Pass.h"
     21 #include "llvm/Support/CodeGen.h"
     22 #include "llvm/Target/TargetOptions.h"
     23 #include <string>
     24 
     25 namespace llvm {
     26 
     27 class GlobalValue;
     28 class MachineFunctionInitializer;
     29 class Mangler;
     30 class MCAsmInfo;
     31 class MCContext;
     32 class MCInstrInfo;
     33 class MCRegisterInfo;
     34 class MCSubtargetInfo;
     35 class MCSymbol;
     36 class raw_pwrite_stream;
     37 class PassManagerBuilder;
     38 class Target;
     39 class TargetIntrinsicInfo;
     40 class TargetIRAnalysis;
     41 class TargetLoweringObjectFile;
     42 class TargetPassConfig;
     43 class TargetSubtargetInfo;
     44 
     45 // The old pass manager infrastructure is hidden in a legacy namespace now.
     46 namespace legacy {
     47 class PassManagerBase;
     48 }
     49 using legacy::PassManagerBase;
     50 
     51 //===----------------------------------------------------------------------===//
     52 ///
     53 /// Primary interface to the complete machine description for the target
     54 /// machine.  All target-specific information should be accessible through this
     55 /// interface.
     56 ///
     57 class TargetMachine {
     58 protected: // Can only create subclasses.
     59   TargetMachine(const Target &T, StringRef DataLayoutString,
     60                 const Triple &TargetTriple, StringRef CPU, StringRef FS,
     61                 const TargetOptions &Options);
     62 
     63   /// The Target that this machine was created for.
     64   const Target &TheTarget;
     65 
     66   /// DataLayout for the target: keep ABI type size and alignment.
     67   ///
     68   /// The DataLayout is created based on the string representation provided
     69   /// during construction. It is kept here only to avoid reparsing the string
     70   /// but should not really be used during compilation, because it has an
     71   /// internal cache that is context specific.
     72   const DataLayout DL;
     73 
     74   /// Triple string, CPU name, and target feature strings the TargetMachine
     75   /// instance is created with.
     76   Triple TargetTriple;
     77   std::string TargetCPU;
     78   std::string TargetFS;
     79 
     80   Reloc::Model RM = Reloc::Static;
     81   CodeModel::Model CMModel = CodeModel::Default;
     82   CodeGenOpt::Level OptLevel = CodeGenOpt::Default;
     83 
     84   /// Contains target specific asm information.
     85   const MCAsmInfo *AsmInfo;
     86 
     87   const MCRegisterInfo *MRI;
     88   const MCInstrInfo *MII;
     89   const MCSubtargetInfo *STI;
     90 
     91   unsigned RequireStructuredCFG : 1;
     92   unsigned O0WantsFastISel : 1;
     93 
     94 public:
     95   const TargetOptions DefaultOptions;
     96   mutable TargetOptions Options;
     97 
     98   TargetMachine(const TargetMachine &) = delete;
     99   void operator=(const TargetMachine &) = delete;
    100   virtual ~TargetMachine();
    101 
    102   const Target &getTarget() const { return TheTarget; }
    103 
    104   const Triple &getTargetTriple() const { return TargetTriple; }
    105   StringRef getTargetCPU() const { return TargetCPU; }
    106   StringRef getTargetFeatureString() const { return TargetFS; }
    107 
    108   /// Virtual method implemented by subclasses that returns a reference to that
    109   /// target's TargetSubtargetInfo-derived member variable.
    110   virtual const TargetSubtargetInfo *getSubtargetImpl(const Function &) const {
    111     return nullptr;
    112   }
    113   virtual TargetLoweringObjectFile *getObjFileLowering() const {
    114     return nullptr;
    115   }
    116 
    117   /// This method returns a pointer to the specified type of
    118   /// TargetSubtargetInfo.  In debug builds, it verifies that the object being
    119   /// returned is of the correct type.
    120   template <typename STC> const STC &getSubtarget(const Function &F) const {
    121     return *static_cast<const STC*>(getSubtargetImpl(F));
    122   }
    123 
    124   /// Create a DataLayout.
    125   const DataLayout createDataLayout() const { return DL; }
    126 
    127   /// Test if a DataLayout if compatible with the CodeGen for this target.
    128   ///
    129   /// The LLVM Module owns a DataLayout that is used for the target independent
    130   /// optimizations and code generation. This hook provides a target specific
    131   /// check on the validity of this DataLayout.
    132   bool isCompatibleDataLayout(const DataLayout &Candidate) const {
    133     return DL == Candidate;
    134   }
    135 
    136   /// Get the pointer size for this target.
    137   ///
    138   /// This is the only time the DataLayout in the TargetMachine is used.
    139   unsigned getPointerSize() const { return DL.getPointerSize(); }
    140 
    141   /// \brief Reset the target options based on the function's attributes.
    142   // FIXME: Remove TargetOptions that affect per-function code generation
    143   // from TargetMachine.
    144   void resetTargetOptions(const Function &F) const;
    145 
    146   /// Return target specific asm information.
    147   const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; }
    148 
    149   const MCRegisterInfo *getMCRegisterInfo() const { return MRI; }
    150   const MCInstrInfo *getMCInstrInfo() const { return MII; }
    151   const MCSubtargetInfo *getMCSubtargetInfo() const { return STI; }
    152 
    153   /// If intrinsic information is available, return it.  If not, return null.
    154   virtual const TargetIntrinsicInfo *getIntrinsicInfo() const {
    155     return nullptr;
    156   }
    157 
    158   bool requiresStructuredCFG() const { return RequireStructuredCFG; }
    159   void setRequiresStructuredCFG(bool Value) { RequireStructuredCFG = Value; }
    160 
    161   /// Returns the code generation relocation model. The choices are static, PIC,
    162   /// and dynamic-no-pic, and target default.
    163   Reloc::Model getRelocationModel() const;
    164 
    165   /// Returns the code model. The choices are small, kernel, medium, large, and
    166   /// target default.
    167   CodeModel::Model getCodeModel() const;
    168 
    169   bool isPositionIndependent() const;
    170 
    171   bool shouldAssumeDSOLocal(const Module &M, const GlobalValue *GV) const;
    172 
    173   /// Returns the TLS model which should be used for the given global variable.
    174   TLSModel::Model getTLSModel(const GlobalValue *GV) const;
    175 
    176   /// Returns the optimization level: None, Less, Default, or Aggressive.
    177   CodeGenOpt::Level getOptLevel() const;
    178 
    179   /// \brief Overrides the optimization level.
    180   void setOptLevel(CodeGenOpt::Level Level);
    181 
    182   void setFastISel(bool Enable) { Options.EnableFastISel = Enable; }
    183   bool getO0WantsFastISel() { return O0WantsFastISel; }
    184   void setO0WantsFastISel(bool Enable) { O0WantsFastISel = Enable; }
    185 
    186   bool shouldPrintMachineCode() const { return Options.PrintMachineCode; }
    187 
    188   bool getUniqueSectionNames() const { return Options.UniqueSectionNames; }
    189 
    190   /// Return true if data objects should be emitted into their own section,
    191   /// corresponds to -fdata-sections.
    192   bool getDataSections() const {
    193     return Options.DataSections;
    194   }
    195 
    196   /// Return true if functions should be emitted into their own section,
    197   /// corresponding to -ffunction-sections.
    198   bool getFunctionSections() const {
    199     return Options.FunctionSections;
    200   }
    201 
    202   /// \brief Get a \c TargetIRAnalysis appropriate for the target.
    203   ///
    204   /// This is used to construct the new pass manager's target IR analysis pass,
    205   /// set up appropriately for this target machine. Even the old pass manager
    206   /// uses this to answer queries about the IR.
    207   virtual TargetIRAnalysis getTargetIRAnalysis();
    208 
    209   /// Allow the target to modify the pass manager, e.g. by calling
    210   /// PassManagerBuilder::addExtension.
    211   virtual void adjustPassManager(PassManagerBuilder &) {}
    212 
    213   /// These enums are meant to be passed into addPassesToEmitFile to indicate
    214   /// what type of file to emit, and returned by it to indicate what type of
    215   /// file could actually be made.
    216   enum CodeGenFileType {
    217     CGFT_AssemblyFile,
    218     CGFT_ObjectFile,
    219     CGFT_Null         // Do not emit any output.
    220   };
    221 
    222   /// Add passes to the specified pass manager to get the specified file
    223   /// emitted.  Typically this will involve several steps of code generation.
    224   /// This method should return true if emission of this file type is not
    225   /// supported, or false on success.
    226   virtual bool addPassesToEmitFile(
    227       PassManagerBase &, raw_pwrite_stream &, CodeGenFileType,
    228       bool /*DisableVerify*/ = true, AnalysisID /*StartBefore*/ = nullptr,
    229       AnalysisID /*StartAfter*/ = nullptr, AnalysisID /*StopBefore*/ = nullptr,
    230       AnalysisID /*StopAfter*/ = nullptr,
    231       MachineFunctionInitializer * /*MFInitializer*/ = nullptr) {
    232     return true;
    233   }
    234 
    235   /// Add passes to the specified pass manager to get machine code emitted with
    236   /// the MCJIT. This method returns true if machine code is not supported. It
    237   /// fills the MCContext Ctx pointer which can be used to build custom
    238   /// MCStreamer.
    239   ///
    240   virtual bool addPassesToEmitMC(PassManagerBase &, MCContext *&,
    241                                  raw_pwrite_stream &,
    242                                  bool /*DisableVerify*/ = true) {
    243     return true;
    244   }
    245 
    246   /// True if subtarget inserts the final scheduling pass on its own.
    247   ///
    248   /// Branch relaxation, which must happen after block placement, can
    249   /// on some targets (e.g. SystemZ) expose additional post-RA
    250   /// scheduling opportunities.
    251   virtual bool targetSchedulesPostRAScheduling() const { return false; };
    252 
    253   void getNameWithPrefix(SmallVectorImpl<char> &Name, const GlobalValue *GV,
    254                          Mangler &Mang, bool MayAlwaysUsePrivate = false) const;
    255   MCSymbol *getSymbol(const GlobalValue *GV) const;
    256 
    257   /// True if the target uses physical regs at Prolog/Epilog insertion
    258   /// time. If true (most machines), all vregs must be allocated before
    259   /// PEI. If false (virtual-register machines), then callee-save register
    260   /// spilling and scavenging are not needed or used.
    261   virtual bool usesPhysRegsForPEI() const { return true; }
    262 };
    263 
    264 /// This class describes a target machine that is implemented with the LLVM
    265 /// target-independent code generator.
    266 ///
    267 class LLVMTargetMachine : public TargetMachine {
    268 protected: // Can only create subclasses.
    269   LLVMTargetMachine(const Target &T, StringRef DataLayoutString,
    270                     const Triple &TargetTriple, StringRef CPU, StringRef FS,
    271                     const TargetOptions &Options, Reloc::Model RM,
    272                     CodeModel::Model CM, CodeGenOpt::Level OL);
    273 
    274   void initAsmInfo();
    275 public:
    276   /// \brief Get a TargetIRAnalysis implementation for the target.
    277   ///
    278   /// This analysis will produce a TTI result which uses the common code
    279   /// generator to answer queries about the IR.
    280   TargetIRAnalysis getTargetIRAnalysis() override;
    281 
    282   /// Create a pass configuration object to be used by addPassToEmitX methods
    283   /// for generating a pipeline of CodeGen passes.
    284   virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
    285 
    286   /// Add passes to the specified pass manager to get the specified file
    287   /// emitted.  Typically this will involve several steps of code generation.
    288   bool addPassesToEmitFile(
    289       PassManagerBase &PM, raw_pwrite_stream &Out, CodeGenFileType FileType,
    290       bool DisableVerify = true, AnalysisID StartBefore = nullptr,
    291       AnalysisID StartAfter = nullptr, AnalysisID StopBefore = nullptr,
    292       AnalysisID StopAfter = nullptr,
    293       MachineFunctionInitializer *MFInitializer = nullptr) override;
    294 
    295   /// Add passes to the specified pass manager to get machine code emitted with
    296   /// the MCJIT. This method returns true if machine code is not supported. It
    297   /// fills the MCContext Ctx pointer which can be used to build custom
    298   /// MCStreamer.
    299   bool addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx,
    300                          raw_pwrite_stream &OS,
    301                          bool DisableVerify = true) override;
    302 };
    303 
    304 } // end namespace llvm
    305 
    306 #endif // LLVM_TARGET_TARGETMACHINE_H
    307