@@ -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