xref: /freebsd/contrib/llvm-project/llvm/lib/Target/NVPTX/NVPTXTargetMachine.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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