X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FProfileData%2FInstrProf.cpp;h=87757af7f19ad65effa1056fa0f876a06de376c5;hp=34a354da896d8aa18079e0b0dc3a6310ed9ff12a;hb=72f9544cc033e9e7316691f0f210672c9639cb14;hpb=8fc17088bb6ee8ca8692b643e393fe21f90a9bd8 diff --git a/lib/ProfileData/InstrProf.cpp b/lib/ProfileData/InstrProf.cpp index 34a354da896..87757af7f19 100644 --- a/lib/ProfileData/InstrProf.cpp +++ b/lib/ProfileData/InstrProf.cpp @@ -155,16 +155,21 @@ void ValueProfRecord::deserializeTo(InstrProfRecord &Record, } } -void ValueProfRecord::serializeFrom(const InstrProfRecord &Record, - uint32_t ValueKind, - uint32_t NumValueSites) { - Kind = ValueKind; - this->NumValueSites = NumValueSites; - InstrProfValueData *DstVD = getValueProfRecordValueData(this); - for (uint32_t S = 0; S < NumValueSites; S++) { - uint32_t ND = Record.getNumValueDataForSite(ValueKind, S); - SiteCountArray[S] = ND; - Record.getValueForSite(DstVD, ValueKind, S, stringToHash); +// Extract data from \c Closure and serialize into \c This instance. +void serializeValueProfRecordFrom(ValueProfRecord *This, + ValueProfRecordClosure *Closure, + uint32_t ValueKind, uint32_t NumValueSites) { + uint32_t S; + const void *Record = Closure->Record; + This->Kind = ValueKind; + This->NumValueSites = NumValueSites; + InstrProfValueData *DstVD = getValueProfRecordValueData(This); + + for (S = 0; S < NumValueSites; S++) { + uint32_t ND = Closure->GetNumValueDataForSite(Record, ValueKind, S); + This->SiteCountArray[S] = ND; + Closure->GetValueForSite(Record, DstVD, ValueKind, S, + Closure->RemapValueData); DstVD += ND; } } @@ -205,18 +210,22 @@ void ValueProfRecord::swapBytes(support::endianness Old, } } -uint32_t ValueProfData::getSize(const InstrProfRecord &Record) { +/// Return the total size in bytes of the on-disk value profile data +/// given the data stored in Record. +uint32_t getValueProfDataSize(ValueProfRecordClosure *Closure) { + uint32_t Kind; uint32_t TotalSize = sizeof(ValueProfData); - uint32_t NumValueKinds = Record.getNumValueKinds(); + const void *Record = Closure->Record; + uint32_t NumValueKinds = Closure->GetNumValueKinds(Record); if (NumValueKinds == 0) return TotalSize; - for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; Kind++) { - uint32_t NumValueSites = Record.getNumValueSites(Kind); + for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) { + uint32_t NumValueSites = Closure->GetNumValueSites(Record, Kind); if (!NumValueSites) continue; - TotalSize += - getValueProfRecordSize(NumValueSites, Record.getNumValueData(Kind)); + TotalSize += getValueProfRecordSize(NumValueSites, + Closure->GetNumValueData(Record, Kind)); } return TotalSize; } @@ -226,37 +235,95 @@ void ValueProfData::deserializeTo(InstrProfRecord &Record, if (NumValueKinds == 0) return; - ValueProfRecord *VR = getFirstValueProfRecord(); + ValueProfRecord *VR = getFirstValueProfRecord(this); for (uint32_t K = 0; K < NumValueKinds; K++) { VR->deserializeTo(Record, VMap); VR = getValueProfRecordNext(VR); } } -static std::unique_ptr AllocValueProfData(uint32_t TotalSize) { +static std::unique_ptr allocValueProfData(uint32_t TotalSize) { return std::unique_ptr(new (::operator new(TotalSize)) ValueProfData()); } -std::unique_ptr -ValueProfData::serializeFrom(const InstrProfRecord &Record) { - uint32_t TotalSize = getSize(Record); +ValueProfData *serializeValueProfDataFrom(ValueProfRecordClosure *Closure) { + uint32_t TotalSize = getValueProfDataSize(Closure); - std::unique_ptr VPD = AllocValueProfData(TotalSize); + ValueProfData *VPD = Closure->AllocValueProfData(TotalSize); VPD->TotalSize = TotalSize; - VPD->NumValueKinds = Record.getNumValueKinds(); - ValueProfRecord *VR = VPD->getFirstValueProfRecord(); + VPD->NumValueKinds = Closure->GetNumValueKinds(Closure->Record); + ValueProfRecord *VR = getFirstValueProfRecord(VPD); for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; Kind++) { - uint32_t NumValueSites = Record.getNumValueSites(Kind); + uint32_t NumValueSites = Closure->GetNumValueSites(Closure->Record, Kind); if (!NumValueSites) continue; - VR->serializeFrom(Record, Kind, NumValueSites); + serializeValueProfRecordFrom(VR, Closure, Kind, NumValueSites); VR = getValueProfRecordNext(VR); } return VPD; } +// C wrappers of InstrProfRecord member functions used in Closure. +// These C wrappers are used as adaptors so that C++ code can be +// invoked as callbacks. +uint32_t getNumValueKindsInstrProf(const void *Record) { + return reinterpret_cast(Record)->getNumValueKinds(); +} + +uint32_t getNumValueSitesInstrProf(const void *Record, uint32_t VKind) { + return reinterpret_cast(Record) + ->getNumValueSites(VKind); +} + +uint32_t getNumValueDataInstrProf(const void *Record, uint32_t VKind) { + return reinterpret_cast(Record) + ->getNumValueData(VKind); +} + +uint32_t getNumValueDataForSiteInstrProf(const void *R, uint32_t VK, + uint32_t S) { + return reinterpret_cast(R) + ->getNumValueDataForSite(VK, S); +} + +void getValueForSiteInstrProf(const void *R, InstrProfValueData *Dst, + uint32_t K, uint32_t S, + uint64_t (*Mapper)(uint32_t, uint64_t)) { + return reinterpret_cast(R) + ->getValueForSite(Dst, K, S, Mapper); +} + +ValueProfData *allocValueProfDataInstrProf(size_t TotalSizeInBytes) { + return (ValueProfData *)(new (::operator new(TotalSizeInBytes)) + ValueProfData()); +} + +static ValueProfRecordClosure InstrProfRecordClosure = { + 0, + getNumValueKindsInstrProf, + getNumValueSitesInstrProf, + getNumValueDataInstrProf, + getNumValueDataForSiteInstrProf, + stringToHash, + getValueForSiteInstrProf, + allocValueProfDataInstrProf}; + +uint32_t ValueProfData::getSize(const InstrProfRecord &Record) { + InstrProfRecordClosure.Record = &Record; + return getValueProfDataSize(&InstrProfRecordClosure); +} + +std::unique_ptr +ValueProfData::serializeFrom(const InstrProfRecord &Record) { + InstrProfRecordClosure.Record = &Record; + + std::unique_ptr VPD( + serializeValueProfDataFrom(&InstrProfRecordClosure)); + return VPD; +} + ErrorOr> ValueProfData::getValueProfData(const unsigned char *D, const unsigned char *const BufferEnd, @@ -277,14 +344,14 @@ ValueProfData::getValueProfData(const unsigned char *D, if (TotalSize % sizeof(uint64_t)) return instrprof_error::malformed; - std::unique_ptr VPD = AllocValueProfData(TotalSize); + std::unique_ptr VPD = allocValueProfData(TotalSize); memcpy(VPD.get(), D, TotalSize); // Byte swap. VPD->swapBytesToHost(Endianness); // Data integrity check: - ValueProfRecord *VR = VPD->getFirstValueProfRecord(); + ValueProfRecord *VR = getFirstValueProfRecord(VPD.get()); for (uint32_t K = 0; K < VPD->NumValueKinds; K++) { if (VR->Kind > IPVK_Last) return instrprof_error::malformed; @@ -304,7 +371,7 @@ void ValueProfData::swapBytesToHost(support::endianness Endianness) { sys::swapByteOrder(TotalSize); sys::swapByteOrder(NumValueKinds); - ValueProfRecord *VR = getFirstValueProfRecord(); + ValueProfRecord *VR = getFirstValueProfRecord(this); for (uint32_t K = 0; K < NumValueKinds; K++) { VR->swapBytes(Endianness, getHostEndianness()); VR = getValueProfRecordNext(VR); @@ -316,7 +383,7 @@ void ValueProfData::swapBytesFromHost(support::endianness Endianness) { if (Endianness == getHostEndianness()) return; - ValueProfRecord *VR = getFirstValueProfRecord(); + ValueProfRecord *VR = getFirstValueProfRecord(this); for (uint32_t K = 0; K < NumValueKinds; K++) { ValueProfRecord *NVR = getValueProfRecordNext(VR); VR->swapBytes(getHostEndianness(), Endianness); @@ -325,9 +392,4 @@ void ValueProfData::swapBytesFromHost(support::endianness Endianness) { sys::swapByteOrder(TotalSize); sys::swapByteOrder(NumValueKinds); } - -ValueProfRecord *ValueProfData::getFirstValueProfRecord() { - return reinterpret_cast((char *)this + - sizeof(ValueProfData)); -} }