112 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file declares the Mips specific subclass of TargetMachine.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H14#define LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H15 16#include "MCTargetDesc/MipsABIInfo.h"17#include "MipsSubtarget.h"18#include "llvm/ADT/StringMap.h"19#include "llvm/ADT/StringRef.h"20#include "llvm/CodeGen/CodeGenTargetMachineImpl.h"21#include "llvm/Support/CodeGen.h"22#include <memory>23#include <optional>24 25namespace llvm {26 27class MipsTargetMachine : public CodeGenTargetMachineImpl {28 bool isLittle;29 std::unique_ptr<TargetLoweringObjectFile> TLOF;30 // Selected ABI31 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 std::optional<Reloc::Model> RM,43 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,44 bool JIT, bool isLittle);45 ~MipsTargetMachine() override;46 47 TargetTransformInfo getTargetTransformInfo(const Function &F) const override;48 49 const MipsSubtarget *getSubtargetImpl() const {50 if (Subtarget)51 return Subtarget;52 return &DefaultSubtarget;53 }54 55 const MipsSubtarget *getSubtargetImpl(const Function &F) const override;56 57 /// Reset the subtarget for the Mips target.58 void resetSubtarget(MachineFunction *MF);59 60 // Pass Pipeline Configuration61 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;62 63 TargetLoweringObjectFile *getObjFileLowering() const override {64 return TLOF.get();65 }66 67 MachineFunctionInfo *68 createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,69 const TargetSubtargetInfo *STI) const override;70 71 /// Returns true if a cast between SrcAS and DestAS is a noop.72 bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override {73 // Mips doesn't have any special address spaces so we just reserve74 // the first 256 for software use (e.g. OpenCL) and treat casts75 // between them as noops.76 return SrcAS < 256 && DestAS < 256;77 }78 79 bool isLittleEndian() const { return isLittle; }80 const MipsABIInfo &getABI() const { return ABI; }81};82 83/// Mips32/64 big endian target machine.84///85class MipsebTargetMachine : public MipsTargetMachine {86 virtual void anchor();87 88public:89 MipsebTargetMachine(const Target &T, const Triple &TT, StringRef CPU,90 StringRef FS, const TargetOptions &Options,91 std::optional<Reloc::Model> RM,92 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,93 bool JIT);94};95 96/// Mips32/64 little endian target machine.97///98class MipselTargetMachine : public MipsTargetMachine {99 virtual void anchor();100 101public:102 MipselTargetMachine(const Target &T, const Triple &TT, StringRef CPU,103 StringRef FS, const TargetOptions &Options,104 std::optional<Reloc::Model> RM,105 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,106 bool JIT);107};108 109} // end namespace llvm110 111#endif // LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H112