From 8fc17088bb6ee8ca8692b643e393fe21f90a9bd8 Mon Sep 17 00:00:00 2001 From: Xinliang David Li Date: Wed, 25 Nov 2015 04:29:24 +0000 Subject: [PATCH 1/1] [PGO] convert a subset of C++ interfaces into C (for sharing) (NFC) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254056 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ProfileData/InstrProf.h | 43 +++++++++++++++++----------- lib/ProfileData/InstrProf.cpp | 38 +++++++----------------- 2 files changed, 36 insertions(+), 45 deletions(-) diff --git a/include/llvm/ProfileData/InstrProf.h b/include/llvm/ProfileData/InstrProf.h index f0c89200f28..c03f6cc4616 100644 --- a/include/llvm/ProfileData/InstrProf.h +++ b/include/llvm/ProfileData/InstrProf.h @@ -447,12 +447,6 @@ inline support::endianness getHostEndianness() { return sys::IsLittleEndianHost ? support::little : support::big; } -/// Return the \c ValueProfRecord header size including the padding bytes. -uint32_t getValueProfRecordHeaderSize(uint32_t NumValueSites); -/// Return the total size of the value profile record including the -/// header and the value data. -uint32_t getValueProfRecordSize(uint32_t NumValueSites, uint32_t NumValueData); - /// This is the header of the data structure that defines the on-disk /// layout of the value profile data of a particular kind for one function. typedef struct ValueProfRecord { @@ -475,19 +469,8 @@ typedef struct ValueProfRecord { // of all elements in SiteCountArray[]. // InstrProfValueData ValueData[]; - /// Return the total size of the value profile record including the - /// header and the value data. - uint32_t getSize() const { - return getValueProfRecordSize(NumValueSites, getNumValueData()); - } - /// Use this method to advance to the next \c ValueProfRecord. - ValueProfRecord *getNext(); - /// Return the pointer to the first value profile data. - InstrProfValueData *getValueData(); /// Return the number of value sites. uint32_t getNumValueSites() const { return NumValueSites; } - /// Return the number of value data. - uint32_t getNumValueData() const; /// Read data from this record and save it to Record. void deserializeTo(InstrProfRecord &Record, InstrProfRecord::ValueMapType *VMap); @@ -576,6 +559,7 @@ typedef struct ValueProfRecordClosure { ValueProfData *(*AllocateValueProfData)(size_t TotalSizeInBytes); } ValueProfRecordClosure; +/// Return the \c ValueProfRecord header size including the padding bytes. inline uint32_t getValueProfRecordHeaderSize(uint32_t NumValueSites) { uint32_t Size = offsetof(ValueProfRecord, SiteCountArray) + sizeof(uint8_t) * NumValueSites; @@ -584,12 +568,37 @@ inline uint32_t getValueProfRecordHeaderSize(uint32_t NumValueSites) { return Size; } +/// Return the total size of the value profile record including the +/// header and the value data. inline uint32_t getValueProfRecordSize(uint32_t NumValueSites, uint32_t NumValueData) { return getValueProfRecordHeaderSize(NumValueSites) + sizeof(InstrProfValueData) * NumValueData; } +/// Return the pointer to the start of value data array. +inline InstrProfValueData *getValueProfRecordValueData(ValueProfRecord *This) { + return (InstrProfValueData *)((char *)This + getValueProfRecordHeaderSize( + This->NumValueSites)); +} + +/// Return the total number of value data for \c This record. +inline uint32_t getValueProfRecordNumValueData(ValueProfRecord *This) { + uint32_t NumValueData = 0; + uint32_t I; + for (I = 0; I < This->NumValueSites; I++) + NumValueData += This->SiteCountArray[I]; + return NumValueData; +} + +/// Use this method to advance to the next \c This \c ValueProfRecord. +inline ValueProfRecord *getValueProfRecordNext(ValueProfRecord *This) { + uint32_t NumValueData = getValueProfRecordNumValueData(This); + return (ValueProfRecord *)((char *)This + + getValueProfRecordSize(This->NumValueSites, + NumValueData)); +} + namespace IndexedInstrProf { enum class HashT : uint32_t { diff --git a/lib/ProfileData/InstrProf.cpp b/lib/ProfileData/InstrProf.cpp index edb0eb9fa39..34a354da896 100644 --- a/lib/ProfileData/InstrProf.cpp +++ b/lib/ProfileData/InstrProf.cpp @@ -143,27 +143,11 @@ uint64_t stringToHash(uint32_t ValueKind, uint64_t Value) { return Value; } -uint32_t ValueProfRecord::getNumValueData() const { - uint32_t NumValueData = 0; - for (uint32_t I = 0; I < NumValueSites; I++) - NumValueData += SiteCountArray[I]; - return NumValueData; -} - -ValueProfRecord *ValueProfRecord::getNext() { - return reinterpret_cast((char *)this + getSize()); -} - -InstrProfValueData *ValueProfRecord::getValueData() { - return reinterpret_cast( - (char *)this + getValueProfRecordHeaderSize(NumValueSites)); -} - void ValueProfRecord::deserializeTo(InstrProfRecord &Record, InstrProfRecord::ValueMapType *VMap) { Record.reserveSites(Kind, NumValueSites); - InstrProfValueData *ValueData = this->getValueData(); + InstrProfValueData *ValueData = getValueProfRecordValueData(this); for (uint64_t VSite = 0; VSite < NumValueSites; ++VSite) { uint8_t ValueDataCount = this->SiteCountArray[VSite]; Record.addValueData(Kind, VSite, ValueData, ValueDataCount, VMap); @@ -176,7 +160,7 @@ void ValueProfRecord::serializeFrom(const InstrProfRecord &Record, uint32_t NumValueSites) { Kind = ValueKind; this->NumValueSites = NumValueSites; - InstrProfValueData *DstVD = getValueData(); + InstrProfValueData *DstVD = getValueProfRecordValueData(this); for (uint32_t S = 0; S < NumValueSites; S++) { uint32_t ND = Record.getNumValueDataForSite(ValueKind, S); SiteCountArray[S] = ND; @@ -207,8 +191,8 @@ void ValueProfRecord::swapBytes(support::endianness Old, sys::swapByteOrder(NumValueSites); sys::swapByteOrder(Kind); } - uint32_t ND = getNumValueData(); - InstrProfValueData *VD = getValueData(); + uint32_t ND = getValueProfRecordNumValueData(this); + InstrProfValueData *VD = getValueProfRecordValueData(this); // No need to swap byte array: SiteCountArrray. for (uint32_t I = 0; I < ND; I++) { @@ -245,7 +229,7 @@ void ValueProfData::deserializeTo(InstrProfRecord &Record, ValueProfRecord *VR = getFirstValueProfRecord(); for (uint32_t K = 0; K < NumValueKinds; K++) { VR->deserializeTo(Record, VMap); - VR = VR->getNext(); + VR = getValueProfRecordNext(VR); } } @@ -268,7 +252,7 @@ ValueProfData::serializeFrom(const InstrProfRecord &Record) { if (!NumValueSites) continue; VR->serializeFrom(Record, Kind, NumValueSites); - VR = VR->getNext(); + VR = getValueProfRecordNext(VR); } return VPD; } @@ -299,12 +283,12 @@ ValueProfData::getValueProfData(const unsigned char *D, // Byte swap. VPD->swapBytesToHost(Endianness); - // Data integrety check: + // Data integrity check: ValueProfRecord *VR = VPD->getFirstValueProfRecord(); for (uint32_t K = 0; K < VPD->NumValueKinds; K++) { if (VR->Kind > IPVK_Last) return instrprof_error::malformed; - VR = VR->getNext(); + VR = getValueProfRecordNext(VR); if ((char *)VR - (char *)VPD.get() > (ptrdiff_t)TotalSize) return instrprof_error::malformed; } @@ -323,7 +307,7 @@ void ValueProfData::swapBytesToHost(support::endianness Endianness) { ValueProfRecord *VR = getFirstValueProfRecord(); for (uint32_t K = 0; K < NumValueKinds; K++) { VR->swapBytes(Endianness, getHostEndianness()); - VR = VR->getNext(); + VR = getValueProfRecordNext(VR); } } @@ -334,7 +318,7 @@ void ValueProfData::swapBytesFromHost(support::endianness Endianness) { ValueProfRecord *VR = getFirstValueProfRecord(); for (uint32_t K = 0; K < NumValueKinds; K++) { - ValueProfRecord *NVR = VR->getNext(); + ValueProfRecord *NVR = getValueProfRecordNext(VR); VR->swapBytes(getHostEndianness(), Endianness); VR = NVR; } @@ -346,6 +330,4 @@ ValueProfRecord *ValueProfData::getFirstValueProfRecord() { return reinterpret_cast((char *)this + sizeof(ValueProfData)); } - } - -- 2.34.1