1 //===--- AMDGPUHSAMetadataStreamer.h ----------------------------*- 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 /// \file 10 /// AMDGPU HSA Metadata Streamer. 11 /// 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H 16 #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H 17 18 #include "llvm/BinaryFormat/MsgPackDocument.h" 19 #include "llvm/Support/AMDGPUMetadata.h" 20 #include "llvm/Support/Alignment.h" 21 22 namespace llvm { 23 24 class AMDGPUTargetStreamer; 25 class Argument; 26 class DataLayout; 27 class Function; 28 class MachineFunction; 29 class MDNode; 30 class Module; 31 struct SIProgramInfo; 32 class Type; 33 class GCNSubtarget; 34 35 namespace AMDGPU { 36 37 namespace IsaInfo { 38 class AMDGPUTargetID; 39 } 40 41 namespace HSAMD { 42 43 class MetadataStreamer { 44 public: 45 virtual ~MetadataStreamer(){}; 46 47 virtual bool emitTo(AMDGPUTargetStreamer &TargetStreamer) = 0; 48 49 virtual void begin(const Module &Mod, 50 const IsaInfo::AMDGPUTargetID &TargetID) = 0; 51 52 virtual void end() = 0; 53 54 virtual void emitKernel(const MachineFunction &MF, 55 const SIProgramInfo &ProgramInfo) = 0; 56 }; 57 58 // TODO: Rename MetadataStreamerV3 -> MetadataStreamerMsgPackV3. 59 class MetadataStreamerV3 : public MetadataStreamer { 60 protected: 61 std::unique_ptr<msgpack::Document> HSAMetadataDoc = 62 std::make_unique<msgpack::Document>(); 63 64 void dump(StringRef HSAMetadataString) const; 65 66 void verify(StringRef HSAMetadataString) const; 67 68 Optional<StringRef> getAccessQualifier(StringRef AccQual) const; 69 70 Optional<StringRef> getAddressSpaceQualifier(unsigned AddressSpace) const; 71 72 StringRef getValueKind(Type *Ty, StringRef TypeQual, 73 StringRef BaseTypeName) const; 74 75 std::string getTypeName(Type *Ty, bool Signed) const; 76 77 msgpack::ArrayDocNode getWorkGroupDimensions(MDNode *Node) const; 78 79 msgpack::MapDocNode getHSAKernelProps(const MachineFunction &MF, 80 const SIProgramInfo &ProgramInfo) const; 81 82 void emitVersion(); 83 84 void emitPrintf(const Module &Mod); 85 86 void emitKernelLanguage(const Function &Func, msgpack::MapDocNode Kern); 87 88 void emitKernelAttrs(const Function &Func, msgpack::MapDocNode Kern); 89 90 void emitKernelArgs(const Function &Func, const GCNSubtarget &ST, 91 msgpack::MapDocNode Kern); 92 93 void emitKernelArg(const Argument &Arg, unsigned &Offset, 94 msgpack::ArrayDocNode Args); 95 96 void emitKernelArg(const DataLayout &DL, Type *Ty, Align Alignment, 97 StringRef ValueKind, unsigned &Offset, 98 msgpack::ArrayDocNode Args, MaybeAlign PointeeAlign = None, 99 StringRef Name = "", StringRef TypeName = "", 100 StringRef BaseTypeName = "", StringRef AccQual = "", 101 StringRef TypeQual = ""); 102 103 void emitHiddenKernelArgs(const Function &Func, const GCNSubtarget &ST, 104 unsigned &Offset, msgpack::ArrayDocNode Args); 105 106 msgpack::DocNode &getRootMetadata(StringRef Key) { 107 return HSAMetadataDoc->getRoot().getMap(/*Convert=*/true)[Key]; 108 } 109 110 msgpack::DocNode &getHSAMetadataRoot() { 111 return HSAMetadataDoc->getRoot(); 112 } 113 114 public: 115 MetadataStreamerV3() = default; 116 ~MetadataStreamerV3() = default; 117 118 bool emitTo(AMDGPUTargetStreamer &TargetStreamer) override; 119 120 void begin(const Module &Mod, 121 const IsaInfo::AMDGPUTargetID &TargetID) override; 122 123 void end() override; 124 125 void emitKernel(const MachineFunction &MF, 126 const SIProgramInfo &ProgramInfo) override; 127 }; 128 129 // TODO: Rename MetadataStreamerV4 -> MetadataStreamerMsgPackV4. 130 class MetadataStreamerV4 final : public MetadataStreamerV3 { 131 void emitVersion(); 132 133 void emitTargetID(const IsaInfo::AMDGPUTargetID &TargetID); 134 135 public: 136 MetadataStreamerV4() = default; 137 ~MetadataStreamerV4() = default; 138 139 void begin(const Module &Mod, 140 const IsaInfo::AMDGPUTargetID &TargetID) override; 141 }; 142 143 // TODO: Rename MetadataStreamerV2 -> MetadataStreamerYamlV2. 144 class MetadataStreamerV2 final : public MetadataStreamer { 145 private: 146 Metadata HSAMetadata; 147 148 void dump(StringRef HSAMetadataString) const; 149 150 void verify(StringRef HSAMetadataString) const; 151 152 AccessQualifier getAccessQualifier(StringRef AccQual) const; 153 154 AddressSpaceQualifier getAddressSpaceQualifier(unsigned AddressSpace) const; 155 156 ValueKind getValueKind(Type *Ty, StringRef TypeQual, 157 StringRef BaseTypeName) const; 158 159 std::string getTypeName(Type *Ty, bool Signed) const; 160 161 std::vector<uint32_t> getWorkGroupDimensions(MDNode *Node) const; 162 163 Kernel::CodeProps::Metadata getHSACodeProps( 164 const MachineFunction &MF, 165 const SIProgramInfo &ProgramInfo) const; 166 Kernel::DebugProps::Metadata getHSADebugProps( 167 const MachineFunction &MF, 168 const SIProgramInfo &ProgramInfo) const; 169 170 void emitVersion(); 171 172 void emitPrintf(const Module &Mod); 173 174 void emitKernelLanguage(const Function &Func); 175 176 void emitKernelAttrs(const Function &Func); 177 178 void emitKernelArgs(const Function &Func, const GCNSubtarget &ST); 179 180 void emitKernelArg(const Argument &Arg); 181 182 void emitKernelArg(const DataLayout &DL, Type *Ty, Align Alignment, 183 ValueKind ValueKind, MaybeAlign PointeeAlign = None, 184 StringRef Name = "", StringRef TypeName = "", 185 StringRef BaseTypeName = "", StringRef AccQual = "", 186 StringRef TypeQual = ""); 187 188 void emitHiddenKernelArgs(const Function &Func, const GCNSubtarget &ST); 189 190 const Metadata &getHSAMetadata() const { 191 return HSAMetadata; 192 } 193 194 public: 195 MetadataStreamerV2() = default; 196 ~MetadataStreamerV2() = default; 197 198 bool emitTo(AMDGPUTargetStreamer &TargetStreamer) override; 199 200 void begin(const Module &Mod, 201 const IsaInfo::AMDGPUTargetID &TargetID) override; 202 203 void end() override; 204 205 void emitKernel(const MachineFunction &MF, 206 const SIProgramInfo &ProgramInfo) override; 207 }; 208 209 } // end namespace HSAMD 210 } // end namespace AMDGPU 211 } // end namespace llvm 212 213 #endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H 214