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 {
// 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);
ValueProfRecord *getFirstValueProfRecord();
} ValueProfData;
+/* The closure is designed to abstact away two types of value profile data:
+ * - InstrProfRecord which is the primary data structure used to
+ * represent profile data in host tools (reader, writer, and profile-use)
+ * - value profile runtime data structure suitable to be used by C
+ * runtime library.
+ *
+ * Both sources of data need to serialize to disk/memory-buffer in common
+ * format: ValueProfData. The abstraction allows compiler-rt's raw profiler
+ * writer to share * the same code with indexed profile writer.
+ *
+ * For documentation of the member methods below, refer to corresponding methods
+ * in class InstrProfRecord.
+ */
typedef struct ValueProfRecordClosure {
void *Record;
uint32_t (*GetNumValueKinds)(void *Record);
uint32_t (*GetNumValueSites)(void *Record, uint32_t VKind);
uint32_t (*GetNumValueData)(void *Record, uint32_t VKind);
uint32_t (*GetNumValueDataForSite)(void *R, uint32_t VK, uint32_t S);
- uint64_t (*RemapValueData)(uint64_t Value);
- void (*GetValueForSite)(InstrProfValueData Dst[], void *R, uint32_t K,
- uint32_t S);
+
+ /* After extracting the value profile data from the value profile record,
+ * this method is used to map the in-memory value to on-disk value. If
+ * the method is null, value will be written out untranslated.
+ */
+ uint64_t (*RemapValueData)(uint32_t, uint64_t Value);
+ void (*GetValueForSite)(InstrProfValueData *Dst, void *R, uint32_t K,
+ uint32_t S, uint64_t (*Mapper)(uint32_t, uint64_t));
+
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;
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 {