@@ -187,17 +187,11 @@ void DataAggregator::start() {
187187 findPerfExecutable ();
188188
189189 if (opts::ArmSPE) {
190- if (!opts::BasicAggregation) {
191- // pid from_ip to_ip predicted/missed not-taken?
192- // 12345 0x123/0x456/PN/-/-/8/RET/-
193- launchPerfProcess (" SPE brstack events" , MainEventsPPI,
194- " script -F pid,brstack --itrace=bl" ,
195- /* Wait = */ false );
196- } else {
197- launchPerfProcess (" SPE branch events (non-lbr)" , MainEventsPPI,
198- " script -F pid,event,ip,addr --itrace=i1i" ,
199- /* Wait = */ false );
200- }
190+ // pid from_ip to_ip predicted/missed not-taken?
191+ // 12345 0x123/0x456/PN/-/-/8/RET/-
192+ launchPerfProcess (" SPE brstack events" , MainEventsPPI,
193+ " script -F pid,brstack --itrace=bl" ,
194+ /* Wait = */ false );
201195 } else if (opts::BasicAggregation) {
202196 launchPerfProcess (" events without LBR" , MainEventsPPI,
203197 " script -F pid,event,ip" ,
@@ -472,20 +466,14 @@ int DataAggregator::prepareToParse(StringRef Name, PerfProcessInfo &Process,
472466Error DataAggregator::preprocessProfile (BinaryContext &BC) {
473467 this ->BC = &BC;
474468
475- const Regex NoData (" Samples for '.*' event do not have ADDR attribute set. "
476- " Cannot print 'addr' field." );
477-
478- auto ErrorCallback = [&NoData](int ReturnCode, StringRef ErrBuf) {
479- if (opts::ArmSPE && NoData.match (ErrBuf)) {
480- errs () << " PERF2BOLT-ERROR: perf data are incompatible for Arm SPE mode "
481- " consumption. ADDR attribute is unset.\n " ;
482- exit (1 );
483- }
469+ auto ErrorCallback = [](int ReturnCode, StringRef ErrBuf) {
484470 errs () << " PERF-ERROR: return code " << ReturnCode << " \n " << ErrBuf;
485471 exit (1 );
486472 };
487473
488474 auto MemEventsErrorCallback = [&](int ReturnCode, StringRef ErrBuf) {
475+ Regex NoData (" Samples for '.*' event do not have ADDR attribute set. "
476+ " Cannot print 'addr' field." );
489477 if (!NoData.match (ErrBuf))
490478 ErrorCallback (ReturnCode, ErrBuf);
491479 };
@@ -532,7 +520,6 @@ Error DataAggregator::preprocessProfile(BinaryContext &BC) {
532520 prepareToParse (" events" , MainEventsPPI, ErrorCallback);
533521
534522 if ((!opts::BasicAggregation && parseBranchEvents ()) ||
535- (opts::BasicAggregation && opts::ArmSPE && parseSpeAsBasicEvents ()) ||
536523 (opts::BasicAggregation && parseBasicEvents ()))
537524 errs () << " PERF2BOLT: failed to parse samples\n " ;
538525
@@ -1155,68 +1142,6 @@ ErrorOr<DataAggregator::PerfBasicSample> DataAggregator::parseBasicSample() {
11551142 return PerfBasicSample{Event.get (), Address};
11561143}
11571144
1158- ErrorOr<
1159- std::pair<DataAggregator::PerfBasicSample, DataAggregator::PerfBasicSample>>
1160- DataAggregator::parseSpeAsBasicSamples () {
1161- while (checkAndConsumeFS ()) {
1162- }
1163-
1164- ErrorOr<int64_t > PIDRes = parseNumberField (FieldSeparator, true );
1165- if (std::error_code EC = PIDRes.getError ())
1166- return EC;
1167-
1168- constexpr PerfBasicSample EmptySample = PerfBasicSample{StringRef (), 0 };
1169- auto MMapInfoIter = BinaryMMapInfo.find (*PIDRes);
1170- if (MMapInfoIter == BinaryMMapInfo.end ()) {
1171- consumeRestOfLine ();
1172- return std::make_pair (EmptySample, EmptySample);
1173- }
1174-
1175- while (checkAndConsumeFS ()) {
1176- }
1177-
1178- ErrorOr<StringRef> Event = parseString (FieldSeparator);
1179- if (std::error_code EC = Event.getError ())
1180- return EC;
1181-
1182- while (checkAndConsumeFS ()) {
1183- }
1184-
1185- ErrorOr<uint64_t > AddrResTo = parseHexField (FieldSeparator);
1186- if (std::error_code EC = AddrResTo.getError ())
1187- return EC;
1188-
1189- consumeAllRemainingFS ();
1190-
1191- ErrorOr<uint64_t > AddrResFrom = parseHexField (FieldSeparator, true );
1192- if (std::error_code EC = AddrResFrom.getError ())
1193- return EC;
1194-
1195- if (!checkAndConsumeNewLine ()) {
1196- reportError (" expected end of line" );
1197- return make_error_code (llvm::errc::io_error);
1198- }
1199-
1200- auto genBasicSample = [&](uint64_t Address) {
1201- // When fed with non SPE branch events the target address will be null.
1202- // This is expected and ignored.
1203- if (Address == 0x0 )
1204- return EmptySample;
1205-
1206- if (!BC->HasFixedLoadAddress )
1207- adjustAddress (Address, MMapInfoIter->second );
1208-
1209- return PerfBasicSample{Event.get (), Address};
1210- };
1211-
1212- // Show more meaningful event names on boltdata.
1213- if (Event->str () == " instructions:" )
1214- Event = *AddrResTo != 0x0 ? " branches-spe:" : " instructions-spe:" ;
1215-
1216- return std::make_pair (genBasicSample (*AddrResFrom),
1217- genBasicSample (*AddrResTo));
1218- }
1219-
12201145ErrorOr<DataAggregator::PerfMemSample> DataAggregator::parseMemSample () {
12211146 PerfMemSample Res{0 , 0 };
12221147
@@ -1708,46 +1633,6 @@ std::error_code DataAggregator::parseBasicEvents() {
17081633 return std::error_code ();
17091634}
17101635
1711- std::error_code DataAggregator::parseSpeAsBasicEvents () {
1712- outs () << " PERF2BOLT: parsing SPE data as basic events (no LBR)...\n " ;
1713- NamedRegionTimer T (" parseSPEBasic" , " Parsing SPE as basic events" ,
1714- TimerGroupName, TimerGroupDesc, opts::TimeAggregator);
1715- uint64_t NumSpeBranchSamples = 0 ;
1716-
1717- // Convert entries to one or two basic samples, depending on whether there is
1718- // branch target information.
1719- while (hasData ()) {
1720- auto SamplePair = parseSpeAsBasicSamples ();
1721- if (std::error_code EC = SamplePair.getError ())
1722- return EC;
1723-
1724- auto registerSample = [this ](const PerfBasicSample *Sample) {
1725- if (!Sample->PC )
1726- return ;
1727-
1728- if (BinaryFunction *BF = getBinaryFunctionContainingAddress (Sample->PC ))
1729- BF->setHasProfileAvailable ();
1730-
1731- ++BasicSamples[Sample->PC ];
1732- EventNames.insert (Sample->EventName );
1733- };
1734-
1735- if (SamplePair->first .PC != 0x0 && SamplePair->second .PC != 0x0 )
1736- ++NumSpeBranchSamples;
1737-
1738- registerSample (&SamplePair->first );
1739- registerSample (&SamplePair->second );
1740- }
1741-
1742- if (NumSpeBranchSamples == 0 )
1743- errs () << " PERF2BOLT-WARNING: no SPE branches found\n " ;
1744- else
1745- outs () << " PERF2BOLT: found " << NumSpeBranchSamples
1746- << " SPE branch sample pairs.\n " ;
1747-
1748- return std::error_code ();
1749- }
1750-
17511636void DataAggregator::processBasicEvents () {
17521637 outs () << " PERF2BOLT: processing basic events (without LBR)...\n " ;
17531638 NamedRegionTimer T (" processBasic" , " Processing basic events" , TimerGroupName,
0 commit comments