From e34401de05668522e24e0faf54dc62d7ebf2f8fc Mon Sep 17 00:00:00 2001 From: Xinliang David Li Date: Tue, 17 Nov 2015 23:00:40 +0000 Subject: [PATCH] [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 --- include/llvm/ProfileData/InstrProf.h | 83 ++++++++++++++-------------- lib/ProfileData/InstrProf.cpp | 7 +-- lib/ProfileData/InstrProfReader.cpp | 5 +- lib/ProfileData/InstrProfWriter.cpp | 6 +- 4 files changed, 49 insertions(+), 52 deletions(-) diff --git a/include/llvm/ProfileData/InstrProf.h b/include/llvm/ProfileData/InstrProf.h index 2339a46f9c5..aa100a796f2 100644 --- a/include/llvm/ProfileData/InstrProf.h +++ b/include/llvm/ProfileData/InstrProf.h @@ -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(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(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 { diff --git a/lib/ProfileData/InstrProf.cpp b/lib/ProfileData/InstrProf.cpp index 2dd0f916c6d..fc7fc8aa1e2 100644 --- a/lib/ProfileData/InstrProf.cpp +++ b/lib/ProfileData/InstrProf.cpp @@ -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((char *)this + getHeaderSize(NumValueSites)); } - -} // End of IndexedInstrProf namespace. } diff --git a/lib/ProfileData/InstrProfReader.cpp b/lib/ProfileData/InstrProfReader.cpp index 6f201243736..479b6bc61d9 100644 --- a/lib/ProfileData/InstrProfReader.cpp +++ b/lib/ProfileData/InstrProfReader.cpp @@ -313,9 +313,8 @@ typedef InstrProfLookupTrait::offset_type offset_type; bool InstrProfLookupTrait::ReadValueProfilingData( const unsigned char *&D, const unsigned char *const End) { - ErrorOr> VDataPtrOrErr = - IndexedInstrProf::ValueProfData::getValueProfData( - D, End, ValueProfDataEndianness); + ErrorOr> VDataPtrOrErr = + ValueProfData::getValueProfData(D, End, ValueProfDataEndianness); if (VDataPtrOrErr.getError()) return false; diff --git a/lib/ProfileData/InstrProfWriter.cpp b/lib/ProfileData/InstrProfWriter.cpp index b6725df5278..cb123e29982 100644 --- a/lib/ProfileData/InstrProfWriter.cpp +++ b/lib/ProfileData/InstrProfWriter.cpp @@ -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(M); @@ -77,8 +77,8 @@ public: LE.write(I); // Write value data - std::unique_ptr VDataPtr = - IndexedInstrProf::ValueProfData::serializeFrom(ProfileData.second); + std::unique_ptr VDataPtr = + ValueProfData::serializeFrom(ProfileData.second); uint32_t S = VDataPtr->getSize(); VDataPtr->swapBytesFromHost(ValueProfDataEndianness); Out.write((const char *)VDataPtr.get(), S); -- 2.34.1