mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 23:48:56 +00:00
[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:
parent
2fa6f196d6
commit
e34401de05
@ -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 {
|
||||||
|
|
||||||
|
@ -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.
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user