Skip to content

Commit

Permalink
[PGO] Add hash to name mapping in InstrProfSymtab
Browse files Browse the repository at this point in the history
Creator and lookup interfaces are added to this symtab class.
The new interfaces will be used by InstrProf Readers and writer.

A unit test is also added for the new APIs.




git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256092 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
david-xl committed Dec 19, 2015
1 parent 34f1d63 commit ab49f7c
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 4 deletions.
46 changes: 42 additions & 4 deletions include/llvm/ProfileData/InstrProf.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,11 @@ enum InstrProfValueKind : uint32_t {
namespace object {
class SectionRef;
}

namespace IndexedInstrProf {
uint64_t ComputeHash(StringRef K);
}

/// A symbol table used for function PGO name look-up with keys
/// (such as pointers, md5hash values) to the function. A function's
/// PGO name or name's md5hash are used in retrieving the profile
Expand All @@ -211,6 +216,7 @@ class InstrProfSymtab {
private:
StringRef Data;
uint64_t Address;
std::vector<std::pair<uint64_t, std::string>> HashNameMap;

public:
InstrProfSymtab() : Data(), Address(0) {}
Expand All @@ -223,11 +229,45 @@ class InstrProfSymtab {
Address = BaseAddr;
return std::error_code();
}
template <typename NameIterRange> void create(NameIterRange &IterRange) {
for (auto Name : IterRange)
HashNameMap.push_back(
std::make_pair(IndexedInstrProf::ComputeHash(Name), Name.str()));
finalizeSymtab();
}

// If the symtab is created by a series calls to \c addFuncName, \c
// finalizeSymtab needs to
// be called before function name/symbol lookup using MD5 hash. This is
// required because
// the underlying map is vector (for space efficiency) which needs to be
// sorted.
void finalizeSymtab() {
std::sort(HashNameMap.begin(), HashNameMap.end(), less_first());
HashNameMap.erase(std::unique(HashNameMap.begin(), HashNameMap.end()),
HashNameMap.end());
}

void addFuncName(StringRef FuncName) {
HashNameMap.push_back(std::make_pair(
IndexedInstrProf::ComputeHash(FuncName), FuncName.str()));
}

/// Return function's PGO name from the function name's symabol
/// address in the object file. If an error occurs, Return
/// an empty string.
StringRef getFuncName(uint64_t FuncNameAddress, size_t NameSize);
/// Return function's PGO name from the name's md5 hash value.
/// If not found, return an empty string.
StringRef getFuncName(uint64_t FuncMD5Hash) {
auto Result =
std::lower_bound(HashNameMap.begin(), HashNameMap.end(), FuncMD5Hash,
[](const std::pair<uint64_t, std::string> &LHS,
uint64_t RHS) { return LHS.first < RHS; });
if (Result != HashNameMap.end())
return Result->second;
return StringRef();
}
};

struct InstrProfStringTable {
Expand Down Expand Up @@ -481,7 +521,7 @@ static inline uint64_t MD5Hash(StringRef Str) {
return endian::read<uint64_t, little, unaligned>(Result);
}

static inline uint64_t ComputeHash(HashT Type, StringRef K) {
inline uint64_t ComputeHash(HashT Type, StringRef K) {
switch (Type) {
case HashT::MD5:
return IndexedInstrProf::MD5Hash(K);
Expand All @@ -493,9 +533,7 @@ const uint64_t Magic = 0x8169666f72706cff; // "\xfflprofi\x81"
const uint64_t Version = INSTR_PROF_INDEX_VERSION;
const HashT HashType = HashT::MD5;

static inline uint64_t ComputeHash(StringRef K) {
return ComputeHash(HashType, K);
}
inline uint64_t ComputeHash(StringRef K) { return ComputeHash(HashType, K); }

// This structure defines the file header of the LLVM profile
// data file in indexed-format.
Expand Down
24 changes: 24 additions & 0 deletions unittests/ProfileData/InstrProfTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -524,4 +524,28 @@ TEST_F(InstrProfTest, get_weighted_function_counts) {
ASSERT_EQ(20U, Counts[1]);
}

TEST_F(InstrProfTest, instr_prof_symtab_test) {
std::vector<StringRef> FuncNames;
FuncNames.push_back("func1");
FuncNames.push_back("func2");
FuncNames.push_back("func3");
FuncNames.push_back("bar1");
FuncNames.push_back("bar2");
FuncNames.push_back("bar3");
InstrProfSymtab Symtab;
Symtab.create(FuncNames);
StringRef R = Symtab.getFuncName(IndexedInstrProf::ComputeHash("func1"));
ASSERT_EQ(StringRef("func1"), R);
R = Symtab.getFuncName(IndexedInstrProf::ComputeHash("func2"));
ASSERT_EQ(StringRef("func2"), R);
R = Symtab.getFuncName(IndexedInstrProf::ComputeHash("func3"));
ASSERT_EQ(StringRef("func3"), R);
R = Symtab.getFuncName(IndexedInstrProf::ComputeHash("bar1"));
ASSERT_EQ(StringRef("bar1"), R);
R = Symtab.getFuncName(IndexedInstrProf::ComputeHash("bar2"));
ASSERT_EQ(StringRef("bar2"), R);
R = Symtab.getFuncName(IndexedInstrProf::ComputeHash("bar3"));
ASSERT_EQ(StringRef("bar3"), R);
}

} // end anonymous namespace

0 comments on commit ab49f7c

Please sign in to comment.