xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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