14
14
#include " bolt/Rewrite/MetadataRewriter.h"
15
15
#include " bolt/Rewrite/MetadataRewriters.h"
16
16
#include " bolt/Utils/CommandLineOpts.h"
17
+ #include " bolt/Utils/Utils.h"
17
18
#include " llvm/IR/Function.h"
18
19
#include " llvm/MC/MCPseudoProbe.h"
19
20
#include " llvm/Support/CommandLine.h"
@@ -133,10 +134,16 @@ void PseudoProbeRewriter::parsePseudoProbe() {
133
134
134
135
MCPseudoProbeDecoder::Uint64Set GuidFilter;
135
136
MCPseudoProbeDecoder::Uint64Map FuncStartAddrs;
137
+ SmallVector<StringRef, 3 > Suffixes ({" .destroy" , " .resume" , " .llvm." });
136
138
for (const BinaryFunction *F : BC.getAllBinaryFunctions ()) {
137
139
for (const MCSymbol *Sym : F->getSymbols ()) {
138
- FuncStartAddrs[Function::getGUID (NameResolver::restore (Sym->getName ()))] =
139
- F->getAddress ();
140
+ StringRef SymName = NameResolver::restore (Sym->getName ());
141
+ if (std::optional<StringRef> CommonName =
142
+ getCommonName (SymName, false , Suffixes)) {
143
+ SymName = *CommonName;
144
+ }
145
+ uint64_t GUID = Function::getGUID (SymName);
146
+ FuncStartAddrs[GUID] = F->getAddress ();
140
147
}
141
148
}
142
149
Contents = PseudoProbeSection->getContents ();
@@ -155,13 +162,25 @@ void PseudoProbeRewriter::parsePseudoProbe() {
155
162
ProbeDecoder.printProbesForAllAddresses (outs ());
156
163
}
157
164
158
- for (const auto &FuncDesc : ProbeDecoder.getGUID2FuncDescMap ()) {
159
- uint64_t GUID = FuncDesc.FuncGUID ;
160
- if (!FuncStartAddrs.contains (GUID))
161
- continue ;
162
- BinaryFunction *BF = BC.getBinaryFunctionAtAddress (FuncStartAddrs[GUID]);
163
- assert (BF);
164
- BF->setGUID (GUID);
165
+ const GUIDProbeFunctionMap &GUID2Func = ProbeDecoder.getGUID2FuncDescMap ();
166
+ // Checks GUID in GUID2Func and returns it if it's present or null otherwise.
167
+ auto checkGUID = [&](StringRef SymName) {
168
+ uint64_t GUID = Function::getGUID (SymName);
169
+ if (GUID2Func.find (GUID) == GUID2Func.end ())
170
+ return 0ull ;
171
+ return GUID;
172
+ };
173
+ for (BinaryFunction *F : BC.getAllBinaryFunctions ()) {
174
+ for (const MCSymbol *Sym : F->getSymbols ()) {
175
+ StringRef SymName = NameResolver::restore (Sym->getName ());
176
+ uint64_t GUID = checkGUID (SymName);
177
+ std::optional<StringRef> CommonName =
178
+ getCommonName (SymName, false , Suffixes);
179
+ if (!GUID && CommonName)
180
+ GUID = checkGUID (*CommonName);
181
+ if (GUID)
182
+ F->setGUID (GUID);
183
+ }
165
184
}
166
185
}
167
186
0 commit comments