LLVM: lib/XRay/FDRRecordProducer.cpp Source File (original) (raw)
1
2
3
4
5
6
7
10
11#include
12
13using namespace llvm;
15
16namespace {
17
18
19
20enum MetadataRecordKinds : uint8_t {
21 NewBufferKind,
22 EndOfBufferKind,
23 NewCPUIdKind,
24 TSCWrapKind,
25 WalltimeMarkerKind,
26 CustomEventMarkerKind,
27 CallArgumentKind,
28 BufferExtentsKind,
29 TypedEventMarkerKind,
30 PidKind,
31
32 EnumEndMarker,
33};
34}
35
38
39 if (T >= static_cast<uint8_t>(MetadataRecordKinds::EnumEndMarker))
40 return createStringError(std::make_error_code(std::errc::invalid_argument),
41 "Invalid metadata record type: %d", T);
42 switch (T) {
43 case MetadataRecordKinds::NewBufferKind:
44 return std::make_unique();
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 "
50 "2 of the log.");
51 return std::make_unique();
52 case MetadataRecordKinds::NewCPUIdKind:
53 return std::make_unique();
54 case MetadataRecordKinds::TSCWrapKind:
55 return std::make_unique();
56 case MetadataRecordKinds::WalltimeMarkerKind:
57 return std::make_unique();
58 case MetadataRecordKinds::CustomEventMarkerKind:
59 if (Header.Version >= 5)
60 return std::make_unique();
61 return std::make_unique();
62 case MetadataRecordKinds::CallArgumentKind:
63 return std::make_unique();
64 case MetadataRecordKinds::BufferExtentsKind:
65 return std::make_unique();
66 case MetadataRecordKinds::TypedEventMarkerKind:
67 return std::make_unique();
68 case MetadataRecordKinds::PidKind:
69 return std::make_unique();
70 case MetadataRecordKinds::EnumEndMarker:
72 }
74}
75
77 return FirstByte & 0x01u;
78}
79
81FileBasedRecordProducer::findNextBufferExtent() {
82
83
84 std::unique_ptr R;
85 while (!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);
92
94 auto LoadedType = FirstByte >> 1;
95 if (LoadedType == MetadataRecordKinds::BufferExtentsKind) {
97 if (!MetadataRecordOrErr)
98 return MetadataRecordOrErr.takeError();
99
100 R = std::move(MetadataRecordOrErr.get());
101 RecordInitializer RI(E, OffsetPtr);
102 if (auto Err = R->apply(RI))
103 return std::move(Err);
104 return std::move(R);
105 }
106 }
107 }
108 llvm_unreachable("Must always terminate with either an error or a record.");
109}
110
112
113 std::unique_ptr R;
114
115
116
117
118
119 if (Header.Version >= 3 && CurrentBufferBytes == 0) {
120
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."));
128
129 R = std::move(BufferExtentsOrError.get());
130 assert(R != nullptr);
133 CurrentBufferBytes = BE->size();
134 return std::move(R);
135 }
136
137
138
139
140
141
142
143
144
145
146
147
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);
154
155
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());
168 } else {
169 R = std::make_unique();
170 }
172
173 if (auto Err = R->apply(RI))
174 return std::move(Err);
175
176
177
178
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,
189
190 CurrentBufferBytes -= OffsetPtr - PreReadOffset;
191 }
192 assert(R != nullptr);
193 return std::move(R);
194}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static constexpr bool isMetadataIntroducer(uint8_t FirstByte)
Definition FDRRecordProducer.cpp:76
static Expected< std::unique_ptr< Record > > metadataRecordType(const XRayFileHeader &Header, uint8_t T)
Definition FDRRecordProducer.cpp:37
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...
Definition FDRRecordProducer.cpp:111
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 - 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 - 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 - Return the argument parameter cast to the specified type.