[llvm-branch-commits] [llvm] [BOLT] Name similarity function matching (PR #95884)
shaw young via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jun 21 10:26:24 PDT 2024
================
@@ -415,6 +422,75 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
if (!YamlBF.Used && BF && !ProfiledFunctions.count(BF))
matchProfileToFunction(YamlBF, *BF);
+ // Uses name similarity to match functions that were not matched by name.
+ uint64_t MatchedWithDemangledName = 0;
+
+ if (opts::NameSimilarityFunctionMatchingThreshold > 0) {
+ auto DemangleName = [&](const char* String) {
+ int Status = 0;
+ char *DemangledName = abi::__cxa_demangle(String,
+ nullptr, nullptr, &Status);
+ return Status == 0 ? new std::string(DemangledName) : nullptr;
+ };
+
+ auto DeriveNameSpace = [&](std::string DemangledName) {
+ size_t LParen = std::string(DemangledName).find("(");
+ std::string FunctionName = std::string(DemangledName).substr(0, LParen);
+ size_t ScopeResolutionOperator = std::string(FunctionName).rfind("::");
+ return ScopeResolutionOperator == std::string::npos ? std::string("") : std::string(DemangledName).substr(0, ScopeResolutionOperator);
+ };
+
+ std::unordered_map<std::string, std::vector<BinaryFunction *>> NamespaceToBFs;
+ NamespaceToBFs.reserve(BC.getBinaryFunctions().size());
+
+ for (BinaryFunction *BF : BC.getAllBinaryFunctions()) {
+ std::string* DemangledName = DemangleName(BF->getOneName().str().c_str());
+ if (!DemangledName)
+ continue;
+ std::string Namespace = DeriveNameSpace(*DemangledName);
+ auto It = NamespaceToBFs.find(Namespace);
+ if (It == NamespaceToBFs.end())
+ NamespaceToBFs[Namespace] = {BF};
+ else
+ It->second.push_back(BF);
+ }
+
+ for (auto YamlBF : YamlBP.Functions) {
+ if (YamlBF.Used)
+ continue;
+ std::string* YamlBFDemangledName = DemangleName(YamlBF.Name.c_str());
+ if (!YamlBFDemangledName)
+ continue;
+ std::string Namespace = DeriveNameSpace(*YamlBFDemangledName);
+ auto It = NamespaceToBFs.find(Namespace);
+ if (It == NamespaceToBFs.end())
+ continue;
+ std::vector<BinaryFunction *> BFs = It->second;
+
+ unsigned MinEditDistance = UINT_MAX;
+ BinaryFunction *ClosestNameBF = nullptr;
+
+ for (BinaryFunction *BF : BFs) {
+ if (ProfiledFunctions.count(BF))
+ continue;
+ std::string *BFDemangledName = DemangleName(BF->getOneName().str().c_str());
----------------
shawbyoung wrote:
For the sake of matching - is not a good idea to apply the same function name transformation to both the YamlBF and BF function names?
https://github.com/llvm/llvm-project/pull/95884
More information about the llvm-branch-commits
mailing list