Home | History | Annotate | Download | only in ARM
      1 //===-- ARMTargetMachine.h - Define TargetMachine for ARM -------*- 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 declares the ARM specific subclass of TargetMachine.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef ARMTARGETMACHINE_H
     15 #define ARMTARGETMACHINE_H
     16 
     17 #include "ARMInstrInfo.h"
     18 #include "ARMSubtarget.h"
     19 #include "llvm/IR/DataLayout.h"
     20 #include "llvm/Target/TargetMachine.h"
     21 
     22 namespace llvm {
     23 
     24 class ARMBaseTargetMachine : public LLVMTargetMachine {
     25 protected:
     26   ARMSubtarget        Subtarget;
     27 public:
     28   ARMBaseTargetMachine(const Target &T, StringRef TT,
     29                        StringRef CPU, StringRef FS,
     30                        const TargetOptions &Options,
     31                        Reloc::Model RM, CodeModel::Model CM,
     32                        CodeGenOpt::Level OL,
     33                        bool isLittle);
     34 
     35   const ARMSubtarget *getSubtargetImpl() const override { return &Subtarget; }
     36   const ARMBaseRegisterInfo *getRegisterInfo() const override {
     37     return getSubtargetImpl()->getRegisterInfo();
     38   }
     39   const ARMTargetLowering *getTargetLowering() const override {
     40     return getSubtargetImpl()->getTargetLowering();
     41   }
     42   const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
     43     return getSubtargetImpl()->getSelectionDAGInfo();
     44   }
     45   const ARMBaseInstrInfo *getInstrInfo() const override {
     46     return getSubtargetImpl()->getInstrInfo();
     47   }
     48   const ARMFrameLowering *getFrameLowering() const override {
     49     return getSubtargetImpl()->getFrameLowering();
     50   }
     51   const InstrItineraryData *getInstrItineraryData() const override {
     52     return &getSubtargetImpl()->getInstrItineraryData();
     53   }
     54   const DataLayout *getDataLayout() const override {
     55     return getSubtargetImpl()->getDataLayout();
     56   }
     57   ARMJITInfo *getJITInfo() override { return Subtarget.getJITInfo(); }
     58 
     59   /// \brief Register ARM analysis passes with a pass manager.
     60   void addAnalysisPasses(PassManagerBase &PM) override;
     61 
     62   // Pass Pipeline Configuration
     63   TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
     64 
     65   bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &MCE) override;
     66 };
     67 
     68 /// ARMTargetMachine - ARM target machine.
     69 ///
     70 class ARMTargetMachine : public ARMBaseTargetMachine {
     71   virtual void anchor();
     72  public:
     73    ARMTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS,
     74                     const TargetOptions &Options, Reloc::Model RM,
     75                     CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle);
     76 };
     77 
     78 /// ARMLETargetMachine - ARM little endian target machine.
     79 ///
     80 class ARMLETargetMachine : public ARMTargetMachine {
     81   void anchor() override;
     82 public:
     83   ARMLETargetMachine(const Target &T, StringRef TT,
     84                      StringRef CPU, StringRef FS, const TargetOptions &Options,
     85                      Reloc::Model RM, CodeModel::Model CM,
     86                      CodeGenOpt::Level OL);
     87 };
     88 
     89 /// ARMBETargetMachine - ARM big endian target machine.
     90 ///
     91 class ARMBETargetMachine : public ARMTargetMachine {
     92   void anchor() override;
     93 public:
     94   ARMBETargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS,
     95                      const TargetOptions &Options, Reloc::Model RM,
     96                      CodeModel::Model CM, CodeGenOpt::Level OL);
     97 };
     98 
     99 /// ThumbTargetMachine - Thumb target machine.
    100 /// Due to the way architectures are handled, this represents both
    101 ///   Thumb-1 and Thumb-2.
    102 ///
    103 class ThumbTargetMachine : public ARMBaseTargetMachine {
    104   virtual void anchor();
    105 public:
    106   ThumbTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS,
    107                      const TargetOptions &Options, Reloc::Model RM,
    108                      CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle);
    109 };
    110 
    111 /// ThumbLETargetMachine - Thumb little endian target machine.
    112 ///
    113 class ThumbLETargetMachine : public ThumbTargetMachine {
    114   void anchor() override;
    115 public:
    116   ThumbLETargetMachine(const Target &T, StringRef TT, StringRef CPU,
    117                        StringRef FS, const TargetOptions &Options,
    118                        Reloc::Model RM, CodeModel::Model CM,
    119                        CodeGenOpt::Level OL);
    120 };
    121 
    122 /// ThumbBETargetMachine - Thumb big endian target machine.
    123 ///
    124 class ThumbBETargetMachine : public ThumbTargetMachine {
    125   void anchor() override;
    126 public:
    127   ThumbBETargetMachine(const Target &T, StringRef TT, StringRef CPU,
    128                        StringRef FS, const TargetOptions &Options,
    129                        Reloc::Model RM, CodeModel::Model CM,
    130                        CodeGenOpt::Level OL);
    131 };
    132 
    133 } // end namespace llvm
    134 
    135 #endif
    136