10b57cec5SDimitry Andric //===- MipsTargetMachine.h - Define TargetMachine for Mips ------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file declares the Mips specific subclass of TargetMachine. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H 140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "MCTargetDesc/MipsABIInfo.h" 170b57cec5SDimitry Andric #include "MipsSubtarget.h" 180b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h" 190b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 200b57cec5SDimitry Andric #include "llvm/Support/CodeGen.h" 210b57cec5SDimitry Andric #include "llvm/Target/TargetMachine.h" 220b57cec5SDimitry Andric #include <memory> 23bdd1243dSDimitry Andric #include <optional> 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric namespace llvm { 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric class MipsTargetMachine : public LLVMTargetMachine { 280b57cec5SDimitry Andric bool isLittle; 290b57cec5SDimitry Andric std::unique_ptr<TargetLoweringObjectFile> TLOF; 300b57cec5SDimitry Andric // Selected ABI 310b57cec5SDimitry Andric MipsABIInfo ABI; 320b57cec5SDimitry Andric const MipsSubtarget *Subtarget; 330b57cec5SDimitry Andric MipsSubtarget DefaultSubtarget; 340b57cec5SDimitry Andric MipsSubtarget NoMips16Subtarget; 350b57cec5SDimitry Andric MipsSubtarget Mips16Subtarget; 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric mutable StringMap<std::unique_ptr<MipsSubtarget>> SubtargetMap; 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric public: 400b57cec5SDimitry Andric MipsTargetMachine(const Target &T, const Triple &TT, StringRef CPU, 410b57cec5SDimitry Andric StringRef FS, const TargetOptions &Options, 42bdd1243dSDimitry Andric std::optional<Reloc::Model> RM, 43*5f757f3fSDimitry Andric std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, 44bdd1243dSDimitry Andric bool JIT, bool isLittle); 450b57cec5SDimitry Andric ~MipsTargetMachine() override; 460b57cec5SDimitry Andric 4781ad6265SDimitry Andric TargetTransformInfo getTargetTransformInfo(const Function &F) const override; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric const MipsSubtarget *getSubtargetImpl() const { 500b57cec5SDimitry Andric if (Subtarget) 510b57cec5SDimitry Andric return Subtarget; 520b57cec5SDimitry Andric return &DefaultSubtarget; 530b57cec5SDimitry Andric } 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric const MipsSubtarget *getSubtargetImpl(const Function &F) const override; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric /// Reset the subtarget for the Mips target. 580b57cec5SDimitry Andric void resetSubtarget(MachineFunction *MF); 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric // Pass Pipeline Configuration 610b57cec5SDimitry Andric TargetPassConfig *createPassConfig(PassManagerBase &PM) override; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric TargetLoweringObjectFile *getObjFileLowering() const override { 640b57cec5SDimitry Andric return TLOF.get(); 650b57cec5SDimitry Andric } 660b57cec5SDimitry Andric 67bdd1243dSDimitry Andric MachineFunctionInfo * 68bdd1243dSDimitry Andric createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, 69bdd1243dSDimitry Andric const TargetSubtargetInfo *STI) const override; 70bdd1243dSDimitry Andric 71e8d8bef9SDimitry Andric /// Returns true if a cast between SrcAS and DestAS is a noop. 72e8d8bef9SDimitry Andric bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override { 73e8d8bef9SDimitry Andric // Mips doesn't have any special address spaces so we just reserve 74e8d8bef9SDimitry Andric // the first 256 for software use (e.g. OpenCL) and treat casts 75e8d8bef9SDimitry Andric // between them as noops. 76e8d8bef9SDimitry Andric return SrcAS < 256 && DestAS < 256; 77e8d8bef9SDimitry Andric } 78e8d8bef9SDimitry Andric 790b57cec5SDimitry Andric bool isLittleEndian() const { return isLittle; } 800b57cec5SDimitry Andric const MipsABIInfo &getABI() const { return ABI; } 810b57cec5SDimitry Andric }; 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric /// Mips32/64 big endian target machine. 840b57cec5SDimitry Andric /// 850b57cec5SDimitry Andric class MipsebTargetMachine : public MipsTargetMachine { 860b57cec5SDimitry Andric virtual void anchor(); 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric public: 890b57cec5SDimitry Andric MipsebTargetMachine(const Target &T, const Triple &TT, StringRef CPU, 900b57cec5SDimitry Andric StringRef FS, const TargetOptions &Options, 91bdd1243dSDimitry Andric std::optional<Reloc::Model> RM, 92*5f757f3fSDimitry Andric std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, 93bdd1243dSDimitry Andric bool JIT); 940b57cec5SDimitry Andric }; 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric /// Mips32/64 little endian target machine. 970b57cec5SDimitry Andric /// 980b57cec5SDimitry Andric class MipselTargetMachine : public MipsTargetMachine { 990b57cec5SDimitry Andric virtual void anchor(); 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric public: 1020b57cec5SDimitry Andric MipselTargetMachine(const Target &T, const Triple &TT, StringRef CPU, 1030b57cec5SDimitry Andric StringRef FS, const TargetOptions &Options, 104bdd1243dSDimitry Andric std::optional<Reloc::Model> RM, 105*5f757f3fSDimitry Andric std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, 106bdd1243dSDimitry Andric bool JIT); 1070b57cec5SDimitry Andric }; 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andric } // end namespace llvm 1100b57cec5SDimitry Andric 1110b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H 112