[PGO] Move value profile data definitions out of IndexedInstrProf

Move the data structure defintions out of the namespace. The defs will
be shared by raw format. [NFC]



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253394 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Xinliang David Li 2015-11-17 23:00:40 +00:00
parent 2fa6f196d6
commit e34401de05
4 changed files with 49 additions and 52 deletions

View File

@ -401,46 +401,6 @@ void InstrProfRecord::updateStrings(InstrProfStringTable *StrTab) {
VData.Value = (uint64_t)StrTab->insertString((const char *)VData.Value); VData.Value = (uint64_t)StrTab->insertString((const char *)VData.Value);
} }
namespace IndexedInstrProf {
enum class HashT : uint32_t {
MD5,
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);
}
static inline uint64_t ComputeHash(HashT Type, StringRef K) {
switch (Type) {
case HashT::MD5:
return IndexedInstrProf::MD5Hash(K);
}
llvm_unreachable("Unhandled hash type");
}
const uint64_t Magic = 0x8169666f72706cff; // "\xfflprofi\x81"
const uint64_t Version = 3;
const HashT HashType = HashT::MD5;
// This structure defines the file header of the LLVM profile
// data file in indexed-format.
struct Header {
uint64_t Magic;
uint64_t Version;
uint64_t MaxFunctionCount;
uint64_t HashType;
uint64_t HashOffset;
};
inline support::endianness getHostEndianness() { inline support::endianness getHostEndianness() {
return sys::IsLittleEndianHost ? support::little : support::big; return sys::IsLittleEndianHost ? support::little : support::big;
} }
@ -540,7 +500,48 @@ struct ValueProfData {
ValueProfRecord *getFirstValueProfRecord(); ValueProfRecord *getFirstValueProfRecord();
}; };
} // end namespace IndexedInstrProf namespace IndexedInstrProf {
enum class HashT : uint32_t {
MD5,
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);
}
static inline uint64_t ComputeHash(HashT Type, StringRef K) {
switch (Type) {
case HashT::MD5:
return IndexedInstrProf::MD5Hash(K);
}
llvm_unreachable("Unhandled hash type");
}
const uint64_t Magic = 0x8169666f72706cff; // "\xfflprofi\x81"
const uint64_t Version = 3;
const HashT HashType = HashT::MD5;
// This structure defines the file header of the LLVM profile
// data file in indexed-format.
struct Header {
uint64_t Magic;
uint64_t Version;
uint64_t MaxFunctionCount;
uint64_t HashType;
uint64_t HashOffset;
};
} // end namespace IndexedInstrProf
namespace RawInstrProf { namespace RawInstrProf {

View File

@ -131,8 +131,6 @@ GlobalVariable *createPGOFuncNameVar(Function &F, StringRef FuncName) {
return createPGOFuncNameVar(*F.getParent(), F.getLinkage(), FuncName); return createPGOFuncNameVar(*F.getParent(), F.getLinkage(), FuncName);
} }
namespace IndexedInstrProf {
uint32_t ValueProfRecord::getHeaderSize(uint32_t NumValueSites) { uint32_t ValueProfRecord::getHeaderSize(uint32_t NumValueSites) {
uint32_t Size = offsetof(ValueProfRecord, SiteCountArray) + uint32_t Size = offsetof(ValueProfRecord, SiteCountArray) +
sizeof(uint8_t) * NumValueSites; sizeof(uint8_t) * NumValueSites;
@ -174,7 +172,8 @@ void ValueProfRecord::serializeFrom(const InstrProfRecord &Record,
DstVD[I] = SrcVD[I]; DstVD[I] = SrcVD[I];
switch (ValueKind) { switch (ValueKind) {
case IPVK_IndirectCallTarget: case IPVK_IndirectCallTarget:
DstVD[I].Value = ComputeHash(HashType, (const char *)DstVD[I].Value); DstVD[I].Value = IndexedInstrProf::ComputeHash(
IndexedInstrProf::HashType, (const char *)DstVD[I].Value);
break; break;
default: default:
llvm_unreachable("value kind not handled !"); llvm_unreachable("value kind not handled !");
@ -361,6 +360,4 @@ InstrProfValueData *ValueProfRecord::getValueData() {
return reinterpret_cast<InstrProfValueData *>((char *)this + return reinterpret_cast<InstrProfValueData *>((char *)this +
getHeaderSize(NumValueSites)); getHeaderSize(NumValueSites));
} }
} // End of IndexedInstrProf namespace.
} }

View File

@ -313,9 +313,8 @@ typedef InstrProfLookupTrait::offset_type offset_type;
bool InstrProfLookupTrait::ReadValueProfilingData( bool InstrProfLookupTrait::ReadValueProfilingData(
const unsigned char *&D, const unsigned char *const End) { const unsigned char *&D, const unsigned char *const End) {
ErrorOr<std::unique_ptr<IndexedInstrProf::ValueProfData>> VDataPtrOrErr = ErrorOr<std::unique_ptr<ValueProfData>> VDataPtrOrErr =
IndexedInstrProf::ValueProfData::getValueProfData( ValueProfData::getValueProfData(D, End, ValueProfDataEndianness);
D, End, ValueProfDataEndianness);
if (VDataPtrOrErr.getError()) if (VDataPtrOrErr.getError())
return false; return false;

View File

@ -53,7 +53,7 @@ public:
M += ProfRecord.Counts.size() * sizeof(uint64_t); M += ProfRecord.Counts.size() * sizeof(uint64_t);
// Value data // Value data
M += IndexedInstrProf::ValueProfData::getSize(ProfileData.second); M += ValueProfData::getSize(ProfileData.second);
} }
LE.write<offset_type>(M); LE.write<offset_type>(M);
@ -77,8 +77,8 @@ public:
LE.write<uint64_t>(I); LE.write<uint64_t>(I);
// Write value data // Write value data
std::unique_ptr<IndexedInstrProf::ValueProfData> VDataPtr = std::unique_ptr<ValueProfData> VDataPtr =
IndexedInstrProf::ValueProfData::serializeFrom(ProfileData.second); ValueProfData::serializeFrom(ProfileData.second);
uint32_t S = VDataPtr->getSize(); uint32_t S = VDataPtr->getSize();
VDataPtr->swapBytesFromHost(ValueProfDataEndianness); VDataPtr->swapBytesFromHost(ValueProfDataEndianness);
Out.write((const char *)VDataPtr.get(), S); Out.write((const char *)VDataPtr.get(), S);