xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h (revision 2c2ec6bbc9cc7762a250ffe903bda6c2e44d25ff)
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 "Utils/AMDGPUDelayedMCExpr.h"
19 #include "llvm/BinaryFormat/MsgPackDocument.h"
20 #include "llvm/Support/AMDGPUMetadata.h"
21 #include "llvm/Support/Alignment.h"
22 #include "llvm/Support/Compiler.h"
23 
24 namespace llvm {
25 
26 class AMDGPUTargetMachine;
27 class AMDGPUTargetStreamer;
28 class Argument;
29 class DataLayout;
30 class Function;
31 class MachineFunction;
32 class MDNode;
33 class Module;
34 struct SIProgramInfo;
35 class Type;
36 
37 namespace AMDGPU {
38 
39 namespace IsaInfo {
40 class AMDGPUTargetID;
41 }
42 
43 namespace HSAMD {
44 
45 class MetadataStreamer {
46 public:
47   virtual ~MetadataStreamer() = default;
48 
49   virtual bool emitTo(AMDGPUTargetStreamer &TargetStreamer) = 0;
50 
51   virtual void begin(const Module &Mod,
52                      const IsaInfo::AMDGPUTargetID &TargetID) = 0;
53 
54   virtual void end() = 0;
55 
56   virtual void emitKernel(const MachineFunction &MF,
57                           const SIProgramInfo &ProgramInfo) = 0;
58 
59 protected:
60   virtual void emitVersion() = 0;
61   virtual void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset,
62                                     msgpack::ArrayDocNode Args) = 0;
63   virtual void emitKernelAttrs(const AMDGPUTargetMachine &TM,
64                                const Function &Func,
65                                msgpack::MapDocNode Kern) = 0;
66 };
67 
68 class LLVM_EXTERNAL_VISIBILITY MetadataStreamerMsgPackV4
69     : public MetadataStreamer {
70 protected:
71   std::unique_ptr<DelayedMCExprs> DelayedExprs =
72       std::make_unique<DelayedMCExprs>();
73 
74   std::unique_ptr<msgpack::Document> HSAMetadataDoc =
75       std::make_unique<msgpack::Document>();
76 
77   void dump(StringRef HSAMetadataString) const;
78 
79   void verify(StringRef HSAMetadataString) const;
80 
81   std::optional<StringRef> getAccessQualifier(StringRef AccQual) const;
82 
83   std::optional<StringRef>
84   getAddressSpaceQualifier(unsigned AddressSpace) const;
85 
86   StringRef getValueKind(Type *Ty, StringRef TypeQual,
87                          StringRef BaseTypeName) const;
88 
89   std::string getTypeName(Type *Ty, bool Signed) const;
90 
91   msgpack::ArrayDocNode getWorkGroupDimensions(MDNode *Node) const;
92 
93   msgpack::MapDocNode getHSAKernelProps(const MachineFunction &MF,
94                                         const SIProgramInfo &ProgramInfo,
95                                         unsigned CodeObjectVersion) const;
96 
97   void emitVersion() override;
98 
99   void emitTargetID(const IsaInfo::AMDGPUTargetID &TargetID);
100 
101   void emitPrintf(const Module &Mod);
102 
103   void emitKernelLanguage(const Function &Func, msgpack::MapDocNode Kern);
104 
105   void emitKernelAttrs(const AMDGPUTargetMachine &TM, const Function &Func,
106                        msgpack::MapDocNode Kern) override;
107 
108   void emitKernelArgs(const MachineFunction &MF, msgpack::MapDocNode Kern);
109 
110   void emitKernelArg(const Argument &Arg, unsigned &Offset,
111                      msgpack::ArrayDocNode Args);
112 
113   void emitKernelArg(const DataLayout &DL, Type *Ty, Align Alignment,
114                      StringRef ValueKind, unsigned &Offset,
115                      msgpack::ArrayDocNode Args,
116                      MaybeAlign PointeeAlign = std::nullopt,
117                      StringRef Name = "", StringRef TypeName = "",
118                      StringRef BaseTypeName = "", StringRef ActAccQual = "",
119                      StringRef AccQual = "", StringRef TypeQual = "");
120 
121   void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset,
122                             msgpack::ArrayDocNode Args) override;
123 
124   msgpack::DocNode &getRootMetadata(StringRef Key) {
125     return HSAMetadataDoc->getRoot().getMap(/*Convert=*/true)[Key];
126   }
127 
128   msgpack::DocNode &getHSAMetadataRoot() {
129     return HSAMetadataDoc->getRoot();
130   }
131 
132 public:
133   MetadataStreamerMsgPackV4() = default;
134   ~MetadataStreamerMsgPackV4() = default;
135 
136   bool emitTo(AMDGPUTargetStreamer &TargetStreamer) override;
137 
138   void begin(const Module &Mod,
139              const IsaInfo::AMDGPUTargetID &TargetID) override;
140 
141   void end() override;
142 
143   void emitKernel(const MachineFunction &MF,
144                   const SIProgramInfo &ProgramInfo) override;
145 };
146 
147 class MetadataStreamerMsgPackV5 : public MetadataStreamerMsgPackV4 {
148 protected:
149   void emitVersion() override;
150   void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset,
151                             msgpack::ArrayDocNode Args) override;
152   void emitKernelAttrs(const AMDGPUTargetMachine &TM, const Function &Func,
153                        msgpack::MapDocNode Kern) override;
154 
155 public:
156   MetadataStreamerMsgPackV5() = default;
157   ~MetadataStreamerMsgPackV5() = default;
158 };
159 
160 class MetadataStreamerMsgPackV6 final : public MetadataStreamerMsgPackV5 {
161 protected:
162   void emitVersion() override;
163 
164 public:
165   MetadataStreamerMsgPackV6() = default;
166   ~MetadataStreamerMsgPackV6() = default;
167 };
168 
169 } // end namespace HSAMD
170 } // end namespace AMDGPU
171 } // end namespace llvm
172 
173 #endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H
174