@@ -181,17 +181,11 @@ void DataAggregator::start() {
181
181
findPerfExecutable ();
182
182
183
183
if (opts::ArmSPE) {
184
- if (!opts::BasicAggregation) {
185
- // pid from_ip to_ip predicted/missed not-taken?
186
- // 12345 0x123/0x456/PN/-/-/8/RET/-
187
- launchPerfProcess (" SPE brstack events" , MainEventsPPI,
188
- " script -F pid,brstack --itrace=bl" ,
189
- /* Wait = */ false );
190
- } else {
191
- launchPerfProcess (" SPE branch events (non-lbr)" , MainEventsPPI,
192
- " script -F pid,event,ip,addr --itrace=i1i" ,
193
- /* Wait = */ false );
194
- }
184
+ // pid from_ip to_ip predicted/missed not-taken?
185
+ // 12345 0x123/0x456/PN/-/-/8/RET/-
186
+ launchPerfProcess (" SPE brstack events" , MainEventsPPI,
187
+ " script -F pid,brstack --itrace=bl" ,
188
+ /* Wait = */ false );
195
189
} else if (opts::BasicAggregation) {
196
190
launchPerfProcess (" events without LBR" , MainEventsPPI,
197
191
" script -F pid,event,ip" ,
@@ -464,20 +458,14 @@ int DataAggregator::prepareToParse(StringRef Name, PerfProcessInfo &Process,
464
458
Error DataAggregator::preprocessProfile (BinaryContext &BC) {
465
459
this ->BC = &BC;
466
460
467
- const Regex NoData (" Samples for '.*' event do not have ADDR attribute set. "
468
- " Cannot print 'addr' field." );
469
-
470
- auto ErrorCallback = [&NoData](int ReturnCode, StringRef ErrBuf) {
471
- if (opts::ArmSPE && NoData.match (ErrBuf)) {
472
- errs () << " PERF2BOLT-ERROR: perf data are incompatible for Arm SPE mode "
473
- " consumption. ADDR attribute is unset.\n " ;
474
- exit (1 );
475
- }
461
+ auto ErrorCallback = [](int ReturnCode, StringRef ErrBuf) {
476
462
errs () << " PERF-ERROR: return code " << ReturnCode << " \n " << ErrBuf;
477
463
exit (1 );
478
464
};
479
465
480
466
auto MemEventsErrorCallback = [&](int ReturnCode, StringRef ErrBuf) {
467
+ Regex NoData (" Samples for '.*' event do not have ADDR attribute set. "
468
+ " Cannot print 'addr' field." );
481
469
if (!NoData.match (ErrBuf))
482
470
ErrorCallback (ReturnCode, ErrBuf);
483
471
};
@@ -524,7 +512,6 @@ Error DataAggregator::preprocessProfile(BinaryContext &BC) {
524
512
prepareToParse (" events" , MainEventsPPI, ErrorCallback);
525
513
526
514
if ((!opts::BasicAggregation && parseBranchEvents ()) ||
527
- (opts::BasicAggregation && opts::ArmSPE && parseSpeAsBasicEvents ()) ||
528
515
(opts::BasicAggregation && parseBasicEvents ()))
529
516
errs () << " PERF2BOLT: failed to parse samples\n " ;
530
517
@@ -1163,68 +1150,6 @@ ErrorOr<DataAggregator::PerfBasicSample> DataAggregator::parseBasicSample() {
1163
1150
return PerfBasicSample{Event.get (), Address};
1164
1151
}
1165
1152
1166
- ErrorOr<
1167
- std::pair<DataAggregator::PerfBasicSample, DataAggregator::PerfBasicSample>>
1168
- DataAggregator::parseSpeAsBasicSamples () {
1169
- while (checkAndConsumeFS ()) {
1170
- }
1171
-
1172
- ErrorOr<int64_t > PIDRes = parseNumberField (FieldSeparator, true );
1173
- if (std::error_code EC = PIDRes.getError ())
1174
- return EC;
1175
-
1176
- constexpr PerfBasicSample EmptySample = PerfBasicSample{StringRef (), 0 };
1177
- auto MMapInfoIter = BinaryMMapInfo.find (*PIDRes);
1178
- if (MMapInfoIter == BinaryMMapInfo.end ()) {
1179
- consumeRestOfLine ();
1180
- return std::make_pair (EmptySample, EmptySample);
1181
- }
1182
-
1183
- while (checkAndConsumeFS ()) {
1184
- }
1185
-
1186
- ErrorOr<StringRef> Event = parseString (FieldSeparator);
1187
- if (std::error_code EC = Event.getError ())
1188
- return EC;
1189
-
1190
- while (checkAndConsumeFS ()) {
1191
- }
1192
-
1193
- ErrorOr<uint64_t > AddrResTo = parseHexField (FieldSeparator);
1194
- if (std::error_code EC = AddrResTo.getError ())
1195
- return EC;
1196
-
1197
- consumeAllRemainingFS ();
1198
-
1199
- ErrorOr<uint64_t > AddrResFrom = parseHexField (FieldSeparator, true );
1200
- if (std::error_code EC = AddrResFrom.getError ())
1201
- return EC;
1202
-
1203
- if (!checkAndConsumeNewLine ()) {
1204
- reportError (" expected end of line" );
1205
- return make_error_code (llvm::errc::io_error);
1206
- }
1207
-
1208
- auto genBasicSample = [&](uint64_t Address) {
1209
- // When fed with non SPE branch events the target address will be null.
1210
- // This is expected and ignored.
1211
- if (Address == 0x0 )
1212
- return EmptySample;
1213
-
1214
- if (!BC->HasFixedLoadAddress )
1215
- adjustAddress (Address, MMapInfoIter->second );
1216
-
1217
- return PerfBasicSample{Event.get (), Address};
1218
- };
1219
-
1220
- // Show more meaningful event names on boltdata.
1221
- if (Event->str () == " instructions:" )
1222
- Event = *AddrResTo != 0x0 ? " branches-spe:" : " instructions-spe:" ;
1223
-
1224
- return std::make_pair (genBasicSample (*AddrResFrom),
1225
- genBasicSample (*AddrResTo));
1226
- }
1227
-
1228
1153
ErrorOr<DataAggregator::PerfMemSample> DataAggregator::parseMemSample () {
1229
1154
PerfMemSample Res{0 , 0 };
1230
1155
@@ -1734,46 +1659,6 @@ std::error_code DataAggregator::parseBasicEvents() {
1734
1659
return std::error_code ();
1735
1660
}
1736
1661
1737
- std::error_code DataAggregator::parseSpeAsBasicEvents () {
1738
- outs () << " PERF2BOLT: parsing SPE data as basic events (no LBR)...\n " ;
1739
- NamedRegionTimer T (" parseSPEBasic" , " Parsing SPE as basic events" ,
1740
- TimerGroupName, TimerGroupDesc, opts::TimeAggregator);
1741
- uint64_t NumSpeBranchSamples = 0 ;
1742
-
1743
- // Convert entries to one or two basic samples, depending on whether there is
1744
- // branch target information.
1745
- while (hasData ()) {
1746
- auto SamplePair = parseSpeAsBasicSamples ();
1747
- if (std::error_code EC = SamplePair.getError ())
1748
- return EC;
1749
-
1750
- auto registerSample = [this ](const PerfBasicSample *Sample) {
1751
- if (!Sample->PC )
1752
- return ;
1753
-
1754
- if (BinaryFunction *BF = getBinaryFunctionContainingAddress (Sample->PC ))
1755
- BF->setHasProfileAvailable ();
1756
-
1757
- ++BasicSamples[Sample->PC ];
1758
- EventNames.insert (Sample->EventName );
1759
- };
1760
-
1761
- if (SamplePair->first .PC != 0x0 && SamplePair->second .PC != 0x0 )
1762
- ++NumSpeBranchSamples;
1763
-
1764
- registerSample (&SamplePair->first );
1765
- registerSample (&SamplePair->second );
1766
- }
1767
-
1768
- if (NumSpeBranchSamples == 0 )
1769
- errs () << " PERF2BOLT-WARNING: no SPE branches found\n " ;
1770
- else
1771
- outs () << " PERF2BOLT: found " << NumSpeBranchSamples
1772
- << " SPE branch sample pairs.\n " ;
1773
-
1774
- return std::error_code ();
1775
- }
1776
-
1777
1662
void DataAggregator::processBasicEvents () {
1778
1663
outs () << " PERF2BOLT: processing basic events (without LBR)...\n " ;
1779
1664
NamedRegionTimer T (" processBasic" , " Processing basic events" , TimerGroupName,
0 commit comments