Index: include/llvm/ProfileData/InstrProf.h =================================================================== --- include/llvm/ProfileData/InstrProf.h +++ include/llvm/ProfileData/InstrProf.h @@ -19,7 +19,9 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" +#include "llvm/IR/Function.h" #include "llvm/IR/GlobalValue.h" +#include "llvm/IR/Metadata.h" #include "llvm/ProfileData/InstrProfData.inc" #include "llvm/ProfileData/ProfileCommon.h" #include "llvm/Support/Endian.h" @@ -245,6 +247,18 @@ InstrProfValueData ValueData[], uint32_t &ActualNumValueData, uint64_t &TotalC); +inline StringRef getPGOFuncNameMetadataName() { return "PGOFuncName"; } + +/// Return the PGOFuncName meta data associated with a function. +inline MDNode *getPGOFuncNameMetadata(const Function &F) { + return F.getMetadata(getPGOFuncNameMetadataName()); +} + +/// Create the PGOFuncName meta data if PGOFuncName is different from +/// function's raw name. This should only apply to internal linkage functions +/// declared by users only. +void createPGOFuncNameMetadata(Function &F); + const std::error_category &instrprof_category(); enum class instrprof_error { Index: lib/ProfileData/InstrProf.cpp =================================================================== --- lib/ProfileData/InstrProf.cpp +++ lib/ProfileData/InstrProf.cpp @@ -98,9 +98,8 @@ return getPGOFuncName(F.getName(), F.getLinkage(), F.getParent()->getName(), Version); - // InLTO mode. First check if these is a meta data. - MDNode *MD = F.getMetadata("PGOFuncName"); - if (MD != nullptr) { + // In LTO mode (when InLTO is true), first check if there is a meta data. + if (MDNode *MD = getPGOFuncNameMetadata(F)) { StringRef S = cast(MD->getOperand(0))->getString(); return S.str(); } @@ -108,7 +107,7 @@ // If there is no meta data, the function must be a global before the value // profile annotation pass. Its current linkage may be internal if it is // internalized in LTO mode. - return getPGOFuncName (F.getName(), GlobalValue::ExternalLinkage, ""); + return getPGOFuncName(F.getName(), GlobalValue::ExternalLinkage, ""); } StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName, StringRef FileName) { @@ -720,4 +719,15 @@ } return true; } + +void createPGOFuncNameMetadata(Function &F) { + const std::string &FuncName = getPGOFuncName(F); + if (FuncName == F.getName()) + return; + + LLVMContext &C = F.getContext(); + MDNode *N = MDNode::get(C, MDString::get(C, FuncName.c_str())); + F.setMetadata(getPGOFuncNameMetadataName(), N); +} + } // end namespace llvm Index: lib/Transforms/Instrumentation/PGOInstrumentation.cpp =================================================================== --- lib/Transforms/Instrumentation/PGOInstrumentation.cpp +++ lib/Transforms/Instrumentation/PGOInstrumentation.cpp @@ -752,14 +752,8 @@ if (DisableValueProfiling) return; - // Write out the PGOFuncName if this is different from it's raw name. - // This should only apply to internal linkage functions only. - const std::string &FuncName = getPGOFuncName(F); - if (FuncName != F.getName()) { - LLVMContext &C = F.getContext(); - MDNode *N = MDNode::get(C, MDString::get(C, FuncName.c_str())); - F.setMetadata("PGOFuncName", N); - } + // Create the PGOFuncName meta data. + createPGOFuncNameMetadata(F); unsigned IndirectCallSiteIndex = 0; PGOIndirectCallSiteVisitor ICV;