mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
665e1fb24b
Summary: This patch implements a `BlockVerifier` type which enforces the invariants of the log structure of FDR mode logs on a per-block basis. This ensures that the data we encounter from an FDR mode log semantically correct (i.e. that records follow the documented "grammar" for FDR mode log records). This is another part of the refactoring of D50441. This is a slightly modified version of rL341628, avoiding the `std::tuple<...>` constructor that is not constexpr in C++11. Reviewers: mboerger, eizan Subscribers: mgorny, hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D51723 llvm-svn: 341769
70 lines
1.9 KiB
C++
70 lines
1.9 KiB
C++
//===- BlockVerifier.h - FDR Block Verifier -------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// An implementation of the RecordVisitor which verifies a sequence of records
|
|
// associated with a block, following the FDR mode log format's specifications.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef LLVM_INCLUDE_LLVM_XRAY_BLOCKVERIFIER_H_
|
|
#define LLVM_INCLUDE_LLVM_XRAY_BLOCKVERIFIER_H_
|
|
|
|
#include "llvm/XRay/FDRRecords.h"
|
|
#include <array>
|
|
#include <bitset>
|
|
|
|
namespace llvm {
|
|
namespace xray {
|
|
|
|
class BlockVerifier : public RecordVisitor {
|
|
public:
|
|
// We force State elements to be size_t, to be used as indices for containers.
|
|
enum class State : std::size_t {
|
|
Unknown,
|
|
BufferExtents,
|
|
NewBuffer,
|
|
WallClockTime,
|
|
PIDEntry,
|
|
NewCPUId,
|
|
TSCWrap,
|
|
CustomEvent,
|
|
Function,
|
|
CallArg,
|
|
EndOfBuffer,
|
|
StateMax,
|
|
};
|
|
|
|
private:
|
|
// We keep track of the current record seen by the verifier.
|
|
State CurrentRecord = State::Unknown;
|
|
|
|
// Transitions the current record to the new record, records an error on
|
|
// invalid transitions.
|
|
Error transition(State To);
|
|
|
|
public:
|
|
Error visit(BufferExtents &) override;
|
|
Error visit(WallclockRecord &) override;
|
|
Error visit(NewCPUIDRecord &) override;
|
|
Error visit(TSCWrapRecord &) override;
|
|
Error visit(CustomEventRecord &) override;
|
|
Error visit(CallArgRecord &) override;
|
|
Error visit(PIDRecord &) override;
|
|
Error visit(NewBufferRecord &) override;
|
|
Error visit(EndBufferRecord &) override;
|
|
Error visit(FunctionRecord &) override;
|
|
|
|
Error verify();
|
|
void reset();
|
|
};
|
|
|
|
} // namespace xray
|
|
} // namespace llvm
|
|
|
|
#endif // LLVM_INCLUDE_LLVM_XRAY_BLOCKVERIFIER_H_
|