10b57cec5SDimitry Andric //===-- NVPTXTargetMachine.h - Define TargetMachine for NVPTX ---*- 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 NVPTX specific subclass of TargetMachine. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXTARGETMACHINE_H 140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_NVPTX_NVPTXTARGETMACHINE_H 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "NVPTXSubtarget.h" 170b57cec5SDimitry Andric #include "llvm/Target/TargetMachine.h" 18bdd1243dSDimitry Andric #include <optional> 19349cc55cSDimitry Andric #include <utility> 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric namespace llvm { 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric /// NVPTXTargetMachine 240b57cec5SDimitry Andric /// 250b57cec5SDimitry Andric class NVPTXTargetMachine : public LLVMTargetMachine { 260b57cec5SDimitry Andric bool is64bit; 270b57cec5SDimitry Andric std::unique_ptr<TargetLoweringObjectFile> TLOF; 280b57cec5SDimitry Andric NVPTX::DrvInterface drvInterface; 290b57cec5SDimitry Andric NVPTXSubtarget Subtarget; 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric // Hold Strings that can be free'd all together with NVPTXTargetMachine 32bdd1243dSDimitry Andric BumpPtrAllocator StrAlloc; 33bdd1243dSDimitry Andric UniqueStringSaver StrPool; 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric public: 360b57cec5SDimitry Andric NVPTXTargetMachine(const Target &T, const Triple &TT, StringRef CPU, 370b57cec5SDimitry Andric StringRef FS, const TargetOptions &Options, 38bdd1243dSDimitry Andric std::optional<Reloc::Model> RM, 395f757f3fSDimitry Andric std::optional<CodeModel::Model> CM, CodeGenOptLevel OP, 40bdd1243dSDimitry Andric bool is64bit); 410b57cec5SDimitry Andric ~NVPTXTargetMachine() override; getSubtargetImpl(const Function &)420b57cec5SDimitry Andric const NVPTXSubtarget *getSubtargetImpl(const Function &) const override { 430b57cec5SDimitry Andric return &Subtarget; 440b57cec5SDimitry Andric } getSubtargetImpl()450b57cec5SDimitry Andric const NVPTXSubtarget *getSubtargetImpl() const { return &Subtarget; } is64Bit()460b57cec5SDimitry Andric bool is64Bit() const { return is64bit; } getDrvInterface()470b57cec5SDimitry Andric NVPTX::DrvInterface getDrvInterface() const { return drvInterface; } getStrPool()48bdd1243dSDimitry Andric UniqueStringSaver &getStrPool() const { 49bdd1243dSDimitry Andric return const_cast<UniqueStringSaver &>(StrPool); 500b57cec5SDimitry Andric } 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric TargetPassConfig *createPassConfig(PassManagerBase &PM) override; 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric // Emission of machine code through MCJIT is not supported. 550b57cec5SDimitry Andric bool addPassesToEmitMC(PassManagerBase &, MCContext *&, raw_pwrite_stream &, 560b57cec5SDimitry Andric bool = true) override { 570b57cec5SDimitry Andric return true; 580b57cec5SDimitry Andric } getObjFileLowering()590b57cec5SDimitry Andric TargetLoweringObjectFile *getObjFileLowering() const override { 600b57cec5SDimitry Andric return TLOF.get(); 610b57cec5SDimitry Andric } 620b57cec5SDimitry Andric 63bdd1243dSDimitry Andric MachineFunctionInfo * 64bdd1243dSDimitry Andric createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, 65bdd1243dSDimitry Andric const TargetSubtargetInfo *STI) const override; 66bdd1243dSDimitry Andric 6706c3fb27SDimitry Andric void registerDefaultAliasAnalyses(AAManager &AAM) override; 6806c3fb27SDimitry Andric 69*0fca6ea1SDimitry Andric void registerPassBuilderCallbacks(PassBuilder &PB) override; 700b57cec5SDimitry Andric 7181ad6265SDimitry Andric TargetTransformInfo getTargetTransformInfo(const Function &F) const override; 720b57cec5SDimitry Andric isMachineVerifierClean()730b57cec5SDimitry Andric bool isMachineVerifierClean() const override { 740b57cec5SDimitry Andric return false; 750b57cec5SDimitry Andric } 76349cc55cSDimitry Andric 77349cc55cSDimitry Andric std::pair<const Value *, unsigned> 78349cc55cSDimitry Andric getPredicatedAddrSpace(const Value *V) const override; 790b57cec5SDimitry Andric }; // NVPTXTargetMachine. 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric class NVPTXTargetMachine32 : public NVPTXTargetMachine { 820b57cec5SDimitry Andric virtual void anchor(); 83bdd1243dSDimitry Andric 840b57cec5SDimitry Andric public: 850b57cec5SDimitry Andric NVPTXTargetMachine32(const Target &T, const Triple &TT, StringRef CPU, 860b57cec5SDimitry Andric StringRef FS, const TargetOptions &Options, 87bdd1243dSDimitry Andric std::optional<Reloc::Model> RM, 885f757f3fSDimitry Andric std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, 89bdd1243dSDimitry Andric bool JIT); 900b57cec5SDimitry Andric }; 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric class NVPTXTargetMachine64 : public NVPTXTargetMachine { 930b57cec5SDimitry Andric virtual void anchor(); 94bdd1243dSDimitry Andric 950b57cec5SDimitry Andric public: 960b57cec5SDimitry Andric NVPTXTargetMachine64(const Target &T, const Triple &TT, StringRef CPU, 970b57cec5SDimitry Andric StringRef FS, const TargetOptions &Options, 98bdd1243dSDimitry Andric std::optional<Reloc::Model> RM, 995f757f3fSDimitry Andric std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, 100bdd1243dSDimitry Andric bool JIT); 1010b57cec5SDimitry Andric }; 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric } // end namespace llvm 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric #endif 106