1 //===- AMDGPUMetadataVerifier.h - MsgPack Types -----------------*- 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 /// This is a verifier for AMDGPU HSA metadata, which can verify both
11 /// well-typed metadata and untyped metadata. When verifying in the non-strict
12 /// mode, untyped metadata is coerced into the correct type if possible.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #ifndef LLVM_BINARYFORMAT_AMDGPUMETADATAVERIFIER_H
17 #define LLVM_BINARYFORMAT_AMDGPUMETADATAVERIFIER_H
18 
19 #include "llvm/ADT/None.h"
20 #include "llvm/ADT/Optional.h"
21 #include "llvm/ADT/STLFunctionalExtras.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/BinaryFormat/MsgPackReader.h"
24 
25 #include <cstddef>
26 
27 namespace llvm {
28 
29 namespace msgpack {
30   class DocNode;
31   class MapDocNode;
32 }
33 
34 namespace AMDGPU {
35 namespace HSAMD {
36 namespace V3 {
37 
38 /// Verifier for AMDGPU HSA metadata.
39 ///
40 /// Operates in two modes:
41 ///
42 /// In strict mode, metadata must already be well-typed.
43 ///
44 /// In non-strict mode, metadata is coerced into expected types when possible.
45 class MetadataVerifier {
46   bool Strict;
47 
48   bool verifyScalar(msgpack::DocNode &Node, msgpack::Type SKind,
49                     function_ref<bool(msgpack::DocNode &)> verifyValue = {});
50   bool verifyInteger(msgpack::DocNode &Node);
51   bool verifyArray(msgpack::DocNode &Node,
52                    function_ref<bool(msgpack::DocNode &)> verifyNode,
53                    Optional<size_t> Size = None);
54   bool verifyEntry(msgpack::MapDocNode &MapNode, StringRef Key, bool Required,
55                    function_ref<bool(msgpack::DocNode &)> verifyNode);
56   bool
57   verifyScalarEntry(msgpack::MapDocNode &MapNode, StringRef Key, bool Required,
58                     msgpack::Type SKind,
59                     function_ref<bool(msgpack::DocNode &)> verifyValue = {});
60   bool verifyIntegerEntry(msgpack::MapDocNode &MapNode, StringRef Key,
61                           bool Required);
62   bool verifyKernelArgs(msgpack::DocNode &Node);
63   bool verifyKernel(msgpack::DocNode &Node);
64 
65 public:
66   /// Construct a MetadataVerifier, specifying whether it will operate in \p
67   /// Strict mode.
68   MetadataVerifier(bool Strict) : Strict(Strict) {}
69 
70   /// Verify given HSA metadata.
71   ///
72   /// \returns True when successful, false when metadata is invalid.
73   bool verify(msgpack::DocNode &HSAMetadataRoot);
74 };
75 
76 } // end namespace V3
77 } // end namespace HSAMD
78 } // end namespace AMDGPU
79 } // end namespace llvm
80 
81 #endif // LLVM_BINARYFORMAT_AMDGPUMETADATAVERIFIER_H
82