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