diff options
author | Vedant Kumar <vsk@apple.com> | 2016-03-28 15:52:08 +0000 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2016-03-28 15:52:08 +0000 |
commit | e44e0be818ae53a6d60e96df1a04827f720847dc (patch) | |
tree | dda87fed2ba90589d2497ff5821ffe6c61888b99 | |
parent | 43a8565be61a9e24997a6e9e971df47bbffbe6fd (diff) | |
download | bcm5719-llvm-e44e0be818ae53a6d60e96df1a04827f720847dc.tar.gz bcm5719-llvm-e44e0be818ae53a6d60e96df1a04827f720847dc.zip |
[PGO] Fix name encoding for ObjC-like functions
Function names in ObjC can have spaces in them. This interacts poorly
with name compression, which uses spaces to separate PGO names. Fix the
issue by using a different separator and update a test.
I chose "\01" as the separator because 1) it's non-printable, 2) we
strip it from PGO names, and 3) it's the next natural choice once "\00"
is discarded (that one's overloaded).
Differential Revision: http://reviews.llvm.org/D18516
llvm-svn: 264587
-rw-r--r-- | llvm/include/llvm/ProfileData/InstrProf.h | 3 | ||||
-rw-r--r-- | llvm/lib/ProfileData/InstrProf.cpp | 4 | ||||
-rw-r--r-- | llvm/unittests/ProfileData/InstrProfTest.cpp | 4 |
3 files changed, 7 insertions, 4 deletions
diff --git a/llvm/include/llvm/ProfileData/InstrProf.h b/llvm/include/llvm/ProfileData/InstrProf.h index 3bf0aa38510..31fcffe2ef7 100644 --- a/llvm/include/llvm/ProfileData/InstrProf.h +++ b/llvm/include/llvm/ProfileData/InstrProf.h @@ -151,6 +151,9 @@ inline StringRef getInstrProfFileOverriderFuncName() { return "__llvm_profile_override_default_filename"; } +/// Return the marker used to separate PGO names during serialization. +inline StringRef getInstrProfNameSeparator() { return "\01"; } + /// Return the modified name for function \c F suitable to be /// used the key for profile lookup. std::string getPGOFuncName(const Function &F, diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp index 2446521a5bc..0bd8318dd43 100644 --- a/llvm/lib/ProfileData/InstrProf.cpp +++ b/llvm/lib/ProfileData/InstrProf.cpp @@ -160,7 +160,7 @@ int collectPGOFuncNameStrings(const std::vector<std::string> &NameStrs, bool doCompression, std::string &Result) { uint8_t Header[16], *P = Header; std::string UncompressedNameStrings = - join(NameStrs.begin(), NameStrs.end(), StringRef(" ")); + join(NameStrs.begin(), NameStrs.end(), getInstrProfNameSeparator()); unsigned EncLen = encodeULEB128(UncompressedNameStrings.length(), P); P += EncLen; @@ -238,7 +238,7 @@ int readPGOFuncNameStrings(StringRef NameStrings, InstrProfSymtab &Symtab) { } // Now parse the name strings. SmallVector<StringRef, 0> Names; - NameStrings.split(Names, ' '); + NameStrings.split(Names, getInstrProfNameSeparator()); for (StringRef &Name : Names) Symtab.addFuncName(Name); diff --git a/llvm/unittests/ProfileData/InstrProfTest.cpp b/llvm/unittests/ProfileData/InstrProfTest.cpp index 13d1e059cd2..7dd072c849b 100644 --- a/llvm/unittests/ProfileData/InstrProfTest.cpp +++ b/llvm/unittests/ProfileData/InstrProfTest.cpp @@ -893,7 +893,7 @@ TEST_P(MaybeSparseInstrProfTest, instr_prof_symtab_compression_test) { OS << "func_" << I; FuncNames1.push_back(OS.str()); str.clear(); - OS << "fooooooooooooooo_" << I; + OS << "f oooooooooooooo_" << I; FuncNames1.push_back(OS.str()); str.clear(); OS << "BAR_" << I; @@ -931,7 +931,7 @@ TEST_P(MaybeSparseInstrProfTest, instr_prof_symtab_compression_test) { StringRef R = Symtab.getFuncName(IndexedInstrProf::ComputeHash(FuncNames1[0])); ASSERT_EQ(StringRef("func_0"), R); R = Symtab.getFuncName(IndexedInstrProf::ComputeHash(FuncNames1[1])); - ASSERT_EQ(StringRef("fooooooooooooooo_0"), R); + ASSERT_EQ(StringRef("f oooooooooooooo_0"), R); for (int I = 0; I < 3; I++) { std::string N[4]; N[0] = FuncNames1[2 * I]; |