diff options
Diffstat (limited to 'llvm/include/llvm/XRay/FDRRecords.h')
-rw-r--r-- | llvm/include/llvm/XRay/FDRRecords.h | 234 |
1 files changed, 165 insertions, 69 deletions
diff --git a/llvm/include/llvm/XRay/FDRRecords.h b/llvm/include/llvm/XRay/FDRRecords.h index 9d48332d508..8a84f4d0c1f 100644 --- a/llvm/include/llvm/XRay/FDRRecords.h +++ b/llvm/include/llvm/XRay/FDRRecords.h @@ -14,10 +14,14 @@ #ifndef LLVM_LIB_XRAY_FDRRECORDS_H_ #define LLVM_LIB_XRAY_FDRRECORDS_H_ +#include <cstdint> +#include <string> + +#include "llvm/ADT/StringRef.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/DataExtractor.h" #include "llvm/Support/Error.h" #include "llvm/XRay/XRayRecord.h" -#include <cstdint> namespace llvm { namespace xray { @@ -26,21 +30,37 @@ class RecordVisitor; class RecordInitializer; class Record { -protected: - enum class Type { - Unknown, - Function, - Metadata, +public: + enum class RecordKind { + RK_Metadata, + RK_Metadata_BufferExtents, + RK_Metadata_WallClockTime, + RK_Metadata_NewCPUId, + RK_Metadata_TSCWrap, + RK_Metadata_CustomEvent, + RK_Metadata_CustomEventV5, + RK_Metadata_CallArg, + RK_Metadata_PIDEntry, + RK_Metadata_NewBuffer, + RK_Metadata_EndOfBuffer, + RK_Metadata_TypedEvent, + RK_Metadata_LastMetadata, + RK_Function, }; + static StringRef kindToString(RecordKind K); + +private: + const RecordKind T; + public: Record(const Record &) = delete; Record(Record &&) = delete; Record &operator=(const Record &) = delete; Record &operator=(Record &&) = delete; - Record() = default; + explicit Record(RecordKind T) : T(T) {} - virtual Type type() const = 0; + RecordKind getRecordType() const { return T; } // Each Record should be able to apply an abstract visitor, and choose the // appropriate function in the visitor to invoke, given its own type. @@ -50,10 +70,6 @@ public: }; class MetadataRecord : public Record { -protected: - static constexpr int kMetadataBodySize = 15; - friend class RecordInitializer; - public: enum class MetadataType : unsigned { Unknown, @@ -69,11 +85,22 @@ public: TypedEvent, }; - Type type() const override { return Type::Metadata; } +protected: + static constexpr int kMetadataBodySize = 15; + friend class RecordInitializer; + +private: + const MetadataType MT; - // All metadata records must know to provide the type of their open - // metadata record. - virtual MetadataType metadataType() const = 0; +public: + explicit MetadataRecord(RecordKind T, MetadataType M) : Record(T), MT(M) {} + + static bool classof(const Record *R) { + return R->getRecordType() >= RecordKind::RK_Metadata && + R->getRecordType() <= RecordKind::RK_Metadata_LastMetadata; + } + + MetadataType metadataType() const { return MT; } virtual ~MetadataRecord() = default; }; @@ -86,16 +113,22 @@ class BufferExtents : public MetadataRecord { friend class RecordInitializer; public: - BufferExtents() = default; - explicit BufferExtents(uint64_t S) : MetadataRecord(), Size(S) {} + BufferExtents() + : MetadataRecord(RecordKind::RK_Metadata_BufferExtents, + MetadataType::BufferExtents) {} - MetadataType metadataType() const override { - return MetadataType::BufferExtents; - } + explicit BufferExtents(uint64_t S) + : MetadataRecord(RecordKind::RK_Metadata_BufferExtents, + MetadataType::BufferExtents), + Size(S) {} uint64_t size() const { return Size; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_BufferExtents; + } }; class WallclockRecord : public MetadataRecord { @@ -104,18 +137,23 @@ class WallclockRecord : public MetadataRecord { friend class RecordInitializer; public: - WallclockRecord() = default; - explicit WallclockRecord(uint64_t S, uint32_t N) - : MetadataRecord(), Seconds(S), Nanos(N) {} + WallclockRecord() + : MetadataRecord(RecordKind::RK_Metadata_WallClockTime, + MetadataType::WallClockTime) {} - MetadataType metadataType() const override { - return MetadataType::WallClockTime; - } + explicit WallclockRecord(uint64_t S, uint32_t N) + : MetadataRecord(RecordKind::RK_Metadata_WallClockTime, + MetadataType::WallClockTime), + Seconds(S), Nanos(N) {} uint64_t seconds() const { return Seconds; } uint32_t nanos() const { return Nanos; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_WallClockTime; + } }; class NewCPUIDRecord : public MetadataRecord { @@ -124,16 +162,24 @@ class NewCPUIDRecord : public MetadataRecord { friend class RecordInitializer; public: - NewCPUIDRecord() = default; - NewCPUIDRecord(uint16_t C, uint64_t T) : MetadataRecord(), CPUId(C), TSC(T) {} + NewCPUIDRecord() + : MetadataRecord(RecordKind::RK_Metadata_NewCPUId, + MetadataType::NewCPUId) {} - MetadataType metadataType() const override { return MetadataType::NewCPUId; } + NewCPUIDRecord(uint16_t C, uint64_t T) + : MetadataRecord(RecordKind::RK_Metadata_NewCPUId, + MetadataType::NewCPUId), + CPUId(C), TSC(T) {} uint16_t cpuid() const { return CPUId; } uint64_t tsc() const { return TSC; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_NewCPUId; + } }; class TSCWrapRecord : public MetadataRecord { @@ -141,14 +187,21 @@ class TSCWrapRecord : public MetadataRecord { friend class RecordInitializer; public: - TSCWrapRecord() = default; - explicit TSCWrapRecord(uint64_t B) : MetadataRecord(), BaseTSC(B) {} + TSCWrapRecord() + : MetadataRecord(RecordKind::RK_Metadata_TSCWrap, MetadataType::TSCWrap) { + } - MetadataType metadataType() const override { return MetadataType::TSCWrap; } + explicit TSCWrapRecord(uint64_t B) + : MetadataRecord(RecordKind::RK_Metadata_TSCWrap, MetadataType::TSCWrap), + BaseTSC(B) {} uint64_t tsc() const { return BaseTSC; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_TSCWrap; + } }; class CustomEventRecord : public MetadataRecord { @@ -159,13 +212,14 @@ class CustomEventRecord : public MetadataRecord { friend class RecordInitializer; public: - CustomEventRecord() = default; - explicit CustomEventRecord(uint64_t S, uint64_t T, uint16_t C, std::string D) - : MetadataRecord(), Size(S), TSC(T), CPU(C), Data(std::move(D)) {} + CustomEventRecord() + : MetadataRecord(RecordKind::RK_Metadata_CustomEvent, + MetadataType::CustomEvent) {} - MetadataType metadataType() const override { - return MetadataType::CustomEvent; - } + explicit CustomEventRecord(uint64_t S, uint64_t T, uint16_t C, std::string D) + : MetadataRecord(RecordKind::RK_Metadata_CustomEvent, + MetadataType::CustomEvent), + Size(S), TSC(T), CPU(C), Data(std::move(D)) {} int32_t size() const { return Size; } uint64_t tsc() const { return TSC; } @@ -173,6 +227,10 @@ public: StringRef data() const { return Data; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_CustomEvent; + } }; class CustomEventRecordV5 : public MetadataRecord { @@ -182,19 +240,24 @@ class CustomEventRecordV5 : public MetadataRecord { friend class RecordInitializer; public: - CustomEventRecordV5() = default; - explicit CustomEventRecordV5(int32_t S, int32_t D, std::string P) - : MetadataRecord(), Size(S), Delta(D), Data(std::move(P)) {} + CustomEventRecordV5() + : MetadataRecord(RecordKind::RK_Metadata_CustomEventV5, + MetadataType::CustomEvent) {} - MetadataType metadataType() const override { - return MetadataType::CustomEvent; - } + explicit CustomEventRecordV5(int32_t S, int32_t D, std::string P) + : MetadataRecord(RecordKind::RK_Metadata_CustomEventV5, + MetadataType::CustomEvent), + Size(S), Delta(D), Data(std::move(P)) {} int32_t size() const { return Size; } int32_t delta() const { return Delta; } StringRef data() const { return Data; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_CustomEventV5; + } }; class TypedEventRecord : public MetadataRecord { @@ -205,13 +268,14 @@ class TypedEventRecord : public MetadataRecord { friend class RecordInitializer; public: - TypedEventRecord() = default; - explicit TypedEventRecord(int32_t S, int32_t D, uint16_t E, std::string P) - : MetadataRecord(), Size(S), Delta(D), Data(std::move(P)) {} + TypedEventRecord() + : MetadataRecord(RecordKind::RK_Metadata_TypedEvent, + MetadataType::TypedEvent) {} - MetadataType metadataType() const override { - return MetadataType::TypedEvent; - } + explicit TypedEventRecord(int32_t S, int32_t D, uint16_t E, std::string P) + : MetadataRecord(RecordKind::RK_Metadata_TypedEvent, + MetadataType::TypedEvent), + Size(S), Delta(D), Data(std::move(P)) {} int32_t size() const { return Size; } int32_t delta() const { return Delta; } @@ -219,6 +283,10 @@ public: StringRef data() const { return Data; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_TypedEvent; + } }; class CallArgRecord : public MetadataRecord { @@ -226,14 +294,21 @@ class CallArgRecord : public MetadataRecord { friend class RecordInitializer; public: - CallArgRecord() = default; - explicit CallArgRecord(uint64_t A) : MetadataRecord(), Arg(A) {} + CallArgRecord() + : MetadataRecord(RecordKind::RK_Metadata_CallArg, MetadataType::CallArg) { + } - MetadataType metadataType() const override { return MetadataType::CallArg; } + explicit CallArgRecord(uint64_t A) + : MetadataRecord(RecordKind::RK_Metadata_CallArg, MetadataType::CallArg), + Arg(A) {} uint64_t arg() const { return Arg; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_CallArg; + } }; class PIDRecord : public MetadataRecord { @@ -241,14 +316,22 @@ class PIDRecord : public MetadataRecord { friend class RecordInitializer; public: - PIDRecord() = default; - explicit PIDRecord(int32_t P) : MetadataRecord(), PID(P) {} + PIDRecord() + : MetadataRecord(RecordKind::RK_Metadata_PIDEntry, + MetadataType::PIDEntry) {} - MetadataType metadataType() const override { return MetadataType::PIDEntry; } + explicit PIDRecord(int32_t P) + : MetadataRecord(RecordKind::RK_Metadata_PIDEntry, + MetadataType::PIDEntry), + PID(P) {} int32_t pid() const { return PID; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_PIDEntry; + } }; class NewBufferRecord : public MetadataRecord { @@ -256,25 +339,35 @@ class NewBufferRecord : public MetadataRecord { friend class RecordInitializer; public: - NewBufferRecord() = default; - explicit NewBufferRecord(int32_t T) : MetadataRecord(), TID(T) {} + NewBufferRecord() + : MetadataRecord(RecordKind::RK_Metadata_NewBuffer, + MetadataType::NewBuffer) {} - MetadataType metadataType() const override { return MetadataType::NewBuffer; } + explicit NewBufferRecord(int32_t T) + : MetadataRecord(RecordKind::RK_Metadata_NewBuffer, + MetadataType::NewBuffer), + TID(T) {} int32_t tid() const { return TID; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_NewBuffer; + } }; class EndBufferRecord : public MetadataRecord { public: - EndBufferRecord() = default; - - MetadataType metadataType() const override { - return MetadataType::EndOfBuffer; - } + EndBufferRecord() + : MetadataRecord(RecordKind::RK_Metadata_EndOfBuffer, + MetadataType::EndOfBuffer) {} Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Metadata_EndOfBuffer; + } }; class FunctionRecord : public Record { @@ -286,11 +379,10 @@ class FunctionRecord : public Record { static constexpr unsigned kFunctionRecordSize = 8; public: - FunctionRecord() = default; - explicit FunctionRecord(RecordTypes K, int32_t F, uint32_t D) - : Record(), Kind(K), FuncId(F), Delta(D) {} + FunctionRecord() : Record(RecordKind::RK_Function) {} - Type type() const override { return Type::Function; } + explicit FunctionRecord(RecordTypes K, int32_t F, uint32_t D) + : Record(RecordKind::RK_Function), Kind(K), FuncId(F), Delta(D) {} // A function record is a concrete record type which has a number of common // properties. @@ -299,6 +391,10 @@ public: uint32_t delta() const { return Delta; } Error apply(RecordVisitor &V) override; + + static bool classof(const Record *R) { + return R->getRecordType() == RecordKind::RK_Function; + } }; class RecordVisitor { |