summaryrefslogtreecommitdiffstats
path: root/llvm/include/llvm/XRay/FDRRecords.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include/llvm/XRay/FDRRecords.h')
-rw-r--r--llvm/include/llvm/XRay/FDRRecords.h234
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 {
OpenPOWER on IntegriCloud