27bool MetadataVerifier::verifyScalar(
29 function_ref<
bool(msgpack::DocNode &)> verifyValue) {
39 StringRef StringValue =
Node.getString();
40 Node.fromString(StringValue);
45 return verifyValue(
Node);
49bool MetadataVerifier::verifyInteger(msgpack::DocNode &
Node) {
56bool MetadataVerifier::verifyArray(
57 msgpack::DocNode &
Node, function_ref<
bool(msgpack::DocNode &)> verifyNode,
58 std::optional<size_t>
Size) {
67bool MetadataVerifier::verifyEntry(
68 msgpack::MapDocNode &MapNode, StringRef Key,
bool Required,
69 function_ref<
bool(msgpack::DocNode &)> verifyNode) {
70 auto Entry = MapNode.find(Key);
71 if (Entry == MapNode.end())
73 return verifyNode(
Entry->second);
76bool MetadataVerifier::verifyScalarEntry(
77 msgpack::MapDocNode &MapNode, StringRef Key,
bool Required,
79 function_ref<
bool(msgpack::DocNode &)> verifyValue) {
80 return verifyEntry(MapNode, Key,
Required,
81 [
this, SKind, verifyValue](msgpack::DocNode &
Node) {
82 return verifyScalar(
Node, SKind, verifyValue);
86bool MetadataVerifier::verifyIntegerEntry(msgpack::MapDocNode &MapNode,
88 return verifyEntry(MapNode, Key,
Required, [
this](msgpack::DocNode &
Node) {
89 return verifyInteger(
Node);
93bool MetadataVerifier::verifyKernelArgs(msgpack::DocNode &
Node) {
96 auto &ArgsMap =
Node.getMap();
98 if (!verifyScalarEntry(ArgsMap,
".name",
false,
101 if (!verifyScalarEntry(ArgsMap,
".type_name",
false,
104 if (!verifyIntegerEntry(ArgsMap,
".size",
true))
106 if (!verifyIntegerEntry(ArgsMap,
".offset",
true))
109 [](msgpack::DocNode &SNode) {
110 return StringSwitch<bool>(SNode.getString())
111 .Case(
"by_value",
true)
112 .Case(
"global_buffer",
true)
113 .Case(
"dynamic_shared_pointer",
true)
114 .Case(
"sampler",
true)
118 .Case(
"hidden_block_count_x",
true)
119 .Case(
"hidden_block_count_y",
true)
120 .Case(
"hidden_block_count_z",
true)
121 .Case(
"hidden_group_size_x",
true)
122 .Case(
"hidden_group_size_y",
true)
123 .Case(
"hidden_group_size_z",
true)
124 .Case(
"hidden_remainder_x",
true)
125 .Case(
"hidden_remainder_y",
true)
126 .Case(
"hidden_remainder_z",
true)
127 .Case(
"hidden_global_offset_x",
true)
128 .Case(
"hidden_global_offset_y",
true)
129 .Case(
"hidden_global_offset_z",
true)
130 .Case(
"hidden_grid_dims",
true)
131 .Case(
"hidden_none",
true)
132 .Case(
"hidden_printf_buffer",
true)
133 .Case(
"hidden_hostcall_buffer",
true)
134 .Case(
"hidden_heap_v1",
true)
135 .Case(
"hidden_default_queue",
true)
136 .Case(
"hidden_completion_action",
true)
137 .Case(
"hidden_multigrid_sync_arg",
true)
138 .Case(
"hidden_dynamic_lds_size",
true)
139 .Case(
"hidden_private_base",
true)
140 .Case(
"hidden_shared_base",
true)
141 .Case(
"hidden_queue_ptr",
true)
145 if (!verifyIntegerEntry(ArgsMap,
".pointee_align",
false))
147 if (!verifyScalarEntry(ArgsMap,
".address_space",
false,
149 [](msgpack::DocNode &SNode) {
150 return StringSwitch<bool>(SNode.getString())
151 .Case(
"private",
true)
152 .Case(
"global",
true)
153 .Case(
"constant",
true)
155 .Case(
"generic",
true)
156 .Case(
"region",
true)
160 if (!verifyScalarEntry(ArgsMap,
".access",
false,
162 [](msgpack::DocNode &SNode) {
163 return StringSwitch<bool>(SNode.getString())
164 .Case(
"read_only",
true)
165 .Case(
"write_only",
true)
166 .Case(
"read_write",
true)
170 if (!verifyScalarEntry(ArgsMap,
".actual_access",
false,
172 [](msgpack::DocNode &SNode) {
173 return StringSwitch<bool>(SNode.getString())
174 .Case(
"read_only",
true)
175 .Case(
"write_only",
true)
176 .Case(
"read_write",
true)
180 if (!verifyScalarEntry(ArgsMap,
".is_const",
false,
183 if (!verifyScalarEntry(ArgsMap,
".is_restrict",
false,
186 if (!verifyScalarEntry(ArgsMap,
".is_volatile",
false,
189 if (!verifyScalarEntry(ArgsMap,
".is_pipe",
false,
196bool MetadataVerifier::verifyKernel(msgpack::DocNode &
Node) {
199 auto &KernelMap =
Node.getMap();
201 if (!verifyScalarEntry(KernelMap,
".name",
true,
204 if (!verifyScalarEntry(KernelMap,
".symbol",
true,
207 if (!verifyScalarEntry(KernelMap,
".language",
false,
209 [](msgpack::DocNode &SNode) {
210 return StringSwitch<bool>(SNode.getString())
211 .Case(
"OpenCL C",
true)
212 .Case(
"OpenCL C++",
true)
215 .Case(
"OpenMP",
true)
216 .Case(
"Assembler",
true)
221 KernelMap,
".language_version",
false, [
this](msgpack::DocNode &
Node) {
224 [
this](msgpack::DocNode &
Node) {
return verifyInteger(
Node); }, 2);
227 if (!verifyEntry(KernelMap,
".args",
false, [
this](msgpack::DocNode &
Node) {
228 return verifyArray(
Node, [
this](msgpack::DocNode &
Node) {
229 return verifyKernelArgs(
Node);
233 if (!verifyEntry(KernelMap,
".reqd_workgroup_size",
false,
234 [
this](msgpack::DocNode &
Node) {
235 return verifyArray(
Node,
236 [
this](msgpack::DocNode &
Node) {
237 return verifyInteger(
Node);
242 if (!verifyEntry(KernelMap,
".workgroup_size_hint",
false,
243 [
this](msgpack::DocNode &
Node) {
244 return verifyArray(
Node,
245 [
this](msgpack::DocNode &
Node) {
246 return verifyInteger(
Node);
251 if (!verifyScalarEntry(KernelMap,
".vec_type_hint",
false,
254 if (!verifyScalarEntry(KernelMap,
".device_enqueue_symbol",
false,
257 if (!verifyIntegerEntry(KernelMap,
".kernarg_segment_size",
true))
259 if (!verifyIntegerEntry(KernelMap,
".group_segment_fixed_size",
true))
261 if (!verifyIntegerEntry(KernelMap,
".private_segment_fixed_size",
true))
263 if (!verifyScalarEntry(KernelMap,
".uses_dynamic_stack",
false,
266 if (!verifyIntegerEntry(KernelMap,
".workgroup_processor_mode",
false))
268 if (!verifyIntegerEntry(KernelMap,
".kernarg_segment_align",
true))
270 if (!verifyIntegerEntry(KernelMap,
".wavefront_size",
true))
272 if (!verifyIntegerEntry(KernelMap,
".sgpr_count",
true))
274 if (!verifyIntegerEntry(KernelMap,
".vgpr_count",
true))
276 if (!verifyIntegerEntry(KernelMap,
".max_flat_workgroup_size",
true))
278 if (!verifyIntegerEntry(KernelMap,
".sgpr_spill_count",
false))
280 if (!verifyIntegerEntry(KernelMap,
".vgpr_spill_count",
false))
282 if (!verifyIntegerEntry(KernelMap,
".uniform_work_group_size",
false))
290 if (!HSAMetadataRoot.
isMap())
292 auto &RootMap = HSAMetadataRoot.
getMap();
308 if (!verifyEntry(RootMap,
"amdhsa.kernels",
true,
311 return verifyKernel(
Node);
This file declares a class that exposes a simple in-memory representation of a document of MsgPack ob...
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
A node in a MsgPack Document.
MapDocNode & getMap(bool Convert=false)
Get a MapDocNode for a map node.
Type
MessagePack types as defined in the standard, with the exception of Integer being divided into a sign...
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.