diff --git a/bolt/lib/Passes/ReorderFunctions.cpp b/bolt/lib/Passes/ReorderFunctions.cpp --- a/bolt/lib/Passes/ReorderFunctions.cpp +++ b/bolt/lib/Passes/ReorderFunctions.cpp @@ -12,6 +12,8 @@ #include "bolt/Passes/ReorderFunctions.h" #include "bolt/Passes/HFSort.h" +#include "bolt/Utils/Utils.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/Support/CommandLine.h" #include @@ -327,15 +329,22 @@ break; case RT_USER: { + // Build LTOCommonNameMap + StringMap> LTOCommonNameMap; + for (const BinaryFunction &BF : llvm::make_second_range(BFs)) + for (StringRef Name : BF.getNames()) + if (std::optional LTOCommonName = getLTOCommonName(Name)) + LTOCommonNameMap[*LTOCommonName].push_back(BF.getAddress()); + uint32_t Index = 0; for (const std::string &Function : readFunctionOrderFile()) { std::vector FuncAddrs; BinaryData *BD = BC.getBinaryDataByName(Function); if (!BD) { + // If we can't find the main symbol name, look for alternates. uint32_t LocalID = 1; while (true) { - // If we can't find the main symbol name, look for alternates. const std::string FuncName = Function + "/" + std::to_string(LocalID); BD = BC.getBinaryDataByName(FuncName); @@ -345,6 +354,10 @@ break; LocalID++; } + // Strip LTO suffixes + if (std::optional CommonName = getLTOCommonName(Function)) + if (LTOCommonNameMap.find(*CommonName) != LTOCommonNameMap.end()) + llvm::append_range(FuncAddrs, LTOCommonNameMap[*CommonName]); } else { FuncAddrs.push_back(BD->getAddress()); }