mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +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);
|
||||
}
|
||||
|
||||
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() {
|
||||
return sys::IsLittleEndianHost ? support::little : support::big;
|
||||
}
|
||||
@ -540,7 +500,48 @@ struct ValueProfData {
|
||||
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 {
|
||||
|
||||
|
@ -131,8 +131,6 @@ GlobalVariable *createPGOFuncNameVar(Function &F, StringRef FuncName) {
|
||||
return createPGOFuncNameVar(*F.getParent(), F.getLinkage(), FuncName);
|
||||
}
|
||||
|
||||
namespace IndexedInstrProf {
|
||||
|
||||
uint32_t ValueProfRecord::getHeaderSize(uint32_t NumValueSites) {
|
||||
uint32_t Size = offsetof(ValueProfRecord, SiteCountArray) +
|
||||
sizeof(uint8_t) * NumValueSites;
|
||||
@ -174,7 +172,8 @@ void ValueProfRecord::serializeFrom(const InstrProfRecord &Record,
|
||||
DstVD[I] = SrcVD[I];
|
||||
switch (ValueKind) {
|
||||
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;
|
||||
default:
|
||||
llvm_unreachable("value kind not handled !");
|
||||
@ -361,6 +360,4 @@ InstrProfValueData *ValueProfRecord::getValueData() {
|
||||
return reinterpret_cast<InstrProfValueData *>((char *)this +
|
||||
getHeaderSize(NumValueSites));
|
||||
}
|
||||
|
||||
} // End of IndexedInstrProf namespace.
|
||||
}
|
||||
|
@ -313,9 +313,8 @@ typedef InstrProfLookupTrait::offset_type offset_type;
|
||||
|
||||
bool InstrProfLookupTrait::ReadValueProfilingData(
|
||||
const unsigned char *&D, const unsigned char *const End) {
|
||||
ErrorOr<std::unique_ptr<IndexedInstrProf::ValueProfData>> VDataPtrOrErr =
|
||||
IndexedInstrProf::ValueProfData::getValueProfData(
|
||||
D, End, ValueProfDataEndianness);
|
||||
ErrorOr<std::unique_ptr<ValueProfData>> VDataPtrOrErr =
|
||||
ValueProfData::getValueProfData(D, End, ValueProfDataEndianness);
|
||||
|
||||
if (VDataPtrOrErr.getError())
|
||||
return false;
|
||||
|
@ -53,7 +53,7 @@ public:
|
||||
M += ProfRecord.Counts.size() * sizeof(uint64_t);
|
||||
|
||||
// Value data
|
||||
M += IndexedInstrProf::ValueProfData::getSize(ProfileData.second);
|
||||
M += ValueProfData::getSize(ProfileData.second);
|
||||
}
|
||||
LE.write<offset_type>(M);
|
||||
|
||||
@ -77,8 +77,8 @@ public:
|
||||
LE.write<uint64_t>(I);
|
||||
|
||||
// Write value data
|
||||
std::unique_ptr<IndexedInstrProf::ValueProfData> VDataPtr =
|
||||
IndexedInstrProf::ValueProfData::serializeFrom(ProfileData.second);
|
||||
std::unique_ptr<ValueProfData> VDataPtr =
|
||||
ValueProfData::serializeFrom(ProfileData.second);
|
||||
uint32_t S = VDataPtr->getSize();
|
||||
VDataPtr->swapBytesFromHost(ValueProfDataEndianness);
|
||||
Out.write((const char *)VDataPtr.get(), S);
|
||||
|
Loading…
Reference in New Issue
Block a user