Skip to content

Commit e0a705e

Browse files
committed
[BOLT] Only parse probes for profiled functions in profile-write-pseudo-probes mode
1 parent 97f8101 commit e0a705e

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

bolt/lib/Rewrite/PseudoProbeRewriter.cpp

Lines changed: 22 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");
@@ -136,6 +137,7 @@ void PseudoProbeRewriter::parsePseudoProbe() {
136137
MCPseudoProbeDecoder::Uint64Map FuncStartAddrs;
137138
SmallVector<StringRef, 3> Suffixes({".destroy", ".resume", ".llvm."});
138139
for (const BinaryFunction *F : BC.getAllBinaryFunctions()) {
140+
bool HasProfile = F->hasProfileAvailable();
139141
for (const MCSymbol *Sym : F->getSymbols()) {
140142
StringRef SymName = NameResolver::restore(Sym->getName());
141143
if (std::optional<StringRef> CommonName =
@@ -144,6 +146,23 @@ void PseudoProbeRewriter::parsePseudoProbe() {
144146
}
145147
uint64_t GUID = Function::getGUID(SymName);
146148
FuncStartAddrs[GUID] = F->getAddress();
149+
if (ProfiledOnly && HasProfile)
150+
GuidFilter.insert(GUID);
151+
std::optional<StringRef> CommonName =
152+
getCommonName(SymName, false, Suffixes);
153+
if (!CommonName)
154+
continue;
155+
GUID = Function::getGUID(*CommonName);
156+
FuncStartAddrs.try_emplace(GUID, F->getAddress());
157+
if (ProfiledOnly && HasProfile)
158+
GuidFilter.insert(GUID);
159+
}
160+
}
161+
if (ProfiledOnly) {
162+
for (const auto &FuncDesc : ProbeDecoder.getGUID2FuncDescMap()) {
163+
uint64_t GUID = FuncDesc.FuncGUID;
164+
if (!FuncStartAddrs.contains(GUID))
165+
GuidFilter.insert(GUID);
147166
}
148167
}
149168
Contents = PseudoProbeSection->getContents();

0 commit comments

Comments
 (0)