forked from OSchip/llvm-project
[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
This commit is contained in:
parent
43a8565be6
commit
e44e0be818
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in New Issue