Skip to content

Commit

Permalink
[PGO] Refactor PGOFuncName meta data code to be used in clang
Browse files Browse the repository at this point in the history
Refactor the code that gets and creates PGOFuncName meta data so that it can be
used in clang's value profile annotation.

Differential Revision: http://reviews.llvm.org/D18623





git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265149 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
xur-llvm committed Apr 1, 2016
1 parent fb73eb7 commit a7f5174
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 12 deletions.
14 changes: 14 additions & 0 deletions include/llvm/ProfileData/InstrProf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -245,6 +247,18 @@ bool getValueProfDataFromInst(const Instruction &Inst,
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 {
Expand Down
18 changes: 14 additions & 4 deletions lib/ProfileData/InstrProf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,17 +98,16 @@ std::string getPGOFuncName(const Function &F, bool InLTO, uint64_t Version) {
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<MDString>(MD->getOperand(0))->getString();
return S.str();
}

// 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) {
Expand Down Expand Up @@ -720,4 +719,15 @@ bool getValueProfDataFromInst(const Instruction &Inst,
}
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
10 changes: 2 additions & 8 deletions lib/Transforms/Instrumentation/PGOInstrumentation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -752,14 +752,8 @@ void PGOUseFunc::annotateIndirectCallSites() {
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;
Expand Down

0 comments on commit a7f5174

Please sign in to comment.