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:
parent
822afa80c7
commit
df213e4cac
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user