1 //===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- 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 /// \file 11 /// \brief The AMDGPU TargetMachine interface definition for hw codgen targets. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H 16 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H 17 18 #include "AMDGPUIntrinsicInfo.h" 19 #include "AMDGPUSubtarget.h" 20 21 namespace llvm { 22 23 //===----------------------------------------------------------------------===// 24 // AMDGPU Target Machine (R600+) 25 //===----------------------------------------------------------------------===// 26 27 class AMDGPUTargetMachine : public LLVMTargetMachine { 28 protected: 29 std::unique_ptr<TargetLoweringObjectFile> TLOF; 30 AMDGPUIntrinsicInfo IntrinsicInfo; 31 32 StringRef getGPUName(const Function &F) const; 33 StringRef getFeatureString(const Function &F) const; 34 35 public: 36 AMDGPUTargetMachine(const Target &T, const Triple &TT, StringRef CPU, 37 StringRef FS, TargetOptions Options, 38 Optional<Reloc::Model> RM, CodeModel::Model CM, 39 CodeGenOpt::Level OL); 40 ~AMDGPUTargetMachine(); 41 42 const AMDGPUSubtarget *getSubtargetImpl() const; 43 const AMDGPUSubtarget *getSubtargetImpl(const Function &) const override; 44 45 const AMDGPUIntrinsicInfo *getIntrinsicInfo() const override { 46 return &IntrinsicInfo; 47 } 48 TargetIRAnalysis getTargetIRAnalysis() override; 49 50 TargetLoweringObjectFile *getObjFileLowering() const override { 51 return TLOF.get(); 52 } 53 }; 54 55 //===----------------------------------------------------------------------===// 56 // R600 Target Machine (R600 -> Cayman) 57 //===----------------------------------------------------------------------===// 58 59 class R600TargetMachine final : public AMDGPUTargetMachine { 60 private: 61 mutable StringMap<std::unique_ptr<R600Subtarget>> SubtargetMap; 62 63 public: 64 R600TargetMachine(const Target &T, const Triple &TT, StringRef CPU, 65 StringRef FS, TargetOptions Options, 66 Optional<Reloc::Model> RM, CodeModel::Model CM, 67 CodeGenOpt::Level OL); 68 69 TargetPassConfig *createPassConfig(PassManagerBase &PM) override; 70 71 const R600Subtarget *getSubtargetImpl(const Function &) const override; 72 }; 73 74 //===----------------------------------------------------------------------===// 75 // GCN Target Machine (SI+) 76 //===----------------------------------------------------------------------===// 77 78 class GCNTargetMachine final : public AMDGPUTargetMachine { 79 private: 80 mutable StringMap<std::unique_ptr<SISubtarget>> SubtargetMap; 81 82 public: 83 GCNTargetMachine(const Target &T, const Triple &TT, StringRef CPU, 84 StringRef FS, TargetOptions Options, 85 Optional<Reloc::Model> RM, CodeModel::Model CM, 86 CodeGenOpt::Level OL); 87 88 TargetPassConfig *createPassConfig(PassManagerBase &PM) override; 89 90 const SISubtarget *getSubtargetImpl(const Function &) const override; 91 }; 92 93 inline const AMDGPUSubtarget *AMDGPUTargetMachine::getSubtargetImpl( 94 const Function &F) const { 95 if (getTargetTriple().getArch() == Triple::amdgcn) 96 return static_cast<const GCNTargetMachine *>(this)->getSubtargetImpl(F); 97 return static_cast<const R600TargetMachine *>(this)->getSubtargetImpl(F); 98 } 99 100 } // End namespace llvm 101 102 #endif 103