Index: lib/ProfileData/InstrProf.cpp =================================================================== --- lib/ProfileData/InstrProf.cpp +++ lib/ProfileData/InstrProf.cpp @@ -23,9 +23,15 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/LEB128.h" #include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/Path.h" using namespace llvm; +static cl::opt StaticFuncFullModulePrefix( + "static-func-full-module-prefix", cl::init(false), + cl::desc("Use full module build paths in the profile counter names for " + "static functions.")); + namespace { std::string getInstrProfErrString(instrprof_error Err) { switch (Err) { @@ -135,9 +141,12 @@ // (PGOUseFunc::annotateIndirectCallSites). If a symbol does not have the meta // data, its original linkage must be non-internal. std::string getPGOFuncName(const Function &F, bool InLTO, uint64_t Version) { - if (!InLTO) - return getPGOFuncName(F.getName(), F.getLinkage(), F.getParent()->getName(), - Version); + if (!InLTO) { + StringRef FileName = (StaticFuncFullModulePrefix + ? F.getParent()->getName() + : sys::path::filename(F.getParent()->getName())); + return getPGOFuncName(F.getName(), F.getLinkage(), FileName, Version); + } // In LTO mode (when InLTO is true), first check if there is a meta data. if (MDNode *MD = getPGOFuncNameMetadata(F)) { Index: test/Transforms/PGOProfile/statics_counter_naming.ll =================================================================== --- /dev/null +++ test/Transforms/PGOProfile/statics_counter_naming.ll @@ -0,0 +1,11 @@ +; RUN: opt %s -pgo-instr-gen -S | FileCheck %s --check-prefix=GEN +; RUN: opt %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; GEN: @__profn_statics_counter_naming.ll_func = private constant [30 x i8] c"statics_counter_naming.ll:func" + +define internal i32 @func() { +entry: + ret i32 0 +}