1 //===-- AMDGPUTargetMachine.h - AMDGPU TargetMachine Interface --*- C++ -*-===//
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-exception
7 //===----------------------------------------------------------------------===//
10 /// The AMDGPU TargetMachine interface definition for hw codgen targets.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
15 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H
17 #include "AMDGPUSubtarget.h"
18 #include "llvm/ADT/Optional.h"
19 #include "llvm/ADT/StringMap.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/Analysis/TargetTransformInfo.h"
22 #include "llvm/Support/CodeGen.h"
23 #include "llvm/Target/TargetMachine.h"
28 //===----------------------------------------------------------------------===//
29 // AMDGPU Target Machine (R600+)
30 //===----------------------------------------------------------------------===//
32 class AMDGPUTargetMachine : public LLVMTargetMachine {
34 std::unique_ptr<TargetLoweringObjectFile> TLOF;
36 StringRef getGPUName(const Function &F) const;
37 StringRef getFeatureString(const Function &F) const;
40 static bool EnableLateStructurizeCFG;
41 static bool EnableFunctionCalls;
43 AMDGPUTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
44 StringRef FS, TargetOptions Options,
45 Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM,
46 CodeGenOpt::Level OL);
47 ~AMDGPUTargetMachine() override;
49 const TargetSubtargetInfo *getSubtargetImpl() const;
50 const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override = 0;
52 TargetLoweringObjectFile *getObjFileLowering() const override {
56 void adjustPassManager(PassManagerBuilder &) override;
58 /// Get the integer value of a null pointer in the given address space.
59 uint64_t getNullPointerValue(unsigned AddrSpace) const {
60 return (AddrSpace == AMDGPUAS::LOCAL_ADDRESS ||
61 AddrSpace == AMDGPUAS::REGION_ADDRESS) ? -1 : 0;
65 //===----------------------------------------------------------------------===//
66 // R600 Target Machine (R600 -> Cayman)
67 //===----------------------------------------------------------------------===//
69 class R600TargetMachine final : public AMDGPUTargetMachine {
71 mutable StringMap<std::unique_ptr<R600Subtarget>> SubtargetMap;
74 R600TargetMachine(const Target &T, const Triple &TT, StringRef CPU,
75 StringRef FS, TargetOptions Options,
76 Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM,
77 CodeGenOpt::Level OL, bool JIT);
79 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
81 const R600Subtarget *getSubtargetImpl(const Function &) const override;
83 TargetTransformInfo getTargetTransformInfo(const Function &F) override;
85 bool isMachineVerifierClean() const override {
90 //===----------------------------------------------------------------------===//
91 // GCN Target Machine (SI+)
92 //===----------------------------------------------------------------------===//
94 class GCNTargetMachine final : public AMDGPUTargetMachine {
96 mutable StringMap<std::unique_ptr<GCNSubtarget>> SubtargetMap;
99 GCNTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
100 StringRef FS, TargetOptions Options,
101 Optional<Reloc::Model> RM, Optional<CodeModel::Model> CM,
102 CodeGenOpt::Level OL, bool JIT);
104 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
106 const GCNSubtarget *getSubtargetImpl(const Function &) const override;
108 TargetTransformInfo getTargetTransformInfo(const Function &F) override;
110 bool useIPRA() const override {
114 yaml::MachineFunctionInfo *createDefaultFuncInfoYAML() const override;
115 yaml::MachineFunctionInfo *
116 convertFuncInfoToYAML(const MachineFunction &MF) const override;
117 bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &,
118 PerFunctionMIParsingState &PFS,
120 SMRange &SourceRange) const override;
123 } // end namespace llvm
125 #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUTARGETMACHINE_H