20enum MetadataRecordKinds :
uint8_t {
26 CustomEventMarkerKind,
39 if (
T >=
static_cast<uint8_t>(MetadataRecordKinds::EnumEndMarker))
41 "Invalid metadata record type: %d",
T);
43 case MetadataRecordKinds::NewBufferKind:
44 return std::make_unique<NewBufferRecord>();
45 case MetadataRecordKinds::EndOfBufferKind:
46 if (Header.Version >= 2)
48 std::make_error_code(std::errc::executable_format_error),
49 "End of buffer records are no longer supported starting version "
51 return std::make_unique<EndBufferRecord>();
52 case MetadataRecordKinds::NewCPUIdKind:
53 return std::make_unique<NewCPUIDRecord>();
54 case MetadataRecordKinds::TSCWrapKind:
55 return std::make_unique<TSCWrapRecord>();
56 case MetadataRecordKinds::WalltimeMarkerKind:
57 return std::make_unique<WallclockRecord>();
58 case MetadataRecordKinds::CustomEventMarkerKind:
59 if (Header.Version >= 5)
60 return std::make_unique<CustomEventRecordV5>();
61 return std::make_unique<CustomEventRecord>();
62 case MetadataRecordKinds::CallArgumentKind:
63 return std::make_unique<CallArgRecord>();
64 case MetadataRecordKinds::BufferExtentsKind:
65 return std::make_unique<BufferExtents>();
66 case MetadataRecordKinds::TypedEventMarkerKind:
67 return std::make_unique<TypedEventRecord>();
68 case MetadataRecordKinds::PidKind:
69 return std::make_unique<PIDRecord>();
70 case MetadataRecordKinds::EnumEndMarker:
77 return FirstByte & 0x01u;
81FileBasedRecordProducer::findNextBufferExtent() {
84 std::unique_ptr<Record>
R;
86 auto PreReadOffset = OffsetPtr;
87 uint8_t FirstByte = E.getU8(&OffsetPtr);
88 if (OffsetPtr == PreReadOffset)
90 std::make_error_code(std::errc::executable_format_error),
91 "Failed reading one byte from offset %" PRId64
".", OffsetPtr);
94 auto LoadedType = FirstByte >> 1;
95 if (LoadedType == MetadataRecordKinds::BufferExtentsKind) {
97 if (!MetadataRecordOrErr)
98 return MetadataRecordOrErr.takeError();
100 R = std::move(MetadataRecordOrErr.get());
101 RecordInitializer RI(E, OffsetPtr);
102 if (
auto Err =
R->apply(RI))
103 return std::move(Err);
108 llvm_unreachable(
"Must always terminate with either an error or a record.");
113 std::unique_ptr<Record> R;
119 if (Header.Version >= 3 && CurrentBufferBytes == 0) {
121 auto BufferExtentsOrError = findNextBufferExtent();
122 if (!BufferExtentsOrError)
124 BufferExtentsOrError.takeError(),
126 std::make_error_code(std::errc::executable_format_error),
127 "Failed to find the next BufferExtents record."));
129 R = std::move(BufferExtentsOrError.get());
133 CurrentBufferBytes = BE->size();
148 auto PreReadOffset = OffsetPtr;
149 uint8_t FirstByte = E.getU8(&OffsetPtr);
150 if (OffsetPtr == PreReadOffset)
152 std::make_error_code(std::errc::executable_format_error),
153 "Failed reading one byte from offset %" PRId64
".", OffsetPtr);
157 auto LoadedType = FirstByte >> 1;
159 if (!MetadataRecordOrErr)
161 MetadataRecordOrErr.takeError(),
163 std::make_error_code(std::errc::executable_format_error),
164 "Encountered an unsupported metadata record (%d) "
165 "at offset %" PRId64
".",
166 LoadedType, PreReadOffset));
167 R = std::move(MetadataRecordOrErr.get());
169 R = std::make_unique<FunctionRecord>();
173 if (
auto Err = R->apply(RI))
174 return std::move(Err);
180 CurrentBufferBytes = BE->size();
181 }
else if (Header.Version >= 3) {
182 if (OffsetPtr - PreReadOffset > CurrentBufferBytes)
184 std::make_error_code(std::errc::executable_format_error),
185 "Buffer over-read at offset %" PRId64
" (over-read by %" PRId64
186 " bytes); Record Type = %s.",
187 OffsetPtr, (OffsetPtr - PreReadOffset) - CurrentBufferBytes,
190 CurrentBufferBytes -= OffsetPtr - PreReadOffset;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static constexpr bool isMetadataIntroducer(uint8_t FirstByte)
static Expected< std::unique_ptr< Record > > metadataRecordType(const XRayFileHeader &Header, uint8_t T)
Tagged union holding either a T or a Error.
Expected< std::unique_ptr< Record > > produce() override
This producer encapsulates the logic for loading a File-backed RecordProducer hidden behind a DataExt...
static LLVM_ABI StringRef kindToString(RecordKind K)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Error joinErrors(Error E1, Error E2)
Concatenate errors.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.