27bool MetadataVerifier::verifyScalar(
 
   29    function_ref<
bool(msgpack::DocNode &)> verifyValue) {
 
   32  if (
Node.getKind() != SKind) {
 
   39    StringRef StringValue = 
Node.getString();
 
   40    Node.fromString(StringValue);
 
   41    if (
Node.getKind() != SKind)
 
   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))
 
  285          KernelMap, 
".cluster_dims", 
false, [
this](msgpack::DocNode &Node) {
 
  288                [
this](msgpack::DocNode &Node) { 
return verifyInteger(Node); },
 
  297  if (!HSAMetadataRoot.
isMap())
 
  299  auto &RootMap = HSAMetadataRoot.
getMap();
 
  315  if (!verifyEntry(RootMap, 
"amdhsa.kernels", 
true,
 
  318                       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.