@@ -1204,77 +1204,106 @@ ErrorOr<Location> DataAggregator::parseLocationOrOffset() {
1204
1204
}
1205
1205
1206
1206
std::error_code DataAggregator::parseAggregatedLBREntry () {
1207
- while (checkAndConsumeFS ()) {
1208
- }
1207
+ enum AggregatedLBREntry : char {
1208
+ INVALID = 0 ,
1209
+ EVENT_NAME, // E
1210
+ TRACE, // T
1211
+ SAMPLE, // S
1212
+ BRANCH, // B
1213
+ FT, // F
1214
+ FT_EXTERNAL_ORIGIN // f
1215
+ } Type = INVALID;
1216
+
1217
+ // The number of fields to parse, set based on Type.
1218
+ int AddrNum = 0 ;
1219
+ int CounterNum = 0 ;
1220
+ // Storage for parsed fields.
1221
+ StringRef EventName;
1222
+ std::optional<Location> Addr[3 ];
1223
+ int64_t Counters[2 ];
1224
+
1225
+ while (Type == INVALID || Type == EVENT_NAME) {
1226
+ while (checkAndConsumeFS ()) {
1227
+ }
1228
+ ErrorOr<StringRef> StrOrErr =
1229
+ parseString (FieldSeparator, Type == EVENT_NAME);
1230
+ if (std::error_code EC = StrOrErr.getError ())
1231
+ return EC;
1232
+ StringRef Str = StrOrErr.get ();
1209
1233
1210
- ErrorOr<StringRef> TypeOrErr = parseString (FieldSeparator);
1211
- if (std::error_code EC = TypeOrErr.getError ())
1212
- return EC;
1213
- enum AggregatedLBREntry { TRACE, BRANCH, FT, FT_EXTERNAL_ORIGIN, INVALID };
1214
- auto Type = StringSwitch<AggregatedLBREntry>(TypeOrErr.get ())
1215
- .Case (" T" , TRACE)
1216
- .Case (" B" , BRANCH)
1217
- .Case (" F" , FT)
1218
- .Case (" f" , FT_EXTERNAL_ORIGIN)
1219
- .Default (INVALID);
1220
- if (Type == INVALID) {
1221
- reportError (" expected T, B, F or f" );
1222
- return make_error_code (llvm::errc::io_error);
1223
- }
1234
+ if (Type == EVENT_NAME) {
1235
+ EventName = Str;
1236
+ break ;
1237
+ }
1224
1238
1225
- while (checkAndConsumeFS ()) {
1226
- }
1227
- ErrorOr<Location> From = parseLocationOrOffset ();
1228
- if (std::error_code EC = From.getError ())
1229
- return EC;
1239
+ Type = StringSwitch<AggregatedLBREntry>(Str)
1240
+ .Case (" T" , TRACE)
1241
+ .Case (" S" , SAMPLE)
1242
+ .Case (" E" , EVENT_NAME)
1243
+ .Case (" B" , BRANCH)
1244
+ .Case (" F" , FT)
1245
+ .Case (" f" , FT_EXTERNAL_ORIGIN)
1246
+ .Default (INVALID);
1247
+
1248
+ if (Type == INVALID) {
1249
+ reportError (" expected T, S, E, B, F or f" );
1250
+ return make_error_code (llvm::errc::io_error);
1251
+ }
1230
1252
1231
- while (checkAndConsumeFS ()) {
1253
+ using SSI = StringSwitch<int >;
1254
+ AddrNum = SSI (Str).Case (" T" , 3 ).Case (" S" , 1 ).Case (" E" , 0 ).Default (2 );
1255
+ CounterNum = SSI (Str).Case (" B" , 2 ).Case (" E" , 0 ).Default (1 );
1232
1256
}
1233
- ErrorOr<Location> To = parseLocationOrOffset ();
1234
- if (std::error_code EC = To.getError ())
1235
- return EC;
1236
1257
1237
- ErrorOr<Location> TraceFtEnd = std::error_code ();
1238
- if (Type == AggregatedLBREntry::TRACE) {
1258
+ for (int I = 0 ; I < AddrNum; ++I) {
1239
1259
while (checkAndConsumeFS ()) {
1240
1260
}
1241
- TraceFtEnd = parseLocationOrOffset ();
1242
- if (std::error_code EC = TraceFtEnd .getError ())
1261
+ ErrorOr<Location> AddrOrErr = parseLocationOrOffset ();
1262
+ if (std::error_code EC = AddrOrErr .getError ())
1243
1263
return EC;
1264
+ Addr[I] = AddrOrErr.get ();
1244
1265
}
1245
1266
1246
- while (checkAndConsumeFS ()) {
1247
- }
1248
- ErrorOr<int64_t > Frequency =
1249
- parseNumberField (FieldSeparator, Type != AggregatedLBREntry::BRANCH);
1250
- if (std::error_code EC = Frequency.getError ())
1251
- return EC;
1252
-
1253
- uint64_t Mispreds = 0 ;
1254
- if (Type == AggregatedLBREntry::BRANCH) {
1267
+ for (int I = 0 ; I < CounterNum; ++I) {
1255
1268
while (checkAndConsumeFS ()) {
1256
1269
}
1257
- ErrorOr<int64_t > MispredsOrErr = parseNumberField (FieldSeparator, true );
1258
- if (std::error_code EC = MispredsOrErr.getError ())
1270
+ ErrorOr<int64_t > CountOrErr =
1271
+ parseNumberField (FieldSeparator, I + 1 == CounterNum);
1272
+ if (std::error_code EC = CountOrErr.getError ())
1259
1273
return EC;
1260
- Mispreds = static_cast < uint64_t >(MispredsOrErr .get () );
1274
+ Counters[I] = CountOrErr .get ();
1261
1275
}
1262
1276
1263
1277
if (!checkAndConsumeNewLine ()) {
1264
1278
reportError (" expected end of line" );
1265
1279
return make_error_code (llvm::errc::io_error);
1266
1280
}
1267
1281
1268
- BinaryFunction *FromFunc = getBinaryFunctionContainingAddress (From->Offset );
1269
- BinaryFunction *ToFunc = getBinaryFunctionContainingAddress (To->Offset );
1282
+ if (Type == EVENT_NAME) {
1283
+ EventNames.insert (EventName);
1284
+ return std::error_code ();
1285
+ }
1270
1286
1271
- for (BinaryFunction *BF : {FromFunc, ToFunc})
1272
- if (BF)
1273
- BF->setHasProfileAvailable ();
1287
+ const uint64_t FromOffset = Addr[0 ]->Offset ;
1288
+ BinaryFunction *FromFunc = getBinaryFunctionContainingAddress (FromOffset);
1289
+ if (FromFunc)
1290
+ FromFunc->setHasProfileAvailable ();
1291
+
1292
+ int64_t Count = Counters[0 ];
1293
+ int64_t Mispreds = Counters[1 ];
1294
+
1295
+ if (Type == SAMPLE) {
1296
+ BasicSamples[FromOffset] += Count;
1297
+ NumTotalSamples += Count;
1298
+ return std::error_code ();
1299
+ }
1274
1300
1275
- uint64_t Count = static_cast <uint64_t >(Frequency.get ());
1301
+ const uint64_t ToOffset = Addr[1 ]->Offset ;
1302
+ BinaryFunction *ToFunc = getBinaryFunctionContainingAddress (ToOffset);
1303
+ if (ToFunc)
1304
+ ToFunc->setHasProfileAvailable ();
1276
1305
1277
- Trace Trace (From-> Offset , To-> Offset );
1306
+ Trace Trace (FromOffset, ToOffset );
1278
1307
// Taken trace
1279
1308
if (Type == TRACE || Type == BRANCH) {
1280
1309
TakenBranchInfo &Info = BranchLBRs[Trace];
@@ -1285,8 +1314,9 @@ std::error_code DataAggregator::parseAggregatedLBREntry() {
1285
1314
}
1286
1315
// Construct fallthrough part of the trace
1287
1316
if (Type == TRACE) {
1288
- Trace.From = To->Offset ;
1289
- Trace.To = TraceFtEnd->Offset ;
1317
+ const uint64_t TraceFtEndOffset = Addr[2 ]->Offset ;
1318
+ Trace.From = ToOffset;
1319
+ Trace.To = TraceFtEndOffset;
1290
1320
Type = FromFunc == ToFunc ? FT : FT_EXTERNAL_ORIGIN;
1291
1321
}
1292
1322
// Add fallthrough trace
0 commit comments