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