10b57cec5SDimitry Andric //===--- AMDGPUHSAMetadataStreamer.h ----------------------------*- 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 /// \file 100b57cec5SDimitry Andric /// AMDGPU HSA Metadata Streamer. 110b57cec5SDimitry Andric /// 120b57cec5SDimitry Andric // 130b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H 160b57cec5SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H 170b57cec5SDimitry Andric 18*0fca6ea1SDimitry Andric #include "Utils/AMDGPUDelayedMCExpr.h" 190b57cec5SDimitry Andric #include "llvm/BinaryFormat/MsgPackDocument.h" 200b57cec5SDimitry Andric #include "llvm/Support/AMDGPUMetadata.h" 215ffd83dbSDimitry Andric #include "llvm/Support/Alignment.h" 22*0fca6ea1SDimitry Andric #include "llvm/Support/Compiler.h" 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric namespace llvm { 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric class AMDGPUTargetStreamer; 270b57cec5SDimitry Andric class Argument; 280b57cec5SDimitry Andric class DataLayout; 290b57cec5SDimitry Andric class Function; 305ffd83dbSDimitry Andric class MachineFunction; 310b57cec5SDimitry Andric class MDNode; 320b57cec5SDimitry Andric class Module; 330b57cec5SDimitry Andric struct SIProgramInfo; 340b57cec5SDimitry Andric class Type; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric namespace AMDGPU { 37349cc55cSDimitry Andric 38349cc55cSDimitry Andric namespace IsaInfo { 39349cc55cSDimitry Andric class AMDGPUTargetID; 40349cc55cSDimitry Andric } 41349cc55cSDimitry Andric 420b57cec5SDimitry Andric namespace HSAMD { 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric class MetadataStreamer { 450b57cec5SDimitry Andric public: 4681ad6265SDimitry Andric virtual ~MetadataStreamer() = default; 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric virtual bool emitTo(AMDGPUTargetStreamer &TargetStreamer) = 0; 490b57cec5SDimitry Andric 50fe6060f1SDimitry Andric virtual void begin(const Module &Mod, 51fe6060f1SDimitry Andric const IsaInfo::AMDGPUTargetID &TargetID) = 0; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric virtual void end() = 0; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric virtual void emitKernel(const MachineFunction &MF, 560b57cec5SDimitry Andric const SIProgramInfo &ProgramInfo) = 0; 571fd87a68SDimitry Andric 581fd87a68SDimitry Andric protected: 591fd87a68SDimitry Andric virtual void emitVersion() = 0; 601fd87a68SDimitry Andric virtual void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset, 611fd87a68SDimitry Andric msgpack::ArrayDocNode Args) = 0; 62bdd1243dSDimitry Andric virtual void emitKernelAttrs(const Function &Func, 63bdd1243dSDimitry Andric msgpack::MapDocNode Kern) = 0; 640b57cec5SDimitry Andric }; 650b57cec5SDimitry Andric 66*0fca6ea1SDimitry Andric class LLVM_EXTERNAL_VISIBILITY MetadataStreamerMsgPackV4 67*0fca6ea1SDimitry Andric : public MetadataStreamer { 68fe6060f1SDimitry Andric protected: 69*0fca6ea1SDimitry Andric std::unique_ptr<DelayedMCExprs> DelayedExprs = 70*0fca6ea1SDimitry Andric std::make_unique<DelayedMCExprs>(); 71*0fca6ea1SDimitry Andric 720b57cec5SDimitry Andric std::unique_ptr<msgpack::Document> HSAMetadataDoc = 738bcb0991SDimitry Andric std::make_unique<msgpack::Document>(); 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric void dump(StringRef HSAMetadataString) const; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric void verify(StringRef HSAMetadataString) const; 780b57cec5SDimitry Andric 79bdd1243dSDimitry Andric std::optional<StringRef> getAccessQualifier(StringRef AccQual) const; 800b57cec5SDimitry Andric 81bdd1243dSDimitry Andric std::optional<StringRef> 82bdd1243dSDimitry Andric getAddressSpaceQualifier(unsigned AddressSpace) const; 830b57cec5SDimitry Andric 840b57cec5SDimitry Andric StringRef getValueKind(Type *Ty, StringRef TypeQual, 850b57cec5SDimitry Andric StringRef BaseTypeName) const; 860b57cec5SDimitry Andric 870b57cec5SDimitry Andric std::string getTypeName(Type *Ty, bool Signed) const; 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric msgpack::ArrayDocNode getWorkGroupDimensions(MDNode *Node) const; 900b57cec5SDimitry Andric 910b57cec5SDimitry Andric msgpack::MapDocNode getHSAKernelProps(const MachineFunction &MF, 9206c3fb27SDimitry Andric const SIProgramInfo &ProgramInfo, 9306c3fb27SDimitry Andric unsigned CodeObjectVersion) const; 940b57cec5SDimitry Andric 951fd87a68SDimitry Andric void emitVersion() override; 960b57cec5SDimitry Andric 975f757f3fSDimitry Andric void emitTargetID(const IsaInfo::AMDGPUTargetID &TargetID); 985f757f3fSDimitry Andric 990b57cec5SDimitry Andric void emitPrintf(const Module &Mod); 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric void emitKernelLanguage(const Function &Func, msgpack::MapDocNode Kern); 1020b57cec5SDimitry Andric 103bdd1243dSDimitry Andric void emitKernelAttrs(const Function &Func, msgpack::MapDocNode Kern) override; 1040b57cec5SDimitry Andric 1051fd87a68SDimitry Andric void emitKernelArgs(const MachineFunction &MF, msgpack::MapDocNode Kern); 1060b57cec5SDimitry Andric 1070b57cec5SDimitry Andric void emitKernelArg(const Argument &Arg, unsigned &Offset, 1080b57cec5SDimitry Andric msgpack::ArrayDocNode Args); 1090b57cec5SDimitry Andric 110e8d8bef9SDimitry Andric void emitKernelArg(const DataLayout &DL, Type *Ty, Align Alignment, 111e8d8bef9SDimitry Andric StringRef ValueKind, unsigned &Offset, 112bdd1243dSDimitry Andric msgpack::ArrayDocNode Args, 113bdd1243dSDimitry Andric MaybeAlign PointeeAlign = std::nullopt, 114e8d8bef9SDimitry Andric StringRef Name = "", StringRef TypeName = "", 1155f757f3fSDimitry Andric StringRef BaseTypeName = "", StringRef ActAccQual = "", 1165f757f3fSDimitry Andric StringRef AccQual = "", StringRef TypeQual = ""); 1170b57cec5SDimitry Andric 1181fd87a68SDimitry Andric void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset, 1191fd87a68SDimitry Andric msgpack::ArrayDocNode Args) override; 1200b57cec5SDimitry Andric 1210b57cec5SDimitry Andric msgpack::DocNode &getRootMetadata(StringRef Key) { 1220b57cec5SDimitry Andric return HSAMetadataDoc->getRoot().getMap(/*Convert=*/true)[Key]; 1230b57cec5SDimitry Andric } 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric msgpack::DocNode &getHSAMetadataRoot() { 1260b57cec5SDimitry Andric return HSAMetadataDoc->getRoot(); 1270b57cec5SDimitry Andric } 1280b57cec5SDimitry Andric 1290b57cec5SDimitry Andric public: 1305f757f3fSDimitry Andric MetadataStreamerMsgPackV4() = default; 1315f757f3fSDimitry Andric ~MetadataStreamerMsgPackV4() = default; 1320b57cec5SDimitry Andric 1330b57cec5SDimitry Andric bool emitTo(AMDGPUTargetStreamer &TargetStreamer) override; 1340b57cec5SDimitry Andric 135fe6060f1SDimitry Andric void begin(const Module &Mod, 136fe6060f1SDimitry Andric const IsaInfo::AMDGPUTargetID &TargetID) override; 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric void end() override; 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andric void emitKernel(const MachineFunction &MF, 1410b57cec5SDimitry Andric const SIProgramInfo &ProgramInfo) override; 1420b57cec5SDimitry Andric }; 1430b57cec5SDimitry Andric 144*0fca6ea1SDimitry Andric class MetadataStreamerMsgPackV5 : public MetadataStreamerMsgPackV4 { 1451fd87a68SDimitry Andric protected: 1461fd87a68SDimitry Andric void emitVersion() override; 1471fd87a68SDimitry Andric void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset, 1481fd87a68SDimitry Andric msgpack::ArrayDocNode Args) override; 149bdd1243dSDimitry Andric void emitKernelAttrs(const Function &Func, msgpack::MapDocNode Kern) override; 1501fd87a68SDimitry Andric 1511fd87a68SDimitry Andric public: 152bdd1243dSDimitry Andric MetadataStreamerMsgPackV5() = default; 153bdd1243dSDimitry Andric ~MetadataStreamerMsgPackV5() = default; 1541fd87a68SDimitry Andric }; 1551fd87a68SDimitry Andric 156*0fca6ea1SDimitry Andric class MetadataStreamerMsgPackV6 final : public MetadataStreamerMsgPackV5 { 157*0fca6ea1SDimitry Andric protected: 158*0fca6ea1SDimitry Andric void emitVersion() override; 159*0fca6ea1SDimitry Andric 160*0fca6ea1SDimitry Andric public: 161*0fca6ea1SDimitry Andric MetadataStreamerMsgPackV6() = default; 162*0fca6ea1SDimitry Andric ~MetadataStreamerMsgPackV6() = default; 163*0fca6ea1SDimitry Andric }; 164*0fca6ea1SDimitry Andric 1650b57cec5SDimitry Andric } // end namespace HSAMD 1660b57cec5SDimitry Andric } // end namespace AMDGPU 1670b57cec5SDimitry Andric } // end namespace llvm 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H 170