@@ -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
9394Error 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