Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions llvm/tools/llvm-profgen/PerfReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -654,6 +654,13 @@ void HybridPerfReader::unwindSamples() {
"frame to match.");
}

/// Parse a hex address from \p Str.
static bool parseAddress(StringRef Str, uint64_t &Addr, bool HasPrefix) {
if (Str.consume_front("0x") != HasPrefix)
return true;
return Str.getAsInteger(16, Addr);
}

bool PerfScriptReader::extractLBRStack(TraceStream &TraceIt,
SmallVectorImpl<LBREntry> &LBRStack) {
// The raw format of LBR stack is like:
Expand All @@ -672,7 +679,7 @@ bool PerfScriptReader::extractLBRStack(TraceStream &TraceIt,
size_t Index = 0;
uint64_t LeadingAddr;
if (!Records.empty() && !Records[0].contains('/')) {
if (Records[0].getAsInteger(16, LeadingAddr)) {
if (parseAddress(Records[0], LeadingAddr, false)) {
WarnInvalidLBR(TraceIt);
TraceIt.advance();
return false;
Expand All @@ -694,8 +701,8 @@ bool PerfScriptReader::extractLBRStack(TraceStream &TraceIt,
uint64_t Dst;

// Stop at broken LBR records.
if (Addresses.size() < 2 || Addresses[0].substr(2).getAsInteger(16, Src) ||
Addresses[1].substr(2).getAsInteger(16, Dst)) {
if (Addresses.size() < 2 || parseAddress(Addresses[0], Src, true) ||
parseAddress(Addresses[1], Dst, true)) {
WarnInvalidLBR(TraceIt);
break;
}
Expand Down Expand Up @@ -731,7 +738,7 @@ bool PerfScriptReader::extractCallstack(TraceStream &TraceIt,
while (!TraceIt.isAtEoF() && !TraceIt.getCurrentLine().starts_with(" 0x")) {
StringRef FrameStr = TraceIt.getCurrentLine().ltrim();
uint64_t FrameAddr = 0;
if (FrameStr.getAsInteger(16, FrameAddr)) {
if (parseAddress(FrameStr, FrameAddr, false)) {
// We might parse a non-perf sample line like empty line and comments,
// skip it
TraceIt.advance();
Expand Down Expand Up @@ -1198,7 +1205,7 @@ PerfContent PerfScriptReader::checkPerfScriptType(StringRef FileName) {
// Detect sample with call stack
int32_t Count = 0;
while (!TraceIt.isAtEoF() &&
!TraceIt.getCurrentLine().ltrim().getAsInteger(16, FrameAddr)) {
!parseAddress(TraceIt.getCurrentLine().ltrim(), FrameAddr, false)) {
Count++;
TraceIt.advance();
}
Expand Down
Loading