summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/IR/Function.h8
-rw-r--r--llvm/include/llvm/ProfileData/InstrProf.h13
-rw-r--r--llvm/include/llvm/Support/MD5.h13
-rw-r--r--llvm/lib/IR/Function.cpp24
-rw-r--r--llvm/lib/ProfileData/InstrProf.cpp20
5 files changed, 47 insertions, 31 deletions
diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h
index e79c891149d..1ed200f0e18 100644
--- a/llvm/include/llvm/IR/Function.h
+++ b/llvm/include/llvm/IR/Function.h
@@ -639,6 +639,14 @@ public:
/// to \a DISubprogram.
DISubprogram *getSubprogram() const;
+ /// Return the modified name for a function suitable to be
+ /// used as the key for a global lookup (e.g. profile or ThinLTO).
+ /// The function's original name is \c FuncName and has linkage of type
+ /// \c Linkage. The function is defined in module \c FileName.
+ static std::string getGlobalIdentifier(StringRef FuncName,
+ GlobalValue::LinkageTypes Linkage,
+ StringRef FileName);
+
private:
void allocHungoffUselist();
template<int Idx> void setHungoffOperand(Constant *C);
diff --git a/llvm/include/llvm/ProfileData/InstrProf.h b/llvm/include/llvm/ProfileData/InstrProf.h
index 927ed1e599a..c1db9b63404 100644
--- a/llvm/include/llvm/ProfileData/InstrProf.h
+++ b/llvm/include/llvm/ProfileData/InstrProf.h
@@ -626,21 +626,10 @@ enum class HashT : uint32_t {
Last = MD5
};
-static inline uint64_t MD5Hash(StringRef Str) {
- MD5 Hash;
- Hash.update(Str);
- llvm::MD5::MD5Result Result;
- Hash.final(Result);
- // Return the least significant 8 bytes. Our MD5 implementation returns the
- // result in little endian, so we may need to swap bytes.
- using namespace llvm::support;
- return endian::read<uint64_t, little, unaligned>(Result);
-}
-
inline uint64_t ComputeHash(HashT Type, StringRef K) {
switch (Type) {
case HashT::MD5:
- return IndexedInstrProf::MD5Hash(K);
+ return MD5Hash(K);
}
llvm_unreachable("Unhandled hash type");
}
diff --git a/llvm/include/llvm/Support/MD5.h b/llvm/include/llvm/Support/MD5.h
index f6e1e92c9fa..0ce0b438fe4 100644
--- a/llvm/include/llvm/Support/MD5.h
+++ b/llvm/include/llvm/Support/MD5.h
@@ -31,6 +31,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/DataTypes.h"
+#include "llvm/Support/Endian.h"
namespace llvm {
@@ -65,6 +66,18 @@ private:
const uint8_t *body(ArrayRef<uint8_t> Data);
};
+/// Helper to compute and return a 64-bit MD5 Hash of a given string.
+inline uint64_t MD5Hash(StringRef Str) {
+ MD5 Hash;
+ Hash.update(Str);
+ llvm::MD5::MD5Result Result;
+ Hash.final(Result);
+ // Return the least significant 8 bytes. Our MD5 implementation returns the
+ // result in little endian, so we may need to swap bytes.
+ using namespace llvm::support;
+ return endian::read<uint64_t, little, unaligned>(Result);
+}
+
}
#endif
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp
index 40a8ec61ca2..da1ddedc3dd 100644
--- a/llvm/lib/IR/Function.cpp
+++ b/llvm/lib/IR/Function.cpp
@@ -997,3 +997,27 @@ Optional<uint64_t> Function::getEntryCount() const {
}
return None;
}
+
+std::string Function::getGlobalIdentifier(StringRef FuncName,
+ GlobalValue::LinkageTypes Linkage,
+ StringRef FileName) {
+
+ // Function names may be prefixed with a binary '1' to indicate
+ // that the backend should not modify the symbols due to any platform
+ // naming convention. Do not include that '1' in the PGO profile name.
+ if (FuncName[0] == '\1')
+ FuncName = FuncName.substr(1);
+
+ std::string NewFuncName = FuncName;
+ if (llvm::GlobalValue::isLocalLinkage(Linkage)) {
+ // For local symbols, prepend the main file name to distinguish them.
+ // Do not include the full path in the file name since there's no guarantee
+ // that it will stay the same, e.g., if the files are checked out from
+ // version control in different locations.
+ if (FileName.empty())
+ NewFuncName = NewFuncName.insert(0, "<unknown>:");
+ else
+ NewFuncName = NewFuncName.insert(0, FileName.str() + ":");
+ }
+ return NewFuncName;
+}
diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp
index 1cfc21e493a..551c414cff6 100644
--- a/llvm/lib/ProfileData/InstrProf.cpp
+++ b/llvm/lib/ProfileData/InstrProf.cpp
@@ -80,25 +80,7 @@ std::string getPGOFuncName(StringRef RawFuncName,
GlobalValue::LinkageTypes Linkage,
StringRef FileName,
uint64_t Version LLVM_ATTRIBUTE_UNUSED) {
-
- // Function names may be prefixed with a binary '1' to indicate
- // that the backend should not modify the symbols due to any platform
- // naming convention. Do not include that '1' in the PGO profile name.
- if (RawFuncName[0] == '\1')
- RawFuncName = RawFuncName.substr(1);
-
- std::string FuncName = RawFuncName;
- if (llvm::GlobalValue::isLocalLinkage(Linkage)) {
- // For local symbols, prepend the main file name to distinguish them.
- // Do not include the full path in the file name since there's no guarantee
- // that it will stay the same, e.g., if the files are checked out from
- // version control in different locations.
- if (FileName.empty())
- FuncName = FuncName.insert(0, "<unknown>:");
- else
- FuncName = FuncName.insert(0, FileName.str() + ":");
- }
- return FuncName;
+ return Function::getGlobalIdentifier(RawFuncName, Linkage, FileName);
}
std::string getPGOFuncName(const Function &F, uint64_t Version) {
OpenPOWER on IntegriCloud