1 //===--- AMDGPUHSAMetadataStreamer.h ----------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
10 /// AMDGPU HSA Metadata Streamer.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H
16 #define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H
19 #include "AMDKernelCodeT.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/BinaryFormat/MsgPackDocument.h"
22 #include "llvm/Support/AMDGPUMetadata.h"
26 class AMDGPUTargetStreamer
;
38 class MetadataStreamer
{
40 virtual ~MetadataStreamer(){};
42 virtual bool emitTo(AMDGPUTargetStreamer
&TargetStreamer
) = 0;
44 virtual void begin(const Module
&Mod
) = 0;
46 virtual void end() = 0;
48 virtual void emitKernel(const MachineFunction
&MF
,
49 const SIProgramInfo
&ProgramInfo
) = 0;
52 class MetadataStreamerV3 final
: public MetadataStreamer
{
54 std::unique_ptr
<msgpack::Document
> HSAMetadataDoc
=
55 std::make_unique
<msgpack::Document
>();
57 void dump(StringRef HSAMetadataString
) const;
59 void verify(StringRef HSAMetadataString
) const;
61 Optional
<StringRef
> getAccessQualifier(StringRef AccQual
) const;
63 Optional
<StringRef
> getAddressSpaceQualifier(unsigned AddressSpace
) const;
65 StringRef
getValueKind(Type
*Ty
, StringRef TypeQual
,
66 StringRef BaseTypeName
) const;
68 StringRef
getValueType(Type
*Ty
, StringRef TypeName
) const;
70 std::string
getTypeName(Type
*Ty
, bool Signed
) const;
72 msgpack::ArrayDocNode
getWorkGroupDimensions(MDNode
*Node
) const;
74 msgpack::MapDocNode
getHSAKernelProps(const MachineFunction
&MF
,
75 const SIProgramInfo
&ProgramInfo
) const;
79 void emitPrintf(const Module
&Mod
);
81 void emitKernelLanguage(const Function
&Func
, msgpack::MapDocNode Kern
);
83 void emitKernelAttrs(const Function
&Func
, msgpack::MapDocNode Kern
);
85 void emitKernelArgs(const Function
&Func
, msgpack::MapDocNode Kern
);
87 void emitKernelArg(const Argument
&Arg
, unsigned &Offset
,
88 msgpack::ArrayDocNode Args
);
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
= "");
96 void emitHiddenKernelArgs(const Function
&Func
, unsigned &Offset
,
97 msgpack::ArrayDocNode Args
);
99 msgpack::DocNode
&getRootMetadata(StringRef Key
) {
100 return HSAMetadataDoc
->getRoot().getMap(/*Convert=*/true)[Key
];
103 msgpack::DocNode
&getHSAMetadataRoot() {
104 return HSAMetadataDoc
->getRoot();
108 MetadataStreamerV3() = default;
109 ~MetadataStreamerV3() = default;
111 bool emitTo(AMDGPUTargetStreamer
&TargetStreamer
) override
;
113 void begin(const Module
&Mod
) override
;
117 void emitKernel(const MachineFunction
&MF
,
118 const SIProgramInfo
&ProgramInfo
) override
;
121 class MetadataStreamerV2 final
: public MetadataStreamer
{
123 Metadata HSAMetadata
;
125 void dump(StringRef HSAMetadataString
) const;
127 void verify(StringRef HSAMetadataString
) const;
129 AccessQualifier
getAccessQualifier(StringRef AccQual
) const;
131 AddressSpaceQualifier
getAddressSpaceQualifier(unsigned AddressSpace
) const;
133 ValueKind
getValueKind(Type
*Ty
, StringRef TypeQual
,
134 StringRef BaseTypeName
) const;
136 ValueType
getValueType(Type
*Ty
, StringRef TypeName
) const;
138 std::string
getTypeName(Type
*Ty
, bool Signed
) const;
140 std::vector
<uint32_t> getWorkGroupDimensions(MDNode
*Node
) const;
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;
151 void emitPrintf(const Module
&Mod
);
153 void emitKernelLanguage(const Function
&Func
);
155 void emitKernelAttrs(const Function
&Func
);
157 void emitKernelArgs(const Function
&Func
);
159 void emitKernelArg(const Argument
&Arg
);
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
= "");
167 void emitHiddenKernelArgs(const Function
&Func
);
169 const Metadata
&getHSAMetadata() const {
174 MetadataStreamerV2() = default;
175 ~MetadataStreamerV2() = default;
177 bool emitTo(AMDGPUTargetStreamer
&TargetStreamer
) override
;
179 void begin(const Module
&Mod
) override
;
183 void emitKernel(const MachineFunction
&MF
,
184 const SIProgramInfo
&ProgramInfo
) override
;
187 } // end namespace HSAMD
188 } // end namespace AMDGPU
189 } // end namespace llvm
191 #endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUHSAMETADATASTREAMER_H