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 25namespace llvm { 26 27class 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 39public: 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/// 72class MipsebTargetMachine : public MipsTargetMachine { 73 virtual void anchor(); 74 75public: 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/// 84class MipselTargetMachine : public MipsTargetMachine { 85 virtual void anchor(); 86 87public: 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