================ @@ -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 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits