1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

[PGO] Make needsComdatForCounter() available (NFC)

Move needsComdatForCounter() to lib/ProfileData/InstrProf.cpp from
lib/Transforms/Instrumentation/InstrProfiling.cpp to make is available for
other files.

Differential Revision: https://reviews.llvm.org/D22643

llvm-svn: 276330
This commit is contained in:
Rong Xu 2016-07-21 20:50:02 +00:00
parent 822afa80c7
commit df213e4cac
3 changed files with 30 additions and 27 deletions

View File

@ -274,6 +274,10 @@ MDNode *getPGOFuncNameMetadata(const Function &F);
/// declared by users only. /// declared by users only.
void createPGOFuncNameMetadata(Function &F, StringRef PGOFuncName); void createPGOFuncNameMetadata(Function &F, StringRef PGOFuncName);
/// Check if we can use Comdat for profile variables. This will eliminate
/// the duplicated profile variables for Comdat functions.
bool needsComdatForCounter(const Function &F, const Module &M);
const std::error_category &instrprof_category(); const std::error_category &instrprof_category();
enum class instrprof_error { enum class instrprof_error {

View File

@ -14,6 +14,7 @@
#include "llvm/ProfileData/InstrProf.h" #include "llvm/ProfileData/InstrProf.h"
#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Triple.h"
#include "llvm/IR/Constants.h" #include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h" #include "llvm/IR/Function.h"
#include "llvm/IR/GlobalVariable.h" #include "llvm/IR/GlobalVariable.h"
@ -780,4 +781,29 @@ void createPGOFuncNameMetadata(Function &F, StringRef PGOFuncName) {
F.setMetadata(getPGOFuncNameMetadataName(), N); F.setMetadata(getPGOFuncNameMetadataName(), N);
} }
bool needsComdatForCounter(const Function &F, const Module &M) {
if (F.hasComdat())
return true;
Triple TT(M.getTargetTriple());
if (!TT.isOSBinFormatELF())
return false;
// See createPGOFuncNameVar for more details. To avoid link errors, profile
// counters for function with available_externally linkage needs to be changed
// to linkonce linkage. On ELF based systems, this leads to weak symbols to be
// created. Without using comdat, duplicate entries won't be removed by the
// linker leading to increased data segement size and raw profile size. Even
// worse, since the referenced counter from profile per-function data object
// will be resolved to the common strong definition, the profile counts for
// available_externally functions will end up being duplicated in raw profile
// data. This can result in distorted profile as the counts of those dups
// will be accumulated by the profile merger.
GlobalValue::LinkageTypes Linkage = F.getLinkage();
if (Linkage != GlobalValue::ExternalWeakLinkage &&
Linkage != GlobalValue::AvailableExternallyLinkage)
return false;
return true;
}
} // end namespace llvm } // end namespace llvm

View File

@ -268,33 +268,6 @@ static inline bool shouldRecordFunctionAddr(Function *F) {
return F->hasAddressTaken() || F->hasLinkOnceLinkage(); return F->hasAddressTaken() || F->hasLinkOnceLinkage();
} }
static inline bool needsComdatForCounter(Function &F, Module &M) {
if (F.hasComdat())
return true;
Triple TT(M.getTargetTriple());
if (!TT.isOSBinFormatELF())
return false;
// See createPGOFuncNameVar for more details. To avoid link errors, profile
// counters for function with available_externally linkage needs to be changed
// to linkonce linkage. On ELF based systems, this leads to weak symbols to be
// created. Without using comdat, duplicate entries won't be removed by the
// linker leading to increased data segement size and raw profile size. Even
// worse, since the referenced counter from profile per-function data object
// will be resolved to the common strong definition, the profile counts for
// available_externally functions will end up being duplicated in raw profile
// data. This can result in distorted profile as the counts of those dups
// will be accumulated by the profile merger.
GlobalValue::LinkageTypes Linkage = F.getLinkage();
if (Linkage != GlobalValue::ExternalWeakLinkage &&
Linkage != GlobalValue::AvailableExternallyLinkage)
return false;
return true;
}
static inline Comdat *getOrCreateProfileComdat(Module &M, Function &F, static inline Comdat *getOrCreateProfileComdat(Module &M, Function &F,
InstrProfIncrementInst *Inc) { InstrProfIncrementInst *Inc) {
if (!needsComdatForCounter(F, M)) if (!needsComdatForCounter(F, M))