@@ -1204,77 +1204,106 @@ ErrorOr<Location> DataAggregator::parseLocationOrOffset() {
12041204}
12051205
12061206std::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 ();
12091233
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+ }
12241238
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+ }
12301252
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 );
12321256 }
1233- ErrorOr<Location> To = parseLocationOrOffset ();
1234- if (std::error_code EC = To.getError ())
1235- return EC;
12361257
1237- ErrorOr<Location> TraceFtEnd = std::error_code ();
1238- if (Type == AggregatedLBREntry::TRACE) {
1258+ for (int I = 0 ; I < AddrNum; ++I) {
12391259 while (checkAndConsumeFS ()) {
12401260 }
1241- TraceFtEnd = parseLocationOrOffset ();
1242- if (std::error_code EC = TraceFtEnd .getError ())
1261+ ErrorOr<Location> AddrOrErr = parseLocationOrOffset ();
1262+ if (std::error_code EC = AddrOrErr .getError ())
12431263 return EC;
1264+ Addr[I] = AddrOrErr.get ();
12441265 }
12451266
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) {
12551268 while (checkAndConsumeFS ()) {
12561269 }
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 ())
12591273 return EC;
1260- Mispreds = static_cast < uint64_t >(MispredsOrErr .get () );
1274+ Counters[I] = CountOrErr .get ();
12611275 }
12621276
12631277 if (!checkAndConsumeNewLine ()) {
12641278 reportError (" expected end of line" );
12651279 return make_error_code (llvm::errc::io_error);
12661280 }
12671281
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+ }
12701286
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+ }
12741300
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 ();
12761305
1277- Trace Trace (From-> Offset , To-> Offset );
1306+ Trace Trace (FromOffset, ToOffset );
12781307 // Taken trace
12791308 if (Type == TRACE || Type == BRANCH) {
12801309 TakenBranchInfo &Info = BranchLBRs[Trace];
@@ -1285,8 +1314,9 @@ std::error_code DataAggregator::parseAggregatedLBREntry() {
12851314 }
12861315 // Construct fallthrough part of the trace
12871316 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;
12901320 Type = FromFunc == ToFunc ? FT : FT_EXTERNAL_ORIGIN;
12911321 }
12921322 // Add fallthrough trace
0 commit comments