@@ -1210,85 +1210,105 @@ ErrorOr<Location> DataAggregator::parseLocationOrOffset() {
12101210}
12111211
12121212std::error_code DataAggregator::parseAggregatedLBREntry () {
1213- while (checkAndConsumeFS ()) {
1214- }
1213+ enum AggregatedLBREntry : char {
1214+ INVALID = 0 ,
1215+ EVENT_NAME, // E
1216+ TRACE, // T
1217+ SAMPLE, // S
1218+ BRANCH, // B
1219+ FT, // F
1220+ FT_EXTERNAL_ORIGIN // f
1221+ } Type = INVALID;
1222+
1223+ // The number of fields to parse, set based on Type.
1224+ int AddrNum = 0 ;
1225+ int CounterNum = 0 ;
1226+ // Storage for parsed fields.
1227+ StringRef EventName;
1228+ std::optional<Location> Addr[3 ];
1229+ int64_t Counters[2 ];
12151230
1216- ErrorOr<StringRef> TypeOrErr = parseString (FieldSeparator);
1217- if (std::error_code EC = TypeOrErr.getError ())
1218- return EC;
1219- enum AggregatedLBREntry {
1220- TRACE,
1221- SAMPLE,
1222- BRANCH,
1223- FT,
1224- FT_EXTERNAL_ORIGIN,
1225- INVALID
1226- };
1227- auto Type = StringSwitch<AggregatedLBREntry>(TypeOrErr.get ())
1228- .Case (" T" , TRACE)
1229- .Case (" S" , SAMPLE)
1230- .Case (" B" , BRANCH)
1231- .Case (" F" , FT)
1232- .Case (" f" , FT_EXTERNAL_ORIGIN)
1233- .Default (INVALID);
1234- if (Type == INVALID) {
1235- reportError (" expected T, S, B, F or f" );
1236- return make_error_code (llvm::errc::io_error);
1237- }
1231+ while (Type == INVALID || Type == EVENT_NAME) {
1232+ while (checkAndConsumeFS ()) {
1233+ }
1234+ ErrorOr<StringRef> StrOrErr =
1235+ parseString (FieldSeparator, Type == EVENT_NAME);
1236+ if (std::error_code EC = StrOrErr.getError ())
1237+ return EC;
1238+ StringRef Str = StrOrErr.get ();
12381239
1239- std::optional<Location> Addrs[3 ];
1240- int AddrNum = 2 ;
1241- if (Type == TRACE)
1242- AddrNum = 3 ;
1243- else if (Type == SAMPLE)
1244- AddrNum = 1 ;
1240+ if (Type == EVENT_NAME) {
1241+ EventName = Str;
1242+ break ;
1243+ }
12451244
1246- int64_t Counters[2 ];
1247- int CounterNum = 1 ;
1248- if (Type == BRANCH)
1249- CounterNum = 2 ;
1245+ Type = StringSwitch<AggregatedLBREntry>(Str)
1246+ .Case (" T" , TRACE)
1247+ .Case (" S" , SAMPLE)
1248+ .Case (" E" , EVENT_NAME)
1249+ .Case (" B" , BRANCH)
1250+ .Case (" F" , FT)
1251+ .Case (" f" , FT_EXTERNAL_ORIGIN)
1252+ .Default (INVALID);
1253+
1254+ if (Type == INVALID) {
1255+ reportError (" expected T, S, E, B, F or f" );
1256+ return make_error_code (llvm::errc::io_error);
1257+ }
1258+
1259+ using SSI = StringSwitch<int >;
1260+ AddrNum = SSI (Str).Case (" T" , 3 ).Case (" S" , 1 ).Case (" E" , 0 ).Default (2 );
1261+ CounterNum = SSI (Str).Case (" B" , 2 ).Case (" E" , 0 ).Default (1 );
1262+ }
12501263
12511264 for (int I = 0 ; I < AddrNum; ++I) {
12521265 while (checkAndConsumeFS ()) {
12531266 }
1254- if ( ErrorOr<Location> Addr = parseLocationOrOffset ())
1255- Addrs[I] = Addr. get ();
1256- else
1257- return Addr. getError ();
1267+ ErrorOr<Location> AddrOrErr = parseLocationOrOffset ();
1268+ if (std::error_code EC = AddrOrErr. getError ())
1269+ return EC;
1270+ Addr[I] = AddrOrErr. get ();
12581271 }
12591272
12601273 for (int I = 0 ; I < CounterNum; ++I) {
12611274 while (checkAndConsumeFS ()) {
12621275 }
1263- if (ErrorOr<int64_t > Count = parseNumberField (FieldSeparator, I + 1 == CounterNum))
1264- Counters[I] = Count.get ();
1265- else
1266- return Count.getError ();
1276+ ErrorOr<int64_t > CountOrErr =
1277+ parseNumberField (FieldSeparator, I + 1 == CounterNum);
1278+ if (std::error_code EC = CountOrErr.getError ())
1279+ return EC;
1280+ Counters[I] = CountOrErr.get ();
12671281 }
12681282
12691283 if (!checkAndConsumeNewLine ()) {
12701284 reportError (" expected end of line" );
12711285 return make_error_code (llvm::errc::io_error);
12721286 }
12731287
1274- const uint64_t FromOffset = Addrs[0 ]->Offset ;
1288+ if (Type == EVENT_NAME) {
1289+ EventNames.insert (EventName);
1290+ return std::error_code ();
1291+ }
1292+
1293+ const uint64_t FromOffset = Addr[0 ]->Offset ;
12751294 BinaryFunction *FromFunc = getBinaryFunctionContainingAddress (FromOffset);
12761295 if (FromFunc)
12771296 FromFunc->setHasProfileAvailable ();
12781297
1298+ int64_t Count = Counters[0 ];
1299+ int64_t Mispreds = Counters[1 ];
1300+
12791301 if (Type == SAMPLE) {
1280- BasicSamples[FromOffset] += Counters[0 ];
1302+ BasicSamples[FromOffset] += Count;
1303+ NumTotalSamples += Count;
12811304 return std::error_code ();
12821305 }
12831306
1284- const uint64_t ToOffset = Addrs [1 ]->Offset ;
1307+ const uint64_t ToOffset = Addr [1 ]->Offset ;
12851308 BinaryFunction *ToFunc = getBinaryFunctionContainingAddress (ToOffset);
12861309 if (ToFunc)
12871310 ToFunc->setHasProfileAvailable ();
12881311
1289- int64_t Count = Counters[0 ];
1290- int64_t Mispreds = Counters[1 ];
1291-
12921312 Trace Trace (FromOffset, ToOffset);
12931313 // Taken trace
12941314 if (Type == TRACE || Type == BRANCH) {
@@ -1300,7 +1320,7 @@ std::error_code DataAggregator::parseAggregatedLBREntry() {
13001320 }
13011321 // Construct fallthrough part of the trace
13021322 if (Type == TRACE) {
1303- const uint64_t TraceFtEndOffset = Addrs [2 ]->Offset ;
1323+ const uint64_t TraceFtEndOffset = Addr [2 ]->Offset ;
13041324 Trace.From = ToOffset;
13051325 Trace.To = TraceFtEndOffset;
13061326 Type = FromFunc == ToFunc ? FT : FT_EXTERNAL_ORIGIN;
0 commit comments