Skip to content

Commit

Permalink
[CSSPGO][llvm-profgen] Fix bug with parsing hybrid sample trace line
Browse files Browse the repository at this point in the history
when we skip the call stack starting with an external address, we should also skip the bottom LBR entry, otherwise it will cause a truncated context issue.

Reviewed By: hoy, wenlei

Differential Revision: https://reviews.llvm.org/D95480
  • Loading branch information
wlei-llvm committed Feb 5, 2021
1 parent 4737aab commit dd9e219
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
PERF_RECORD_MMAP2 2854748/2854748: [0x400000(0x1000) @ 0 00:1d 123291722 526021]: r-xp /home/inline-cs-noprobe.perfbin

; test for an external or invalid top address, should skip the whole sample

ffffffff
40067e
5541f689495641d7
0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x40069b/0x400670/M/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0 0x4006c8/0x40067e/P/-/-/0

40067e
5541f689495641d7
Expand Down
12 changes: 7 additions & 5 deletions llvm/tools/llvm-profgen/PerfReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -437,11 +437,12 @@ bool PerfReader::extractCallstack(TraceStream &TraceIt,
ProfiledBinary *Binary = nullptr;
while (!TraceIt.isAtEoF() && !TraceIt.getCurrentLine().startswith(" 0x")) {
StringRef FrameStr = TraceIt.getCurrentLine().ltrim();
// We might get an empty line at the beginning or comments, skip it
uint64_t FrameAddr = 0;
if (FrameStr.getAsInteger(16, FrameAddr)) {
// We might parse a non-perf sample line like empty line and comments,
// skip it
TraceIt.advance();
break;
return false;
}
TraceIt.advance();
if (!Binary) {
Expand All @@ -468,9 +469,9 @@ bool PerfReader::extractCallstack(TraceStream &TraceIt,
CallStack.emplace_back(FrameAddr);
}

if (CallStack.empty())
return false;
// Skip other unrelated line, find the next valid LBR line
// Note that even for empty call stack, we should skip the address at the
// bottom, otherwise the following pass may generate a truncated callstack
while (!TraceIt.isAtEoF() && !TraceIt.getCurrentLine().startswith(" 0x")) {
TraceIt.advance();
}
Expand All @@ -482,7 +483,8 @@ bool PerfReader::extractCallstack(TraceStream &TraceIt,
// of such case - when sample landed in prolog/epilog, somehow stack
// walking will be broken in an unexpected way that higher frames will be
// missing.
return !Binary->addressInPrologEpilog(CallStack.front());
return !CallStack.empty() &&
!Binary->addressInPrologEpilog(CallStack.front());
}

void PerfReader::parseHybridSample(TraceStream &TraceIt) {
Expand Down

0 comments on commit dd9e219

Please sign in to comment.