61#ifndef INSTR_PROF_VISIBILITY
62#define INSTR_PROF_VISIBILITY
69#ifndef INSTR_PROF_DATA
70#define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer)
72#define INSTR_PROF_DATA_DEFINED
78 ConstantInt::get(
llvm::Type::getInt64Ty(Ctx), \
79 Inc->getHash()->getZExtValue()))
91 ConstantInt::get(
llvm::Type::getInt32Ty(Ctx), NumCounters))
93 ConstantArray::get(Int16ArrayTy, Int16ArrayVals)) \
95 ConstantInt::get(
llvm::Type::getInt32Ty(Ctx), NumBitmapBytes))
103#ifndef INSTR_PROF_VTABLE_DATA
104#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Initializer)
106#define INSTR_PROF_VTABLE_DATA_DEFINED
110 IndexedInstrProf::ComputeHash(PGOVTableName)))
112 VTablePointer, VTableAddr)
116#undef INSTR_PROF_VTABLE_DATA
131#ifndef INSTR_PROF_VALUE_NODE
132#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Initializer)
134#define INSTR_PROF_DATA_DEFINED
137 ConstantInt::get(llvm::Type::GetInt64Ty(Ctx), 0))
139 ConstantInt::get(
llvm::Type::GetInt64Ty(Ctx), 0))
142#undef INSTR_PROF_VALUE_NODE
148#ifndef INSTR_PROF_GPU_SECT
149#define INSTR_PROF_GPU_SECT(Type, LLVMType, Name, Initializer)
151#define INSTR_PROF_DATA_DEFINED
174#undef INSTR_PROF_GPU_SECT
181#ifndef INSTR_PROF_RAW_HEADER
182#define INSTR_PROF_RAW_HEADER(Type, Name, Initializer)
184#define INSTR_PROF_DATA_DEFINED
197 (uintptr_t)CountersBegin - (uintptr_t)DataBegin)
199 (uintptr_t)BitmapBegin - (uintptr_t)DataBegin)
204#undef INSTR_PROF_RAW_HEADER
211#ifndef VALUE_PROF_FUNC_PARAM
212#define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType)
213#define INSTR_PROF_COMMA
215#define INSTR_PROF_DATA_DEFINED
216#define INSTR_PROF_COMMA ,
222#undef VALUE_PROF_FUNC_PARAM
223#undef INSTR_PROF_COMMA
227#ifndef VALUE_PROF_KIND
228#define VALUE_PROF_KIND(Enumerator, Value, Descr)
230#define INSTR_PROF_DATA_DEFINED
256VALUE_PROF_KIND(IPVK_VTableTarget, 2,
"The profiled address point of the vtable")
265#undef VALUE_PROF_KIND
268#undef COVMAP_V2_OR_V3
270#define COVMAP_V2_OR_V3
273#define COVMAP_V2_OR_V3
280#ifndef COVMAP_FUNC_RECORD
281#define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Initializer)
283#define INSTR_PROF_DATA_DEFINED
293#ifdef COVMAP_V2_OR_V3
295 llvm::ConstantInt::get( \
299 llvm::ConstantInt::get( \
302 llvm::ConstantInt::get( \
303 llvm::Type::getInt64Ty(Ctx), FuncHash))
306 llvm::ConstantInt::get( \
310 CoverageMapping.size()), \
313 CoverageMapping, CoverageMapping.size(), \
316#undef COVMAP_FUNC_RECORD
323#define COVMAP_HEADER(Type, LLVMType, Name, Initializer)
325#define INSTR_PROF_DATA_DEFINED
328 llvm::ConstantInt::get(Int32Ty, NRecords))
330 llvm::ConstantInt::get(Int32Ty, FilenamesSize))
332 llvm::ConstantInt::get(Int32Ty, CoverageMappingSize))
334 llvm::ConstantInt::get(Int32Ty, CovMapVersion::CurrentVersion))
340#define COVINIT_FUNC(Type, LLVMType, Name, Initializer)
342#define INSTR_PROF_DATA_DEFINED
351#ifdef INSTR_PROF_SECT_ENTRY
352#define INSTR_PROF_DATA_DEFINED
393#undef INSTR_PROF_SECT_ENTRY
397#ifdef INSTR_PROF_VALUE_PROF_DATA
398#define INSTR_PROF_DATA_DEFINED
400#define INSTR_PROF_MAX_NUM_VAL_PER_SITE 255
419 uint8_t SiteCountArray[1];
440 LLVM_ABI void deserializeTo(InstrProfRecord &Record,
441 InstrProfSymtab *SymTab);
469 uint32_t NumValueKinds;
488 LLVM_ABI static std::unique_ptr<ValueProfData>
489 serializeFrom(
const InstrProfRecord &Record);
499 LLVM_ABI static Expected<std::unique_ptr<ValueProfData>>
500 getValueProfData(
const unsigned char *SrcBuffer,
501 const unsigned char *
const SrcBufferEnd,
518 LLVM_ABI void deserializeTo(InstrProfRecord &Record,
519 InstrProfSymtab *SymTab);
520 void operator delete(
void *ptr) { ::operator
delete(ptr); }
540 uint32_t (*GetNumValueKinds)(
const void *
Record);
541 uint32_t (*GetNumValueSites)(
const void *
Record, uint32_t VKind);
542 uint32_t (*GetNumValueData)(
const void *
Record, uint32_t VKind);
543 uint32_t (*GetNumValueDataForSite)(
const void *
R, uint32_t VK, uint32_t S);
550 uint64_t (*RemapValueData)(uint32_t, uint64_t
Value);
551 void (*GetValueForSite)(
const void *
R, InstrProfValueData *Dst, uint32_t
K,
553 ValueProfData *(*AllocValueProfData)(
size_t TotalSizeInBytes);
565#undef INSTR_PROF_VALUE_PROF_DATA
569#ifdef INSTR_PROF_COMMON_API_IMPL
570#define INSTR_PROF_DATA_DEFINED
572#define INSTR_PROF_INLINE inline
573#define INSTR_PROF_NULLPTR nullptr
575#define INSTR_PROF_INLINE
576#define INSTR_PROF_NULLPTR NULL
580#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
592 sizeof(
uint8_t) * NumValueSites;
605 sizeof(InstrProfValueData) * NumValueData;
614 This->NumValueSites));
624 for (
I = 0;
I <
This->NumValueSites;
I++)
625 NumValueData +=
This->SiteCountArray[
I];
635 return (ValueProfRecord *)((
char *)This +
645 return (ValueProfRecord *)((
char *)This +
sizeof(ValueProfData));
658 const void *
Record = Closure->Record;
660 for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
665 Closure->GetNumValueData(Record, Kind));
676 ValueProfRecordClosure *Closure,
679 const void *
Record = Closure->Record;
680 This->Kind = ValueKind;
685 uint32_t ND = Closure->GetNumValueDataForSite(Record, ValueKind, S);
686 This->SiteCountArray[S] = ND;
687 Closure->GetValueForSite(Record, DstVD, ValueKind, S);
701 ValueProfData *DstData) {
707 DstData ? DstData : Closure->AllocValueProfData(TotalSize);
709 VPD->TotalSize = TotalSize;
710 VPD->NumValueKinds = Closure->GetNumValueKinds(Closure->Record);
712 for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
722#undef INSTR_PROF_COMMON_API_IMPL
729#ifndef INSTR_PROF_DATA_DEFINED
731#ifndef INSTR_PROF_DATA_INC
732#define INSTR_PROF_DATA_INC
735#define INSTR_PROF_SIMPLE_QUOTE(x) #x
736#define INSTR_PROF_QUOTE(x) INSTR_PROF_SIMPLE_QUOTE(x)
737#define INSTR_PROF_SIMPLE_CONCAT(x,y) x ## y
738#define INSTR_PROF_CONCAT(x,y) INSTR_PROF_SIMPLE_CONCAT(x,y)
747#define INSTR_PROF_RAW_MAGIC_64 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
748 (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 | \
749 (uint64_t)'f' << 16 | (uint64_t)'r' << 8 | (uint64_t)129
750#define INSTR_PROF_RAW_MAGIC_32 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
751 (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 | \
752 (uint64_t)'f' << 16 | (uint64_t)'R' << 8 | (uint64_t)129
755#define INSTR_PROF_RAW_VERSION 10
757#define INSTR_PROF_INDEX_VERSION 13
759#define INSTR_PROF_COVMAP_VERSION 6
774#define VARIANT_MASKS_ALL 0xffffffff00000000ULL
775#define GET_VERSION(V) ((V) & ~VARIANT_MASKS_ALL)
776#define VARIANT_MASK_INSTR_LOOP_ENTRIES (0x1ULL << 55)
777#define VARIANT_MASK_IR_PROF (0x1ULL << 56)
778#define VARIANT_MASK_CSIR_PROF (0x1ULL << 57)
779#define VARIANT_MASK_INSTR_ENTRY (0x1ULL << 58)
780#define VARIANT_MASK_DBG_CORRELATE (0x1ULL << 59)
781#define VARIANT_MASK_BYTE_COVERAGE (0x1ULL << 60)
782#define VARIANT_MASK_FUNCTION_ENTRY_ONLY (0x1ULL << 61)
783#define VARIANT_MASK_MEMPROF (0x1ULL << 62)
784#define VARIANT_MASK_TEMPORAL_PROF (0x1ULL << 63)
785#define INSTR_PROF_RAW_VERSION_VAR __llvm_profile_raw_version
786#define INSTR_PROF_PROFILE_RUNTIME_VAR __llvm_profile_runtime
787#define INSTR_PROF_PROFILE_COUNTER_BIAS_VAR __llvm_profile_counter_bias
788#define INSTR_PROF_PROFILE_BITMAP_BIAS_VAR __llvm_profile_bitmap_bias
789#define INSTR_PROF_PROFILE_SET_TIMESTAMP __llvm_profile_set_timestamp
790#define INSTR_PROF_PROFILE_SAMPLING_VAR __llvm_profile_sampling
794#define INSTR_PROF_PROFILE_NAME_VAR __llvm_profile_filename
798#define INSTR_PROF_SECT_BOUNDS_TABLE __llvm_profile_sections
802#define INSTR_PROF_DATA_COMMON __llvm_prf_data
803#define INSTR_PROF_NAME_COMMON __llvm_prf_names
804#define INSTR_PROF_VNAME_COMMON __llvm_prf_vns
805#define INSTR_PROF_CNTS_COMMON __llvm_prf_cnts
806#define INSTR_PROF_BITS_COMMON __llvm_prf_bits
807#define INSTR_PROF_VALS_COMMON __llvm_prf_vals
808#define INSTR_PROF_VNODES_COMMON __llvm_prf_vnds
809#define INSTR_PROF_VTAB_COMMON __llvm_prf_vtab
810#define INSTR_PROF_COVMAP_COMMON __llvm_covmap
811#define INSTR_PROF_COVFUN_COMMON __llvm_covfun
812#define INSTR_PROF_COVDATA_COMMON __llvm_covdata
813#define INSTR_PROF_COVNAME_COMMON __llvm_covnames
814#define INSTR_PROF_COVINIT_COMMON __llvm_covinit
819#define INSTR_PROF_DATA_COFF ".lprfd$M"
820#define INSTR_PROF_NAME_COFF ".lprfn$M"
821#define INSTR_PROF_VNAME_COFF ".lprfvn$M"
822#define INSTR_PROF_CNTS_COFF ".lprfc$M"
823#define INSTR_PROF_BITS_COFF ".lprfb$M"
824#define INSTR_PROF_VALS_COFF ".lprfv$M"
825#define INSTR_PROF_VNODES_COFF ".lprfnd$M"
826#define INSTR_PROF_VTAB_COFF ".lprfvt$M"
827#define INSTR_PROF_COVMAP_COFF ".lcovmap$M"
828#define INSTR_PROF_COVFUN_COFF ".lcovfun$M"
832#define INSTR_PROF_COVDATA_COFF ".lcovd"
833#define INSTR_PROF_COVNAME_COFF ".lcovn"
837#define INSTR_PROF_COVINIT_COFF ".lcovd$M"
841#define INSTR_PROF_DATA_SECT_NAME INSTR_PROF_DATA_COFF
842#define INSTR_PROF_NAME_SECT_NAME INSTR_PROF_NAME_COFF
843#define INSTR_PROF_CNTS_SECT_NAME INSTR_PROF_CNTS_COFF
844#define INSTR_PROF_BITS_SECT_NAME INSTR_PROF_BITS_COFF
845#define INSTR_PROF_VTAB_SECT_NAME INSTR_PROF_VTAB_COFF
846#define INSTR_PROF_VNAME_SECT_NAME INSTR_PROF_VNAME_COFF
850#define INSTR_PROF_VALS_SECT_NAME INSTR_PROF_VALS_COFF
852#define INSTR_PROF_VNODES_SECT_NAME INSTR_PROF_VNODES_COFF
853#define INSTR_PROF_COVMAP_SECT_NAME INSTR_PROF_COVMAP_COFF
854#define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_COVFUN_COFF
855#define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_COVDATA_COFF
856#define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_COVNAME_COFF
857#define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_COVINIT_COFF
860#define INSTR_PROF_DATA_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_DATA_COMMON)
861#define INSTR_PROF_NAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_NAME_COMMON)
862#define INSTR_PROF_CNTS_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_CNTS_COMMON)
863#define INSTR_PROF_BITS_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_BITS_COMMON)
864#define INSTR_PROF_VTAB_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VTAB_COMMON)
865#define INSTR_PROF_VNAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VNAME_COMMON)
869#define INSTR_PROF_VALS_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VALS_COMMON)
871#define INSTR_PROF_VNODES_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VNODES_COMMON)
872#define INSTR_PROF_COVMAP_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVMAP_COMMON)
873#define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVFUN_COMMON)
874#define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVDATA_COMMON)
875#define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVNAME_COMMON)
876#define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVINIT_COMMON)
884#define INSTR_PROF_SECT_START(Sect) \
885 INSTR_PROF_CONCAT(__start_,Sect)
886#define INSTR_PROF_SECT_STOP(Sect) \
887 INSTR_PROF_CONCAT(__stop_,Sect)
890#define INSTR_PROF_VALUE_PROF_FUNC __llvm_profile_instrument_target
891#define INSTR_PROF_VALUE_PROF_FUNC_STR \
892 INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_FUNC)
893#define INSTR_PROF_VALUE_PROF_MEMOP_FUNC __llvm_profile_instrument_memop
894#define INSTR_PROF_VALUE_PROF_MEMOP_FUNC_STR \
895 INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_MEMOP_FUNC)
898#define INSTR_PROF_DATA_ALIGNMENT 8
903typedef struct InstrProfValueData {
913#undef INSTR_PROF_DATA_DEFINED
916#undef COVMAP_V2_OR_V3
918#ifdef INSTR_PROF_VALUE_PROF_MEMOP_API
921#define INSTR_PROF_INLINE inline
923#define INSTR_PROF_INLINE
956#define INSTR_PROF_NUM_BUCKETS 22
963#if defined(_MSC_VER) && !defined(__clang__)
967int InstProfClzll(
unsigned long long X) {
968 unsigned long LeadZeroIdx = 0;
969#if !defined(_M_ARM64) && !defined(_M_X64)
971 if (_BitScanReverse(&LeadZeroIdx, (
unsigned long)(
X >> 32)))
972 return (
int)(63 - (LeadZeroIdx + 32));
975 if (_BitScanReverse(&LeadZeroIdx, (
unsigned long)(
X)))
976 return (
int)(63 - LeadZeroIdx);
978 if (_BitScanReverse64(&LeadZeroIdx,
X))
return 63 - LeadZeroIdx;
983int InstProfPopcountll(
unsigned long long X) {
985 unsigned long long v =
X;
986 v =
v - ((
v >> 1) & 0x5555555555555555ULL);
987 v = (
v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL);
988 v = (
v + (
v >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
989 return (
int)((
unsigned long long)(
v * 0x0101010101010101ULL) >> 56);
995int InstProfClzll(
unsigned long long X) {
return __builtin_clzll(
X); }
997int InstProfPopcountll(
unsigned long long X) {
return __builtin_popcountll(
X); }
1006InstrProfGetRangeRepValue(
uint64_t Value) {
1010 else if (Value >= 513)
1013 else if (InstProfPopcountll(Value) == 1)
1018 return (UINT64_C(1) << (64 - InstProfClzll(Value) - 1)) + 1;
1025InstrProfIsSingleValRange(
uint64_t Value) {
1029 else if (InstProfPopcountll(Value) == 1)
#define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Initializer)
#define INSTR_PROF_GPU_SECT(Type, LLVMType, Name, Initializer)
#define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer)
#define INSTR_PROF_VISIBILITY
#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Initializer)
#define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Init)
#define COVMAP_HEADER(Type, LLVMType, Name, Initializer)
#define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType)
#define COVINIT_FUNC(Type, LLVMType, Name, Initializer)
#define VALUE_PROF_KIND(Enumerator, Value, Descr)
#define INSTR_PROF_RAW_HEADER(Type, Name, Initializer)
#define offsetof(TYPE, MEMBER)
#define INSTR_PROF_INLINE
#define INSTR_PROF_QUOTE(x)
#define INSTR_PROF_COVINIT_COFF
#define INSTR_PROF_VTAB_COFF
#define INSTR_PROF_COVFUN_COFF
#define INSTR_PROF_CNTS_COFF
#define INSTR_PROF_COVMAP_COMMON
#define INSTR_PROF_VALS_COMMON
#define INSTR_PROF_VTAB_COMMON
#define INSTR_PROF_COVNAME_COFF
#define INSTR_PROF_NAME_COFF
#define INSTR_PROF_VALS_COFF
#define INSTR_PROF_COVMAP_COFF
#define INSTR_PROF_BITS_COMMON
#define INSTR_PROF_VNODES_COMMON
#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix)
#define INSTR_PROF_COVDATA_COMMON
#define INSTR_PROF_DATA_COMMON
#define INSTR_PROF_COVFUN_COMMON
#define INSTR_PROF_COVNAME_COMMON
#define INSTR_PROF_COVDATA_COFF
#define INSTR_PROF_VNAME_COFF
#define INSTR_PROF_VNAME_COMMON
#define INSTR_PROF_VNODES_COFF
#define INSTR_PROF_COVINIT_COMMON
#define INSTR_PROF_NAME_COMMON
#define INSTR_PROF_DATA_COFF
#define INSTR_PROF_BITS_COFF
#define INSTR_PROF_CNTS_COMMON
static unsigned getSize(unsigned Kind)
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with array type with an element count and element type match...
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
std::enable_if_t< std::is_arithmetic< T >::value, void > swapBytes(T &value)
This is an optimization pass for GlobalISel generic memory operations.
INSTR_PROF_VISIBILITY INSTR_PROF_INLINE uint32_t getValueProfRecordSize(uint32_t NumValueSites, uint32_t NumValueData)
Return the total size of the value profile record including the header and the value data.
INSTR_PROF_VISIBILITY ValueProfRecord * getValueProfRecordNext(ValueProfRecord *VPR)
Use this method to advance to the next This ValueProfRecord.
INSTR_PROF_VISIBILITY uint32_t getValueProfRecordHeaderSize(uint32_t NumValueSites)
struct llvm::ValueProfData ValueProfData
Per-function header/control data structure for value profiling data in indexed format.
INSTR_PROF_VISIBILITY uint32_t getValueProfDataSize(ValueProfRecordClosure *Closure)
Return the total size in bytes of the on-disk value profile data given the data stored in Record.
FunctionAddr NumValueSites[IPVK_Last+1]
FunctionAddr VTableAddr Count
LLVM_ABI StringRef getPGOFuncNameVarInitializer(GlobalVariable *NameVar)
Return the initializer in string of the PGO name var NameVar.
INSTR_PROF_VISIBILITY ValueProfRecord * getFirstValueProfRecord(ValueProfData *VPD)
Return the first ValueProfRecord instance.
INSTR_PROF_VISIBILITY ValueProfData * serializeValueProfDataFrom(ValueProfRecordClosure *Closure, ValueProfData *DstData)
Extract value profile data of a function from the Closure and serialize the data into DstData if it i...
INSTR_PROF_VISIBILITY InstrProfValueData * getValueProfRecordValueData(ValueProfRecord *VPR)
Return the pointer to the start of value data array.
INSTR_PROF_VISIBILITY void serializeValueProfRecordFrom(ValueProfRecord *This, ValueProfRecordClosure *Closure, uint32_t ValueKind, uint32_t NumValueSites)
Extract value profile data of a function for the profile kind ValueKind from the Closure and serializ...
INSTR_PROF_VISIBILITY INSTR_PROF_INLINE uint32_t getValueProfRecordNumValueData(ValueProfRecord *This)
Return the total number of value data for This record.
struct llvm::ValueProfRecordClosure ValueProfRecordClosure