25bool MetadataVerifier::verifyScalar(
27 function_ref<
bool(msgpack::DocNode &)> verifyValue) {
30 if (
Node.getKind() != SKind) {
37 StringRef StringValue =
Node.getString();
38 Node.fromString(StringValue);
39 if (
Node.getKind() != SKind)
43 return verifyValue(Node);
47bool MetadataVerifier::verifyInteger(msgpack::DocNode &Node) {
54bool MetadataVerifier::verifyArray(
55 msgpack::DocNode &Node, function_ref<
bool(msgpack::DocNode &)> verifyNode,
56 std::optional<size_t>
Size) {
65bool MetadataVerifier::verifyEntry(
66 msgpack::MapDocNode &MapNode, StringRef Key,
bool Required,
67 function_ref<
bool(msgpack::DocNode &)> verifyNode) {
68 auto Entry = MapNode.find(Key);
69 if (Entry == MapNode.end())
71 return verifyNode(
Entry->second);
74bool MetadataVerifier::verifyScalarEntry(
75 msgpack::MapDocNode &MapNode, StringRef Key,
bool Required,
77 function_ref<
bool(msgpack::DocNode &)> verifyValue) {
78 return verifyEntry(MapNode, Key,
Required,
79 [
this, SKind, verifyValue](msgpack::DocNode &Node) {
80 return verifyScalar(Node, SKind, verifyValue);
84bool MetadataVerifier::verifyIntegerEntry(msgpack::MapDocNode &MapNode,
86 return verifyEntry(MapNode, Key,
Required, [
this](msgpack::DocNode &Node) {
87 return verifyInteger(Node);
91bool MetadataVerifier::verifyKernelArgs(msgpack::DocNode &Node) {
94 auto &ArgsMap =
Node.getMap();
96 if (!verifyScalarEntry(ArgsMap,
".name",
false,
99 if (!verifyScalarEntry(ArgsMap,
".type_name",
false,
102 if (!verifyIntegerEntry(ArgsMap,
".size",
true))
104 if (!verifyIntegerEntry(ArgsMap,
".offset",
true))
107 [](msgpack::DocNode &SNode) {
108 return StringSwitch<bool>(SNode.getString())
109 .Case(
"by_value",
true)
110 .Case(
"global_buffer",
true)
111 .Case(
"dynamic_shared_pointer",
true)
112 .Case(
"sampler",
true)
116 .Case(
"hidden_block_count_x",
true)
117 .Case(
"hidden_block_count_y",
true)
118 .Case(
"hidden_block_count_z",
true)
119 .Case(
"hidden_group_size_x",
true)
120 .Case(
"hidden_group_size_y",
true)
121 .Case(
"hidden_group_size_z",
true)
122 .Case(
"hidden_remainder_x",
true)
123 .Case(
"hidden_remainder_y",
true)
124 .Case(
"hidden_remainder_z",
true)
125 .Case(
"hidden_global_offset_x",
true)
126 .Case(
"hidden_global_offset_y",
true)
127 .Case(
"hidden_global_offset_z",
true)
128 .Case(
"hidden_grid_dims",
true)
129 .Case(
"hidden_none",
true)
130 .Case(
"hidden_printf_buffer",
true)
131 .Case(
"hidden_hostcall_buffer",
true)
132 .Case(
"hidden_heap_v1",
true)
133 .Case(
"hidden_default_queue",
true)
134 .Case(
"hidden_completion_action",
true)
135 .Case(
"hidden_multigrid_sync_arg",
true)
136 .Case(
"hidden_dynamic_lds_size",
true)
137 .Case(
"hidden_private_base",
true)
138 .Case(
"hidden_shared_base",
true)
139 .Case(
"hidden_queue_ptr",
true)
143 if (!verifyIntegerEntry(ArgsMap,
".pointee_align",
false))
145 if (!verifyScalarEntry(ArgsMap,
".address_space",
false,
147 [](msgpack::DocNode &SNode) {
148 return StringSwitch<bool>(SNode.getString())
149 .Case(
"private",
true)
150 .Case(
"global",
true)
151 .Case(
"constant",
true)
153 .Case(
"generic",
true)
154 .Case(
"region",
true)
158 if (!verifyScalarEntry(ArgsMap,
".access",
false,
160 [](msgpack::DocNode &SNode) {
161 return StringSwitch<bool>(SNode.getString())
162 .Case(
"read_only",
true)
163 .Case(
"write_only",
true)
164 .Case(
"read_write",
true)
168 if (!verifyScalarEntry(ArgsMap,
".actual_access",
false,
170 [](msgpack::DocNode &SNode) {
171 return StringSwitch<bool>(SNode.getString())
172 .Case(
"read_only",
true)
173 .Case(
"write_only",
true)
174 .Case(
"read_write",
true)
178 if (!verifyScalarEntry(ArgsMap,
".is_const",
false,
181 if (!verifyScalarEntry(ArgsMap,
".is_restrict",
false,
184 if (!verifyScalarEntry(ArgsMap,
".is_volatile",
false,
187 if (!verifyScalarEntry(ArgsMap,
".is_pipe",
false,
194bool MetadataVerifier::verifyKernel(msgpack::DocNode &Node) {
197 auto &KernelMap =
Node.getMap();
199 if (!verifyScalarEntry(KernelMap,
".name",
true,
202 if (!verifyScalarEntry(KernelMap,
".symbol",
true,
205 if (!verifyScalarEntry(KernelMap,
".language",
false,
207 [](msgpack::DocNode &SNode) {
208 return StringSwitch<bool>(SNode.getString())
209 .Case(
"OpenCL C",
true)
210 .Case(
"OpenCL C++",
true)
213 .Case(
"OpenMP",
true)
214 .Case(
"Assembler",
true)
219 KernelMap,
".language_version",
false, [
this](msgpack::DocNode &Node) {
222 [
this](msgpack::DocNode &Node) {
return verifyInteger(Node); }, 2);
225 if (!verifyEntry(KernelMap,
".args",
false, [
this](msgpack::DocNode &Node) {
226 return verifyArray(Node, [
this](msgpack::DocNode &Node) {
227 return verifyKernelArgs(Node);
231 if (!verifyEntry(KernelMap,
".reqd_workgroup_size",
false,
232 [
this](msgpack::DocNode &Node) {
233 return verifyArray(Node,
234 [
this](msgpack::DocNode &Node) {
235 return verifyInteger(Node);
240 if (!verifyEntry(KernelMap,
".workgroup_size_hint",
false,
241 [
this](msgpack::DocNode &Node) {
242 return verifyArray(Node,
243 [
this](msgpack::DocNode &Node) {
244 return verifyInteger(Node);
249 if (!verifyScalarEntry(KernelMap,
".vec_type_hint",
false,
252 if (!verifyScalarEntry(KernelMap,
".device_enqueue_symbol",
false,
255 if (!verifyIntegerEntry(KernelMap,
".kernarg_segment_size",
true))
257 if (!verifyIntegerEntry(KernelMap,
".group_segment_fixed_size",
true))
259 if (!verifyIntegerEntry(KernelMap,
".private_segment_fixed_size",
true))
261 if (!verifyScalarEntry(KernelMap,
".uses_dynamic_stack",
false,
264 if (!verifyIntegerEntry(KernelMap,
".workgroup_processor_mode",
false))
266 if (!verifyIntegerEntry(KernelMap,
".kernarg_segment_align",
true))
268 if (!verifyIntegerEntry(KernelMap,
".wavefront_size",
true))
270 if (!verifyIntegerEntry(KernelMap,
".sgpr_count",
true))
272 if (!verifyIntegerEntry(KernelMap,
".vgpr_count",
true))
274 if (!verifyIntegerEntry(KernelMap,
".max_flat_workgroup_size",
true))
276 if (!verifyIntegerEntry(KernelMap,
".sgpr_spill_count",
false))
278 if (!verifyIntegerEntry(KernelMap,
".vgpr_spill_count",
false))
280 if (!verifyIntegerEntry(KernelMap,
".uniform_work_group_size",
false))
283 KernelMap,
".cluster_dims",
false, [
this](msgpack::DocNode &Node) {
286 [
this](msgpack::DocNode &Node) {
return verifyInteger(Node); },
295 if (!HSAMetadataRoot.
isMap())
297 auto &RootMap = HSAMetadataRoot.
getMap();
313 if (!verifyEntry(RootMap,
"amdhsa.kernels",
true,
316 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...
NodeAddr< NodeBase * > Node
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.