[llvm] [llvm-profgen] Support creating profiles of arbitrary events (PR #99026)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 22 23:48:28 PDT 2024
================
@@ -575,14 +591,54 @@ bool PerfScriptReader::extractLBRStack(TraceStream &TraceIt,
// Skip the leading instruction pointer.
size_t Index = 0;
+
+ StringRef EventName;
+ // Skip a perf event name. This may or may not exist.
+ if (Records.size() > Index && Records[Index].ends_with(":")) {
+ EventName = Records[Index].ltrim().rtrim(':');
+ Index++;
+
+ if (PerfEventFilter.empty()) {
+ WithColor::warning() << "No --perf-event filter was specified, but an "
+ "\"event\" field was found in line "
+ << TraceIt.getLineNumber() << ": "
+ << TraceIt.getCurrentLine() << "\n";
+ } else if (std::find(PerfEventFilter.begin(), PerfEventFilter.end(),
+ EventName) == PerfEventFilter.end()) {
+ TraceIt.advance();
+ return false;
+ }
+
+ } else if (!PerfEventFilter.empty()) {
+ WithColor::warning() << "A --perf-event filter was specified, but no "
+ "\"event\" field found in line "
+ << TraceIt.getLineNumber() << ": "
+ << TraceIt.getCurrentLine() << "\n";
+ }
+
uint64_t LeadingAddr;
- if (!Records.empty() && !Records[0].contains('/')) {
- if (Records[0].getAsInteger(16, LeadingAddr)) {
+ if (Records.size() > Index && !Records[Index].contains('/')) {
+ if (Records[Index].getAsInteger(16, LeadingAddr)) {
WarnInvalidLBR(TraceIt);
TraceIt.advance();
return false;
}
- Index = 1;
+ Index++;
+ }
+
+ // We assume that if we saw an event name we also saw a leading addr.
+ // In other words, LeadingAddr is set if Index is 1 or 2.
+ if (LeadingIPOnly && Index > 0) {
+ // Form a profile only from the sample IP. Do not assume an LBR stack
+ // follows, and ignore it if it does.
+ uint64_t SampleIP = Binary->canonicalizeVirtualAddress(LeadingAddr);
+ bool SampleIPIsInternal = Binary->addressIsCode(SampleIP);
+ if (SampleIPIsInternal) {
+ // Form a half LBR entry where the sample IP is the destination.
+ LBRStack.emplace_back(LBREntry(SampleIP, SampleIP));
----------------
WenleiHe wrote:
This doesn't really fit in LBRStack, instead, it fits CallStack better. All of the special case from `warnInvalidRange` can be avoided if we handle these events as part of `extractCallstack`.
https://github.com/llvm/llvm-project/pull/99026
More information about the llvm-commits
mailing list