xref: /freebsd/contrib/llvm-project/llvm/include/llvm/XRay/BlockVerifier.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1 //===- BlockVerifier.h - FDR Block Verifier -------------------------------===//
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 // An implementation of the RecordVisitor which verifies a sequence of records
10 // associated with a block, following the FDR mode log format's specifications.
11 //
12 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_XRAY_BLOCKVERIFIER_H
14 #define LLVM_XRAY_BLOCKVERIFIER_H
15 
16 #include "llvm/XRay/FDRRecords.h"
17 
18 namespace llvm {
19 namespace xray {
20 
21 class BlockVerifier : public RecordVisitor {
22 public:
23   // We force State elements to be size_t, to be used as indices for containers.
24   enum class State : std::size_t {
25     Unknown,
26     BufferExtents,
27     NewBuffer,
28     WallClockTime,
29     PIDEntry,
30     NewCPUId,
31     TSCWrap,
32     CustomEvent,
33     TypedEvent,
34     Function,
35     CallArg,
36     EndOfBuffer,
37     StateMax,
38   };
39 
40 private:
41   // We keep track of the current record seen by the verifier.
42   State CurrentRecord = State::Unknown;
43 
44   // Transitions the current record to the new record, records an error on
45   // invalid transitions.
46   Error transition(State To);
47 
48 public:
49   Error visit(BufferExtents &) override;
50   Error visit(WallclockRecord &) override;
51   Error visit(NewCPUIDRecord &) override;
52   Error visit(TSCWrapRecord &) override;
53   Error visit(CustomEventRecord &) override;
54   Error visit(CallArgRecord &) override;
55   Error visit(PIDRecord &) override;
56   Error visit(NewBufferRecord &) override;
57   Error visit(EndBufferRecord &) override;
58   Error visit(FunctionRecord &) override;
59   Error visit(CustomEventRecordV5 &) override;
60   Error visit(TypedEventRecord &) override;
61 
62   Error verify();
63   void reset();
64 };
65 
66 } // namespace xray
67 } // namespace llvm
68 
69 #endif // LLVM_XRAY_BLOCKVERIFIER_H
70