Home | History | Annotate | Line # | Download | only in profile
      1 /*===-- InstrProfData.inc - instr profiling runtime structures -*- C++ -*-=== *\
      2 |*
      3 |*                     The LLVM Compiler Infrastructure
      4 |*
      5 |* This file is distributed under the University of Illinois Open Source
      6 |* License. See LICENSE.TXT for details.
      7 |*
      8 \*===----------------------------------------------------------------------===*/
      9 /*
     10  * This is the master file that defines all the data structure, signature,
     11  * constant literals that are shared across profiling runtime library,
     12  * compiler (instrumentation), and host tools (reader/writer). The entities
     13  * defined in this file affect the profile runtime ABI, the raw profile format,
     14  * or both.
     15  *
     16  * The file has two identical copies. The master copy lives in LLVM and
     17  * the other one  sits in compiler-rt/lib/profile directory. To make changes
     18  * in this file, first modify the master copy and copy it over to compiler-rt.
     19  * Testing of any change in this file can start only after the two copies are
     20  * synced up.
     21  *
     22  * The first part of the file includes macros that defines types, names, and
     23  * initializers for the member fields of the core data structures. The field
     24  * declarations for one structure is enabled by defining the field activation
     25  * macro associated with that structure. Only one field activation record
     26  * can be defined at one time and the rest definitions will be filtered out by
     27  * the preprocessor.
     28  *
     29  * Examples of how the template is used to instantiate structure definition:
     30  * 1. To declare a structure:
     31  *
     32  * struct ProfData {
     33  * #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
     34  *    Type Name;
     35  * #include "llvm/ProfileData/InstrProfData.inc"
     36  * };
     37  *
     38  * 2. To construct LLVM type arrays for the struct type:
     39  *
     40  * Type *DataTypes[] = {
     41  * #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
     42  *   LLVMType,
     43  * #include "llvm/ProfileData/InstrProfData.inc"
     44  * };
     45  *
     46  * 4. To construct constant array for the initializers:
     47  * #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
     48  *   Initializer,
     49  * Constant *ConstantVals[] = {
     50  * #include "llvm/ProfileData/InstrProfData.inc"
     51  * };
     52  *
     53  *
     54  * The second part of the file includes definitions all other entities that
     55  * are related to runtime ABI and format. When no field activation macro is
     56  * defined, this file can be included to introduce the definitions.
     57  *
     58 \*===----------------------------------------------------------------------===*/
     59 
     60 /* INSTR_PROF_DATA start. */
     61 /* Definition of member fields of the per-function control structure. */
     62 #ifndef INSTR_PROF_DATA
     63 #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer)
     64 #else
     65 #define INSTR_PROF_DATA_DEFINED
     66 #endif
     67 
     68 INSTR_PROF_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), NameSize, \
     69                 ConstantInt::get(llvm::Type::getInt32Ty(Ctx), \
     70                 NamePtr->getType()->getPointerElementType()->getArrayNumElements()))
     71 INSTR_PROF_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), NumCounters, \
     72                 ConstantInt::get(llvm::Type::getInt32Ty(Ctx), NumCounters))
     73 INSTR_PROF_DATA(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \
     74                 ConstantInt::get(llvm::Type::getInt64Ty(Ctx), \
     75                 Inc->getHash()->getZExtValue()))
     76 INSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), NamePtr, \
     77                 ConstantExpr::getBitCast(NamePtr, llvm::Type::getInt8PtrTy(Ctx)))
     78 INSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt64PtrTy(Ctx), CounterPtr, \
     79                 ConstantExpr::getBitCast(CounterPtr, \
     80                 llvm::Type::getInt64PtrTy(Ctx)))
     81 INSTR_PROF_DATA(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), FunctionPointer, \
     82                 FunctionAddr)
     83 INSTR_PROF_DATA(IntPtrT, llvm::Type::getInt8PtrTy(Ctx), Values, \
     84                 ConstantPointerNull::get(Int8PtrTy))
     85 INSTR_PROF_DATA(const uint16_t, Int16ArrayTy, NumValueSites[IPVK_Last+1], \
     86                 ConstantArray::get(Int16ArrayTy, Int16ArrayVals))
     87 #undef INSTR_PROF_DATA
     88 /* INSTR_PROF_DATA end. */
     89 
     90 /* INSTR_PROF_RAW_HEADER  start */
     91 /* Definition of member fields of the raw profile header data structure. */
     92 #ifndef INSTR_PROF_RAW_HEADER
     93 #define INSTR_PROF_RAW_HEADER(Type, Name, Initializer)
     94 #else
     95 #define INSTR_PROF_DATA_DEFINED
     96 #endif
     97 INSTR_PROF_RAW_HEADER(uint64_t, Magic, __llvm_profile_get_magic())
     98 INSTR_PROF_RAW_HEADER(uint64_t, Version, __llvm_profile_get_version())
     99 INSTR_PROF_RAW_HEADER(uint64_t, DataSize, DataSize)
    100 INSTR_PROF_RAW_HEADER(uint64_t, CountersSize, CountersSize)
    101 INSTR_PROF_RAW_HEADER(uint64_t, NamesSize,  NamesSize)
    102 INSTR_PROF_RAW_HEADER(uint64_t, CountersDelta, (uintptr_t)CountersBegin)
    103 INSTR_PROF_RAW_HEADER(uint64_t, NamesDelta, (uintptr_t)NamesBegin)
    104 INSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last)
    105 INSTR_PROF_RAW_HEADER(uint64_t, ValueDataSize, ValueDataSize)
    106 INSTR_PROF_RAW_HEADER(uint64_t, ValueDataDelta, (uintptr_t)ValueDataBegin)
    107 #undef INSTR_PROF_RAW_HEADER
    108 /* INSTR_PROF_RAW_HEADER  end */
    109 
    110 /* VALUE_PROF_FUNC_PARAM start */
    111 /* Definition of parameter types of the runtime API used to do value profiling
    112  * for a given value site.
    113  */
    114 #ifndef VALUE_PROF_FUNC_PARAM
    115 #define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType)
    116 #define INSTR_PROF_COMMA
    117 #else
    118 #define INSTR_PROF_DATA_DEFINED
    119 #define INSTR_PROF_COMMA ,
    120 #endif
    121 VALUE_PROF_FUNC_PARAM(uint64_t, TargetValue, Type::getInt64Ty(Ctx)) \
    122                       INSTR_PROF_COMMA
    123 VALUE_PROF_FUNC_PARAM(void *, Data, Type::getInt8PtrTy(Ctx)) INSTR_PROF_COMMA
    124 VALUE_PROF_FUNC_PARAM(uint32_t, CounterIndex, Type::getInt32Ty(Ctx))
    125 #undef VALUE_PROF_FUNC_PARAM
    126 #undef INSTR_PROF_COMMA
    127 /* VALUE_PROF_FUNC_PARAM end */
    128 
    129 /* VALUE_PROF_KIND start */
    130 #ifndef VALUE_PROF_KIND
    131 #define VALUE_PROF_KIND(Enumerator, Value)
    132 #else
    133 #define INSTR_PROF_DATA_DEFINED
    134 #endif
    135 VALUE_PROF_KIND(IPVK_IndirectCallTarget, 0)
    136 /* These two kinds must be the last to be
    137  * declared. This is to make sure the string
    138  * array created with the template can be
    139  * indexed with the kind value.
    140  */
    141 VALUE_PROF_KIND(IPVK_First, IPVK_IndirectCallTarget)
    142 VALUE_PROF_KIND(IPVK_Last, IPVK_IndirectCallTarget)
    143 
    144 #undef VALUE_PROF_KIND
    145 /* VALUE_PROF_KIND end */
    146 
    147 /* COVMAP_FUNC_RECORD start */
    148 /* Definition of member fields of the function record structure in coverage
    149  * map.
    150  */
    151 #ifndef COVMAP_FUNC_RECORD
    152 #define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Initializer)
    153 #else
    154 #define INSTR_PROF_DATA_DEFINED
    155 #endif
    156 COVMAP_FUNC_RECORD(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), \
    157                    NamePtr, llvm::ConstantExpr::getBitCast(NamePtr, \
    158                    llvm::Type::getInt8PtrTy(Ctx)))
    159 COVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), NameSize, \
    160                    llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx),\
    161                    NameValue.size()))
    162 COVMAP_FUNC_RECORD(const uint32_t, llvm::Type::getInt32Ty(Ctx), DataSize, \
    163                    llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx),\
    164                    CoverageMapping.size()))
    165 COVMAP_FUNC_RECORD(const uint64_t, llvm::Type::getInt64Ty(Ctx), FuncHash, \
    166                    llvm::ConstantInt::get(llvm::Type::getInt64Ty(Ctx), FuncHash))
    167 #undef COVMAP_FUNC_RECORD
    168 /* COVMAP_FUNC_RECORD end.  */
    169 
    170 /* COVMAP_HEADER start */
    171 /* Definition of member fields of coverage map header.
    172  */
    173 #ifndef COVMAP_HEADER
    174 #define COVMAP_HEADER(Type, LLVMType, Name, Initializer)
    175 #else
    176 #define INSTR_PROF_DATA_DEFINED
    177 #endif
    178 COVMAP_HEADER(uint32_t, Int32Ty, NRecords, \
    179               llvm::ConstantInt::get(Int32Ty,  FunctionRecords.size()))
    180 COVMAP_HEADER(uint32_t, Int32Ty, FilenamesSize, \
    181               llvm::ConstantInt::get(Int32Ty, FilenamesSize))
    182 COVMAP_HEADER(uint32_t, Int32Ty, CoverageSize, \
    183               llvm::ConstantInt::get(Int32Ty, CoverageMappingSize))
    184 COVMAP_HEADER(uint32_t, Int32Ty, Version, \
    185               llvm::ConstantInt::get(Int32Ty, CovMapVersion::CurrentVersion))
    186 #undef COVMAP_HEADER
    187 /* COVMAP_HEADER end.  */
    188 
    189 
    190 #ifdef INSTR_PROF_VALUE_PROF_DATA
    191 #define INSTR_PROF_DATA_DEFINED
    192 
    193 #define INSTR_PROF_MAX_NUM_VAL_PER_SITE 255
    194 /*!
    195  * This is the header of the data structure that defines the on-disk
    196  * layout of the value profile data of a particular kind for one function.
    197  */
    198 typedef struct ValueProfRecord {
    199   /* The kind of the value profile record. */
    200   uint32_t Kind;
    201   /*
    202    * The number of value profile sites. It is guaranteed to be non-zero;
    203    * otherwise the record for this kind won't be emitted.
    204    */
    205   uint32_t NumValueSites;
    206   /*
    207    * The first element of the array that stores the number of profiled
    208    * values for each value site. The size of the array is NumValueSites.
    209    * Since NumValueSites is greater than zero, there is at least one
    210    * element in the array.
    211    */
    212   uint8_t SiteCountArray[1];
    213 
    214   /*
    215    * The fake declaration is for documentation purpose only.
    216    * Align the start of next field to be on 8 byte boundaries.
    217   uint8_t Padding[X];
    218    */
    219 
    220   /* The array of value profile data. The size of the array is the sum
    221    * of all elements in SiteCountArray[].
    222   InstrProfValueData ValueData[];
    223    */
    224 
    225 #ifdef __cplusplus
    226   /*!
    227    * \brief Return the number of value sites.
    228    */
    229   uint32_t getNumValueSites() const { return NumValueSites; }
    230   /*!
    231    * \brief Read data from this record and save it to Record.
    232    */
    233   void deserializeTo(InstrProfRecord &Record,
    234                      InstrProfRecord::ValueMapType *VMap);
    235   /*
    236    * In-place byte swap:
    237    * Do byte swap for this instance. \c Old is the original order before
    238    * the swap, and \c New is the New byte order.
    239    */
    240   void swapBytes(support::endianness Old, support::endianness New);
    241 #endif
    242 } ValueProfRecord;
    243 
    244 /*!
    245  * Per-function header/control data structure for value profiling
    246  * data in indexed format.
    247  */
    248 typedef struct ValueProfData {
    249   /*
    250    * Total size in bytes including this field. It must be a multiple
    251    * of sizeof(uint64_t).
    252    */
    253   uint32_t TotalSize;
    254   /*
    255    *The number of value profile kinds that has value profile data.
    256    * In this implementation, a value profile kind is considered to
    257    * have profile data if the number of value profile sites for the
    258    * kind is not zero. More aggressively, the implementation can
    259    * choose to check the actual data value: if none of the value sites
    260    * has any profiled values, the kind can be skipped.
    261    */
    262   uint32_t NumValueKinds;
    263 
    264   /*
    265    * Following are a sequence of variable length records. The prefix/header
    266    * of each record is defined by ValueProfRecord type. The number of
    267    * records is NumValueKinds.
    268    * ValueProfRecord Record_1;
    269    * ValueProfRecord Record_N;
    270    */
    271 
    272 #if __cplusplus
    273   /*!
    274    * Return the total size in bytes of the on-disk value profile data
    275    * given the data stored in Record.
    276    */
    277   static uint32_t getSize(const InstrProfRecord &Record);
    278   /*!
    279    * Return a pointer to \c ValueProfData instance ready to be streamed.
    280    */
    281   static std::unique_ptr<ValueProfData>
    282   serializeFrom(const InstrProfRecord &Record);
    283   /*!
    284    * Check the integrity of the record. Return the error code when
    285    * an error is detected, otherwise return instrprof_error::success.
    286    */
    287   instrprof_error checkIntegrity();
    288   /*!
    289    * Return a pointer to \c ValueProfileData instance ready to be read.
    290    * All data in the instance are properly byte swapped. The input
    291    * data is assumed to be in little endian order.
    292    */
    293   static ErrorOr<std::unique_ptr<ValueProfData>>
    294   getValueProfData(const unsigned char *SrcBuffer,
    295                    const unsigned char *const SrcBufferEnd,
    296                    support::endianness SrcDataEndianness);
    297   /*!
    298    * Swap byte order from \c Endianness order to host byte order.
    299    */
    300   void swapBytesToHost(support::endianness Endianness);
    301   /*!
    302    * Swap byte order from host byte order to \c Endianness order.
    303    */
    304   void swapBytesFromHost(support::endianness Endianness);
    305   /*!
    306    * Return the total size of \c ValueProfileData.
    307    */
    308   uint32_t getSize() const { return TotalSize; }
    309   /*!
    310    * Read data from this data and save it to \c Record.
    311    */
    312   void deserializeTo(InstrProfRecord &Record,
    313                      InstrProfRecord::ValueMapType *VMap);
    314   void operator delete(void *ptr) { ::operator delete(ptr); }
    315 #endif
    316 } ValueProfData;
    317 
    318 /*
    319  * The closure is designed to abstact away two types of value profile data:
    320  * - InstrProfRecord which is the primary data structure used to
    321  *   represent profile data in host tools (reader, writer, and profile-use)
    322  * - value profile runtime data structure suitable to be used by C
    323  *   runtime library.
    324  *
    325  * Both sources of data need to serialize to disk/memory-buffer in common
    326  * format: ValueProfData. The abstraction allows compiler-rt's raw profiler
    327  * writer to share the same format and code with indexed profile writer.
    328  *
    329  * For documentation of the member methods below, refer to corresponding methods
    330  * in class InstrProfRecord.
    331  */
    332 typedef struct ValueProfRecordClosure {
    333   const void *Record;
    334   uint32_t (*GetNumValueKinds)(const void *Record);
    335   uint32_t (*GetNumValueSites)(const void *Record, uint32_t VKind);
    336   uint32_t (*GetNumValueData)(const void *Record, uint32_t VKind);
    337   uint32_t (*GetNumValueDataForSite)(const void *R, uint32_t VK, uint32_t S);
    338 
    339   /*
    340    * After extracting the value profile data from the value profile record,
    341    * this method is used to map the in-memory value to on-disk value. If
    342    * the method is null, value will be written out untranslated.
    343    */
    344   uint64_t (*RemapValueData)(uint32_t, uint64_t Value);
    345   void (*GetValueForSite)(const void *R, InstrProfValueData *Dst, uint32_t K,
    346                           uint32_t S, uint64_t (*Mapper)(uint32_t, uint64_t));
    347   ValueProfData *(*AllocValueProfData)(size_t TotalSizeInBytes);
    348 } ValueProfRecordClosure;
    349 
    350 /*
    351  * A wrapper struct that represents value profile runtime data.
    352  * Like InstrProfRecord class which is used by profiling host tools,
    353  * ValueProfRuntimeRecord also implements the abstract intefaces defined in
    354  * ValueProfRecordClosure so that the runtime data can be serialized using
    355  * shared C implementation. In this structure, NumValueSites and Nodes
    356  * members are the primary fields while other fields hold the derived
    357  * information for fast implementation of closure interfaces.
    358  */
    359 typedef struct ValueProfRuntimeRecord {
    360   /* Number of sites for each value profile kind.  */
    361   const uint16_t *NumValueSites;
    362   /* An array of linked-list headers. The size of of the array is the
    363    * total number of value profile sites : sum(NumValueSites[*])). Each
    364    * linked-list stores the values profiled for a value profile site. */
    365   ValueProfNode **Nodes;
    366 
    367   /* Total number of value profile kinds which have at least one
    368    *  value profile sites. */
    369   uint32_t NumValueKinds;
    370   /* An array recording the number of values tracked at each site.
    371    * The size of the array is TotalNumValueSites. */
    372   uint8_t *SiteCountArray[IPVK_Last + 1];
    373   ValueProfNode **NodesKind[IPVK_Last + 1];
    374 } ValueProfRuntimeRecord;
    375 
    376 /* Forward declarations of C interfaces.  */
    377 int initializeValueProfRuntimeRecord(ValueProfRuntimeRecord *RuntimeRecord,
    378                                      const uint16_t *NumValueSites,
    379                                      ValueProfNode **Nodes);
    380 void finalizeValueProfRuntimeRecord(ValueProfRuntimeRecord *RuntimeRecord);
    381 uint32_t getValueProfDataSizeRT(const ValueProfRuntimeRecord *Record);
    382 ValueProfData *
    383 serializeValueProfDataFromRT(const ValueProfRuntimeRecord *Record,
    384                              ValueProfData *Dst);
    385 uint32_t getNumValueKindsRT(const void *R);
    386 
    387 #undef INSTR_PROF_VALUE_PROF_DATA
    388 #endif  /* INSTR_PROF_VALUE_PROF_DATA */
    389 
    390 
    391 #ifdef INSTR_PROF_COMMON_API_IMPL
    392 #define INSTR_PROF_DATA_DEFINED
    393 #ifdef __cplusplus
    394 #define INSTR_PROF_INLINE inline
    395 #define INSTR_PROF_NULLPTR nullptr
    396 #else
    397 #define INSTR_PROF_INLINE
    398 #define INSTR_PROF_NULLPTR NULL
    399 #endif
    400 
    401 #ifndef offsetof
    402 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
    403 #endif
    404 
    405 /*!
    406  * \brief Return the \c ValueProfRecord header size including the
    407  * padding bytes.
    408  */
    409 INSTR_PROF_INLINE
    410 uint32_t getValueProfRecordHeaderSize(uint32_t NumValueSites) {
    411   uint32_t Size = offsetof(ValueProfRecord, SiteCountArray) +
    412                   sizeof(uint8_t) * NumValueSites;
    413   /* Round the size to multiple of 8 bytes. */
    414   Size = (Size + 7) & ~7;
    415   return Size;
    416 }
    417 
    418 /*!
    419  * \brief Return the total size of the value profile record including the
    420  * header and the value data.
    421  */
    422 INSTR_PROF_INLINE
    423 uint32_t getValueProfRecordSize(uint32_t NumValueSites,
    424                                 uint32_t NumValueData) {
    425   return getValueProfRecordHeaderSize(NumValueSites) +
    426          sizeof(InstrProfValueData) * NumValueData;
    427 }
    428 
    429 /*!
    430  * \brief Return the pointer to the start of value data array.
    431  */
    432 INSTR_PROF_INLINE
    433 InstrProfValueData *getValueProfRecordValueData(ValueProfRecord *This) {
    434   return (InstrProfValueData *)((char *)This + getValueProfRecordHeaderSize(
    435                                                    This->NumValueSites));
    436 }
    437 
    438 /*!
    439  * \brief Return the total number of value data for \c This record.
    440  */
    441 INSTR_PROF_INLINE
    442 uint32_t getValueProfRecordNumValueData(ValueProfRecord *This) {
    443   uint32_t NumValueData = 0;
    444   uint32_t I;
    445   for (I = 0; I < This->NumValueSites; I++)
    446     NumValueData += This->SiteCountArray[I];
    447   return NumValueData;
    448 }
    449 
    450 /*!
    451  * \brief Use this method to advance to the next \c This \c ValueProfRecord.
    452  */
    453 INSTR_PROF_INLINE
    454 ValueProfRecord *getValueProfRecordNext(ValueProfRecord *This) {
    455   uint32_t NumValueData = getValueProfRecordNumValueData(This);
    456   return (ValueProfRecord *)((char *)This +
    457                              getValueProfRecordSize(This->NumValueSites,
    458                                                     NumValueData));
    459 }
    460 
    461 /*!
    462  * \brief Return the first \c ValueProfRecord instance.
    463  */
    464 INSTR_PROF_INLINE
    465 ValueProfRecord *getFirstValueProfRecord(ValueProfData *This) {
    466   return (ValueProfRecord *)((char *)This + sizeof(ValueProfData));
    467 }
    468 
    469 /* Closure based interfaces.  */
    470 
    471 /*!
    472  * Return the total size in bytes of the on-disk value profile data
    473  * given the data stored in Record.
    474  */
    475 uint32_t getValueProfDataSize(ValueProfRecordClosure *Closure) {
    476   uint32_t Kind;
    477   uint32_t TotalSize = sizeof(ValueProfData);
    478   const void *Record = Closure->Record;
    479   uint32_t NumValueKinds = Closure->GetNumValueKinds(Record);
    480   if (NumValueKinds == 0)
    481     return TotalSize;
    482 
    483   for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
    484     uint32_t NumValueSites = Closure->GetNumValueSites(Record, Kind);
    485     if (!NumValueSites)
    486       continue;
    487     TotalSize += getValueProfRecordSize(NumValueSites,
    488                                         Closure->GetNumValueData(Record, Kind));
    489   }
    490   return TotalSize;
    491 }
    492 
    493 /*!
    494  * Extract value profile data of a function for the profile kind \c ValueKind
    495  * from the \c Closure and serialize the data into \c This record instance.
    496  */
    497 void serializeValueProfRecordFrom(ValueProfRecord *This,
    498                                   ValueProfRecordClosure *Closure,
    499                                   uint32_t ValueKind, uint32_t NumValueSites) {
    500   uint32_t S;
    501   const void *Record = Closure->Record;
    502   This->Kind = ValueKind;
    503   This->NumValueSites = NumValueSites;
    504   InstrProfValueData *DstVD = getValueProfRecordValueData(This);
    505 
    506   for (S = 0; S < NumValueSites; S++) {
    507     uint32_t ND = Closure->GetNumValueDataForSite(Record, ValueKind, S);
    508     This->SiteCountArray[S] = ND;
    509     Closure->GetValueForSite(Record, DstVD, ValueKind, S,
    510                              Closure->RemapValueData);
    511     DstVD += ND;
    512   }
    513 }
    514 
    515 /*!
    516  * Extract value profile data of a function  from the \c Closure
    517  * and serialize the data into \c DstData if it is not NULL or heap
    518  * memory allocated by the \c Closure's allocator method.
    519  */
    520 ValueProfData *serializeValueProfDataFrom(ValueProfRecordClosure *Closure,
    521                                           ValueProfData *DstData) {
    522   uint32_t Kind;
    523   uint32_t TotalSize = getValueProfDataSize(Closure);
    524 
    525   ValueProfData *VPD =
    526       DstData ? DstData : Closure->AllocValueProfData(TotalSize);
    527 
    528   VPD->TotalSize = TotalSize;
    529   VPD->NumValueKinds = Closure->GetNumValueKinds(Closure->Record);
    530   ValueProfRecord *VR = getFirstValueProfRecord(VPD);
    531   for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
    532     uint32_t NumValueSites = Closure->GetNumValueSites(Closure->Record, Kind);
    533     if (!NumValueSites)
    534       continue;
    535     serializeValueProfRecordFrom(VR, Closure, Kind, NumValueSites);
    536     VR = getValueProfRecordNext(VR);
    537   }
    538   return VPD;
    539 }
    540 
    541 /*
    542  * The value profiler runtime library stores the value profile data
    543  * for a given function in \c NumValueSites and \c Nodes structures.
    544  * \c ValueProfRuntimeRecord class is used to encapsulate the runtime
    545  * profile data and provides fast interfaces to retrieve the profile
    546  * information. This interface is used to initialize the runtime record
    547  * and pre-compute the information needed for efficient implementation
    548  * of callbacks required by ValueProfRecordClosure class.
    549  */
    550 int initializeValueProfRuntimeRecord(ValueProfRuntimeRecord *RuntimeRecord,
    551                                      const uint16_t *NumValueSites,
    552                                      ValueProfNode **Nodes) {
    553   unsigned I, J, S = 0, NumValueKinds = 0;
    554   RuntimeRecord->NumValueSites = NumValueSites;
    555   RuntimeRecord->Nodes = Nodes;
    556   for (I = 0; I <= IPVK_Last; I++) {
    557     uint16_t N = NumValueSites[I];
    558     if (!N) {
    559       RuntimeRecord->SiteCountArray[I] = INSTR_PROF_NULLPTR;
    560       continue;
    561     }
    562     NumValueKinds++;
    563     RuntimeRecord->SiteCountArray[I] = (uint8_t *)calloc(N, 1);
    564     if (!RuntimeRecord->SiteCountArray[I])
    565       return 1;
    566     RuntimeRecord->NodesKind[I] = Nodes ? &Nodes[S] : INSTR_PROF_NULLPTR;
    567     for (J = 0; J < N; J++) {
    568       /* Compute value count for each site. */
    569       uint32_t C = 0;
    570       ValueProfNode *Site =
    571           Nodes ? RuntimeRecord->NodesKind[I][J] : INSTR_PROF_NULLPTR;
    572       while (Site) {
    573         C++;
    574         Site = Site->Next;
    575       }
    576       if (C > UCHAR_MAX)
    577         C = UCHAR_MAX;
    578       RuntimeRecord->SiteCountArray[I][J] = C;
    579     }
    580     S += N;
    581   }
    582   RuntimeRecord->NumValueKinds = NumValueKinds;
    583   return 0;
    584 }
    585 
    586 void finalizeValueProfRuntimeRecord(ValueProfRuntimeRecord *RuntimeRecord) {
    587   unsigned I;
    588   for (I = 0; I <= IPVK_Last; I++) {
    589     if (RuntimeRecord->SiteCountArray[I])
    590       free(RuntimeRecord->SiteCountArray[I]);
    591   }
    592 }
    593 
    594 /* ValueProfRecordClosure Interface implementation for
    595  * ValueProfDataRuntimeRecord.  */
    596 uint32_t getNumValueKindsRT(const void *R) {
    597   return ((const ValueProfRuntimeRecord *)R)->NumValueKinds;
    598 }
    599 
    600 uint32_t getNumValueSitesRT(const void *R, uint32_t VK) {
    601   return ((const ValueProfRuntimeRecord *)R)->NumValueSites[VK];
    602 }
    603 
    604 uint32_t getNumValueDataForSiteRT(const void *R, uint32_t VK, uint32_t S) {
    605   const ValueProfRuntimeRecord *Record = (const ValueProfRuntimeRecord *)R;
    606   return Record->SiteCountArray[VK][S];
    607 }
    608 
    609 uint32_t getNumValueDataRT(const void *R, uint32_t VK) {
    610   unsigned I, S = 0;
    611   const ValueProfRuntimeRecord *Record = (const ValueProfRuntimeRecord *)R;
    612   if (Record->SiteCountArray[VK] == INSTR_PROF_NULLPTR)
    613     return 0;
    614   for (I = 0; I < Record->NumValueSites[VK]; I++)
    615     S += Record->SiteCountArray[VK][I];
    616   return S;
    617 }
    618 
    619 void getValueForSiteRT(const void *R, InstrProfValueData *Dst, uint32_t VK,
    620                        uint32_t S, uint64_t (*Mapper)(uint32_t, uint64_t)) {
    621   unsigned I, N = 0;
    622   const ValueProfRuntimeRecord *Record = (const ValueProfRuntimeRecord *)R;
    623   N = getNumValueDataForSiteRT(R, VK, S);
    624   if (N == 0)
    625     return;
    626   ValueProfNode *VNode = Record->NodesKind[VK][S];
    627   for (I = 0; I < N; I++) {
    628     Dst[I] = VNode->VData;
    629     VNode = VNode->Next;
    630   }
    631 }
    632 
    633 ValueProfData *allocValueProfDataRT(size_t TotalSizeInBytes) {
    634   return (ValueProfData *)calloc(TotalSizeInBytes, 1);
    635 }
    636 
    637 static ValueProfRecordClosure RTRecordClosure = {
    638     INSTR_PROF_NULLPTR, getNumValueKindsRT,       getNumValueSitesRT,
    639     getNumValueDataRT,  getNumValueDataForSiteRT, INSTR_PROF_NULLPTR,
    640     getValueForSiteRT,  allocValueProfDataRT};
    641 
    642 /*
    643  * Return the size of ValueProfData structure to store data
    644  * recorded in the runtime record.
    645  */
    646 uint32_t getValueProfDataSizeRT(const ValueProfRuntimeRecord *Record) {
    647   RTRecordClosure.Record = Record;
    648   return getValueProfDataSize(&RTRecordClosure);
    649 }
    650 
    651 /*
    652  * Return a ValueProfData instance that stores the data collected
    653  * from runtime. If \c DstData is provided by the caller, the value
    654  * profile data will be store in *DstData and DstData is returned,
    655  * otherwise the method will allocate space for the value data and
    656  * return pointer to the newly allocated space.
    657  */
    658 ValueProfData *
    659 serializeValueProfDataFromRT(const ValueProfRuntimeRecord *Record,
    660                              ValueProfData *DstData) {
    661   RTRecordClosure.Record = Record;
    662   return serializeValueProfDataFrom(&RTRecordClosure, DstData);
    663 }
    664 
    665 #undef INSTR_PROF_COMMON_API_IMPL
    666 #endif /* INSTR_PROF_COMMON_API_IMPL */
    667 
    668 /*============================================================================*/
    669 
    670 #ifndef INSTR_PROF_DATA_DEFINED
    671 
    672 #ifndef INSTR_PROF_DATA_INC
    673 #define INSTR_PROF_DATA_INC
    674 
    675 /* Helper macros.  */
    676 #define INSTR_PROF_SIMPLE_QUOTE(x) #x
    677 #define INSTR_PROF_QUOTE(x) INSTR_PROF_SIMPLE_QUOTE(x)
    678 #define INSTR_PROF_SIMPLE_CONCAT(x,y) x ## y
    679 #define INSTR_PROF_CONCAT(x,y) INSTR_PROF_SIMPLE_CONCAT(x,y)
    680 
    681 /* Magic number to detect file format and endianness.
    682  * Use 255 at one end, since no UTF-8 file can use that character.  Avoid 0,
    683  * so that utilities, like strings, don't grab it as a string.  129 is also
    684  * invalid UTF-8, and high enough to be interesting.
    685  * Use "lprofr" in the centre to stand for "LLVM Profile Raw", or "lprofR"
    686  * for 32-bit platforms.
    687  */
    688 #define INSTR_PROF_RAW_MAGIC_64 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
    689        (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 |  \
    690         (uint64_t)'f' << 16 | (uint64_t)'r' << 8 | (uint64_t)129
    691 #define INSTR_PROF_RAW_MAGIC_32 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
    692        (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 |  \
    693         (uint64_t)'f' << 16 | (uint64_t)'R' << 8 | (uint64_t)129
    694 
    695 /* Raw profile format version. */
    696 #define INSTR_PROF_RAW_VERSION 2
    697 #define INSTR_PROF_INDEX_VERSION 3
    698 #define INSTR_PROF_COVMAP_VERSION 0
    699 
    700 /* Profile version is always of type uint64_t. Reserve the upper 8 bits in the
    701  * version for other variants of profile. We set the lowest bit of the upper 8
    702  * bits (i.e. bit 56) to 1 to indicate if this is an IR-level instrumentaiton
    703  * generated profile, and 0 if this is a Clang FE generated profile.
    704 */
    705 #define VARIANT_MASKS_ALL 0xff00000000000000ULL
    706 #define GET_VERSION(V) ((V) & ~VARIANT_MASKS_ALL)
    707 
    708 /* Runtime section names and name strings.  */
    709 #define INSTR_PROF_DATA_SECT_NAME __llvm_prf_data
    710 #define INSTR_PROF_NAME_SECT_NAME __llvm_prf_names
    711 #define INSTR_PROF_CNTS_SECT_NAME __llvm_prf_cnts
    712 #define INSTR_PROF_COVMAP_SECT_NAME __llvm_covmap
    713 
    714 #define INSTR_PROF_DATA_SECT_NAME_STR                                          \
    715   INSTR_PROF_QUOTE(INSTR_PROF_DATA_SECT_NAME)
    716 #define INSTR_PROF_NAME_SECT_NAME_STR                                          \
    717   INSTR_PROF_QUOTE(INSTR_PROF_NAME_SECT_NAME)
    718 #define INSTR_PROF_CNTS_SECT_NAME_STR                                          \
    719   INSTR_PROF_QUOTE(INSTR_PROF_CNTS_SECT_NAME)
    720 #define INSTR_PROF_COVMAP_SECT_NAME_STR                                        \
    721   INSTR_PROF_QUOTE(INSTR_PROF_COVMAP_SECT_NAME)
    722 
    723 /* Macros to define start/stop section symbol for a given
    724  * section on Linux. For instance
    725  * INSTR_PROF_SECT_START(INSTR_PROF_DATA_SECT_NAME) will
    726  * expand to __start___llvm_prof_data
    727  */
    728 #define INSTR_PROF_SECT_START(Sect) \
    729         INSTR_PROF_CONCAT(__start_,Sect)
    730 #define INSTR_PROF_SECT_STOP(Sect) \
    731         INSTR_PROF_CONCAT(__stop_,Sect)
    732 
    733 /* Value Profiling API linkage name.  */
    734 #define INSTR_PROF_VALUE_PROF_FUNC __llvm_profile_instrument_target
    735 #define INSTR_PROF_VALUE_PROF_FUNC_STR \
    736         INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_FUNC)
    737 
    738 /* InstrProfile per-function control data alignment.  */
    739 #define INSTR_PROF_DATA_ALIGNMENT 8
    740 
    741 /* The data structure that represents a tracked value by the
    742  * value profiler.
    743  */
    744 typedef struct InstrProfValueData {
    745   /* Profiled value. */
    746   uint64_t Value;
    747   /* Number of times the value appears in the training run. */
    748   uint64_t Count;
    749 } InstrProfValueData;
    750 
    751 /* This is an internal data structure used by value profiler. It
    752  * is defined here to allow serialization code sharing by LLVM
    753  * to be used in unit test.
    754  */
    755 typedef struct ValueProfNode {
    756   InstrProfValueData VData;
    757   struct ValueProfNode *Next;
    758 } ValueProfNode;
    759 
    760 #endif /* INSTR_PROF_DATA_INC */
    761 
    762 #else
    763 #undef INSTR_PROF_DATA_DEFINED
    764 #endif
    765