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