Home | History | Annotate | Download | only in Mips
      1 //===-- MipsTargetMachine.h - Define TargetMachine for Mips -----*- 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 Mips specific subclass of TargetMachine.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H
     15 #define LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H
     16 
     17 #include "MCTargetDesc/MipsABIInfo.h"
     18 #include "MipsSubtarget.h"
     19 #include "llvm/CodeGen/BasicTTIImpl.h"
     20 #include "llvm/CodeGen/Passes.h"
     21 #include "llvm/CodeGen/SelectionDAGISel.h"
     22 #include "llvm/Target/TargetFrameLowering.h"
     23 #include "llvm/Target/TargetMachine.h"
     24 
     25 namespace llvm {
     26 class formatted_raw_ostream;
     27 class MipsRegisterInfo;
     28 
     29 class MipsTargetMachine : public LLVMTargetMachine {
     30   bool isLittle;
     31   std::unique_ptr<TargetLoweringObjectFile> TLOF;
     32   // Selected ABI
     33   MipsABIInfo ABI;
     34   MipsSubtarget *Subtarget;
     35   MipsSubtarget DefaultSubtarget;
     36   MipsSubtarget NoMips16Subtarget;
     37   MipsSubtarget Mips16Subtarget;
     38 
     39   mutable StringMap<std::unique_ptr<MipsSubtarget>> SubtargetMap;
     40 
     41 public:
     42   MipsTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
     43                     StringRef FS, const TargetOptions &Options,
     44                     Optional<Reloc::Model> RM, CodeModel::Model CM,
     45                     CodeGenOpt::Level OL, bool isLittle);
     46   ~MipsTargetMachine() override;
     47 
     48   TargetIRAnalysis getTargetIRAnalysis() override;
     49 
     50   const MipsSubtarget *getSubtargetImpl() const {
     51     if (Subtarget)
     52       return Subtarget;
     53     return &DefaultSubtarget;
     54   }
     55 
     56   const MipsSubtarget *getSubtargetImpl(const Function &F) const override;
     57 
     58   /// \brief Reset the subtarget for the Mips target.
     59   void resetSubtarget(MachineFunction *MF);
     60 
     61   // Pass Pipeline Configuration
     62   TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
     63 
     64   TargetLoweringObjectFile *getObjFileLowering() const override {
     65     return TLOF.get();
     66   }
     67 
     68   bool isLittleEndian() const { return isLittle; }
     69   const MipsABIInfo &getABI() const { return ABI; }
     70 };
     71 
     72 /// Mips32/64 big endian target machine.
     73 ///
     74 class MipsebTargetMachine : public MipsTargetMachine {
     75   virtual void anchor();
     76 public:
     77   MipsebTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
     78                       StringRef FS, const TargetOptions &Options,
     79                       Optional<Reloc::Model> RM, CodeModel::Model CM,
     80                       CodeGenOpt::Level OL);
     81 };
     82 
     83 /// Mips32/64 little endian target machine.
     84 ///
     85 class MipselTargetMachine : public MipsTargetMachine {
     86   virtual void anchor();
     87 public:
     88   MipselTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
     89                       StringRef FS, const TargetOptions &Options,
     90                       Optional<Reloc::Model> RM, CodeModel::Model CM,
     91                       CodeGenOpt::Level OL);
     92 };
     93 
     94 } // End llvm namespace
     95 
     96 #endif
     97