]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/Mips/MipsTargetMachine.h
Import bmake-20170711
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / Mips / MipsTargetMachine.h
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