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