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 #include <array> 18 #include <bitset> 19 20 namespace llvm { 21 namespace xray { 22 23 class BlockVerifier : public RecordVisitor { 24 public: 25 // We force State elements to be size_t, to be used as indices for containers. 26 enum class State : std::size_t { 27 Unknown, 28 BufferExtents, 29 NewBuffer, 30 WallClockTime, 31 PIDEntry, 32 NewCPUId, 33 TSCWrap, 34 CustomEvent, 35 TypedEvent, 36 Function, 37 CallArg, 38 EndOfBuffer, 39 StateMax, 40 }; 41 42 private: 43 // We keep track of the current record seen by the verifier. 44 State CurrentRecord = State::Unknown; 45 46 // Transitions the current record to the new record, records an error on 47 // invalid transitions. 48 Error transition(State To); 49 50 public: 51 Error visit(BufferExtents &) override; 52 Error visit(WallclockRecord &) override; 53 Error visit(NewCPUIDRecord &) override; 54 Error visit(TSCWrapRecord &) override; 55 Error visit(CustomEventRecord &) override; 56 Error visit(CallArgRecord &) override; 57 Error visit(PIDRecord &) override; 58 Error visit(NewBufferRecord &) override; 59 Error visit(EndBufferRecord &) override; 60 Error visit(FunctionRecord &) override; 61 Error visit(CustomEventRecordV5 &) override; 62 Error visit(TypedEventRecord &) override; 63 64 Error verify(); 65 void reset(); 66 }; 67 68 } // namespace xray 69 } // namespace llvm 70 71 #endif // LLVM_XRAY_BLOCKVERIFIER_H 72