Skip to content

Commit 86ec59e

Browse files
authored
[BOLT] Only parse probes for profiled functions in profile-write-pseudo-probes mode (llvm#106365)
Implement selective probe parsing for profiled functions only when emitting probe information to YAML profile as suggested in llvm#102904 (review) For a large binary, this reduces probe parsing - processing time from 10.5925s to 5.6295s, - peak RSS from 10.54 to 7.98 GiB.
1 parent c820bd3 commit 86ec59e

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

bolt/lib/Rewrite/PseudoProbeRewriter.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ class PseudoProbeRewriter final : public MetadataRewriter {
7272

7373
/// Parse .pseudo_probe_desc section and .pseudo_probe section
7474
/// Setup Pseudo probe decoder
75-
void parsePseudoProbe();
75+
/// If \p ProfiledOnly is set, only parse records for functions with profile.
76+
void parsePseudoProbe(bool ProfiledOnly = false);
7677

7778
/// PseudoProbe decoder
7879
std::shared_ptr<MCPseudoProbeDecoder> ProbeDecoderPtr;
@@ -92,7 +93,7 @@ class PseudoProbeRewriter final : public MetadataRewriter {
9293

9394
Error PseudoProbeRewriter::preCFGInitializer() {
9495
if (opts::ProfileWritePseudoProbes)
95-
parsePseudoProbe();
96+
parsePseudoProbe(true);
9697

9798
return Error::success();
9899
}
@@ -105,7 +106,7 @@ Error PseudoProbeRewriter::postEmitFinalizer() {
105106
return Error::success();
106107
}
107108

108-
void PseudoProbeRewriter::parsePseudoProbe() {
109+
void PseudoProbeRewriter::parsePseudoProbe(bool ProfiledOnly) {
109110
MCPseudoProbeDecoder &ProbeDecoder(*ProbeDecoderPtr);
110111
PseudoProbeDescSection = BC.getUniqueSectionByName(".pseudo_probe_desc");
111112
PseudoProbeSection = BC.getUniqueSectionByName(".pseudo_probe");
@@ -137,6 +138,7 @@ void PseudoProbeRewriter::parsePseudoProbe() {
137138
SmallVector<StringRef, 0> Suffixes(
138139
{".destroy", ".resume", ".llvm.", ".cold", ".warm"});
139140
for (const BinaryFunction *F : BC.getAllBinaryFunctions()) {
141+
bool HasProfile = F->hasProfileAvailable();
140142
for (const MCSymbol *Sym : F->getSymbols()) {
141143
StringRef SymName = Sym->getName();
142144
for (auto Name : {std::optional(NameResolver::restore(SymName)),
@@ -146,6 +148,8 @@ void PseudoProbeRewriter::parsePseudoProbe() {
146148
SymName = *Name;
147149
uint64_t GUID = Function::getGUID(SymName);
148150
FuncStartAddrs[GUID] = F->getAddress();
151+
if (ProfiledOnly && HasProfile)
152+
GuidFilter.insert(GUID);
149153
}
150154
}
151155
}

0 commit comments

Comments
 (0)