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
149#ifndef INSTR_PROF_RAW_HEADER
150#define INSTR_PROF_RAW_HEADER(Type, Name, Initializer)
152#define INSTR_PROF_DATA_DEFINED
165 (uintptr_t)CountersBegin - (uintptr_t)DataBegin)
167 (uintptr_t)BitmapBegin - (uintptr_t)DataBegin)
172#undef INSTR_PROF_RAW_HEADER
179#ifndef VALUE_PROF_FUNC_PARAM
180#define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType)
181#define INSTR_PROF_COMMA
183#define INSTR_PROF_DATA_DEFINED
184#define INSTR_PROF_COMMA ,
190#undef VALUE_PROF_FUNC_PARAM
191#undef INSTR_PROF_COMMA
195#ifndef VALUE_PROF_KIND
196#define VALUE_PROF_KIND(Enumerator, Value, Descr)
198#define INSTR_PROF_DATA_DEFINED
224VALUE_PROF_KIND(IPVK_VTableTarget, 2,
"The profiled address point of the vtable")
233#undef VALUE_PROF_KIND
236#undef COVMAP_V2_OR_V3
238#define COVMAP_V2_OR_V3
241#define COVMAP_V2_OR_V3
248#ifndef COVMAP_FUNC_RECORD
249#define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Initializer)
251#define INSTR_PROF_DATA_DEFINED
261#ifdef COVMAP_V2_OR_V3
263 llvm::ConstantInt::get( \
267 llvm::ConstantInt::get( \
270 llvm::ConstantInt::get( \
271 llvm::Type::getInt64Ty(Ctx), FuncHash))
274 llvm::ConstantInt::get( \
278 CoverageMapping.size()), \
281 CoverageMapping, CoverageMapping.size(), \
284#undef COVMAP_FUNC_RECORD
291#define COVMAP_HEADER(Type, LLVMType, Name, Initializer)
293#define INSTR_PROF_DATA_DEFINED
296 llvm::ConstantInt::get(Int32Ty, NRecords))
298 llvm::ConstantInt::get(Int32Ty, FilenamesSize))
300 llvm::ConstantInt::get(Int32Ty, CoverageMappingSize))
302 llvm::ConstantInt::get(Int32Ty, CovMapVersion::CurrentVersion))
308#define COVINIT_FUNC(Type, LLVMType, Name, Initializer)
310#define INSTR_PROF_DATA_DEFINED
319#ifdef INSTR_PROF_SECT_ENTRY
320#define INSTR_PROF_DATA_DEFINED
361#undef INSTR_PROF_SECT_ENTRY
365#ifdef INSTR_PROF_VALUE_PROF_DATA
366#define INSTR_PROF_DATA_DEFINED
368#define INSTR_PROF_MAX_NUM_VAL_PER_SITE 255
387 uint8_t SiteCountArray[1];
408 LLVM_ABI void deserializeTo(InstrProfRecord &Record,
409 InstrProfSymtab *SymTab);
437 uint32_t NumValueKinds;
456 LLVM_ABI static std::unique_ptr<ValueProfData>
457 serializeFrom(
const InstrProfRecord &Record);
467 LLVM_ABI static Expected<std::unique_ptr<ValueProfData>>
468 getValueProfData(
const unsigned char *SrcBuffer,
469 const unsigned char *
const SrcBufferEnd,
486 LLVM_ABI void deserializeTo(InstrProfRecord &Record,
487 InstrProfSymtab *SymTab);
488 void operator delete(
void *ptr) { ::operator
delete(ptr); }
508 uint32_t (*GetNumValueKinds)(
const void *Record);
509 uint32_t (*GetNumValueSites)(
const void *Record, uint32_t VKind);
510 uint32_t (*GetNumValueData)(
const void *Record, uint32_t VKind);
511 uint32_t (*GetNumValueDataForSite)(
const void *
R, uint32_t VK, uint32_t S);
518 uint64_t (*RemapValueData)(uint32_t, uint64_t
Value);
519 void (*GetValueForSite)(
const void *
R, InstrProfValueData *Dst, uint32_t
K,
521 ValueProfData *(*AllocValueProfData)(
size_t TotalSizeInBytes);
533#undef INSTR_PROF_VALUE_PROF_DATA
537#ifdef INSTR_PROF_COMMON_API_IMPL
538#define INSTR_PROF_DATA_DEFINED
540#define INSTR_PROF_INLINE inline
541#define INSTR_PROF_NULLPTR nullptr
543#define INSTR_PROF_INLINE
544#define INSTR_PROF_NULLPTR NULL
548#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
560 sizeof(
uint8_t) * NumValueSites;
573 sizeof(InstrProfValueData) * NumValueData;
582 This->NumValueSites));
592 for (
I = 0;
I <
This->NumValueSites;
I++)
593 NumValueData +=
This->SiteCountArray[
I];
603 return (ValueProfRecord *)((
char *)This +
613 return (ValueProfRecord *)((
char *)This +
sizeof(ValueProfData));
626 const void *Record = Closure->Record;
628 for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
633 Closure->GetNumValueData(Record, Kind));
644 ValueProfRecordClosure *Closure,
647 const void *Record = Closure->Record;
648 This->Kind = ValueKind;
653 uint32_t ND = Closure->GetNumValueDataForSite(Record, ValueKind, S);
654 This->SiteCountArray[S] = ND;
655 Closure->GetValueForSite(Record, DstVD, ValueKind, S);
669 ValueProfData *DstData) {
675 DstData ? DstData : Closure->AllocValueProfData(TotalSize);
677 VPD->TotalSize = TotalSize;
678 VPD->NumValueKinds = Closure->GetNumValueKinds(Closure->Record);
680 for (Kind = IPVK_First; Kind <= IPVK_Last; Kind++) {
690#undef INSTR_PROF_COMMON_API_IMPL
697#ifndef INSTR_PROF_DATA_DEFINED
699#ifndef INSTR_PROF_DATA_INC
700#define INSTR_PROF_DATA_INC
703#define INSTR_PROF_SIMPLE_QUOTE(x) #x
704#define INSTR_PROF_QUOTE(x) INSTR_PROF_SIMPLE_QUOTE(x)
705#define INSTR_PROF_SIMPLE_CONCAT(x,y) x ## y
706#define INSTR_PROF_CONCAT(x,y) INSTR_PROF_SIMPLE_CONCAT(x,y)
715#define INSTR_PROF_RAW_MAGIC_64 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
716 (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 | \
717 (uint64_t)'f' << 16 | (uint64_t)'r' << 8 | (uint64_t)129
718#define INSTR_PROF_RAW_MAGIC_32 (uint64_t)255 << 56 | (uint64_t)'l' << 48 | \
719 (uint64_t)'p' << 40 | (uint64_t)'r' << 32 | (uint64_t)'o' << 24 | \
720 (uint64_t)'f' << 16 | (uint64_t)'R' << 8 | (uint64_t)129
723#define INSTR_PROF_RAW_VERSION 10
725#define INSTR_PROF_INDEX_VERSION 12
727#define INSTR_PROF_COVMAP_VERSION 6
742#define VARIANT_MASKS_ALL 0xffffffff00000000ULL
743#define GET_VERSION(V) ((V) & ~VARIANT_MASKS_ALL)
744#define VARIANT_MASK_INSTR_LOOP_ENTRIES (0x1ULL << 55)
745#define VARIANT_MASK_IR_PROF (0x1ULL << 56)
746#define VARIANT_MASK_CSIR_PROF (0x1ULL << 57)
747#define VARIANT_MASK_INSTR_ENTRY (0x1ULL << 58)
748#define VARIANT_MASK_DBG_CORRELATE (0x1ULL << 59)
749#define VARIANT_MASK_BYTE_COVERAGE (0x1ULL << 60)
750#define VARIANT_MASK_FUNCTION_ENTRY_ONLY (0x1ULL << 61)
751#define VARIANT_MASK_MEMPROF (0x1ULL << 62)
752#define VARIANT_MASK_TEMPORAL_PROF (0x1ULL << 63)
753#define INSTR_PROF_RAW_VERSION_VAR __llvm_profile_raw_version
754#define INSTR_PROF_PROFILE_RUNTIME_VAR __llvm_profile_runtime
755#define INSTR_PROF_PROFILE_COUNTER_BIAS_VAR __llvm_profile_counter_bias
756#define INSTR_PROF_PROFILE_BITMAP_BIAS_VAR __llvm_profile_bitmap_bias
757#define INSTR_PROF_PROFILE_SET_TIMESTAMP __llvm_profile_set_timestamp
758#define INSTR_PROF_PROFILE_SAMPLING_VAR __llvm_profile_sampling
762#define INSTR_PROF_PROFILE_NAME_VAR __llvm_profile_filename
766#define INSTR_PROF_DATA_COMMON __llvm_prf_data
767#define INSTR_PROF_NAME_COMMON __llvm_prf_names
768#define INSTR_PROF_VNAME_COMMON __llvm_prf_vns
769#define INSTR_PROF_CNTS_COMMON __llvm_prf_cnts
770#define INSTR_PROF_BITS_COMMON __llvm_prf_bits
771#define INSTR_PROF_VALS_COMMON __llvm_prf_vals
772#define INSTR_PROF_VNODES_COMMON __llvm_prf_vnds
773#define INSTR_PROF_VTAB_COMMON __llvm_prf_vtab
774#define INSTR_PROF_COVMAP_COMMON __llvm_covmap
775#define INSTR_PROF_COVFUN_COMMON __llvm_covfun
776#define INSTR_PROF_COVDATA_COMMON __llvm_covdata
777#define INSTR_PROF_COVNAME_COMMON __llvm_covnames
778#define INSTR_PROF_COVINIT_COMMON __llvm_covinit
783#define INSTR_PROF_DATA_COFF ".lprfd$M"
784#define INSTR_PROF_NAME_COFF ".lprfn$M"
785#define INSTR_PROF_VNAME_COFF ".lprfvn$M"
786#define INSTR_PROF_CNTS_COFF ".lprfc$M"
787#define INSTR_PROF_BITS_COFF ".lprfb$M"
788#define INSTR_PROF_VALS_COFF ".lprfv$M"
789#define INSTR_PROF_VNODES_COFF ".lprfnd$M"
790#define INSTR_PROF_VTAB_COFF ".lprfvt$M"
791#define INSTR_PROF_COVMAP_COFF ".lcovmap$M"
792#define INSTR_PROF_COVFUN_COFF ".lcovfun$M"
796#define INSTR_PROF_COVDATA_COFF ".lcovd"
797#define INSTR_PROF_COVNAME_COFF ".lcovn"
801#define INSTR_PROF_COVINIT_COFF ".lcovd$M"
805#define INSTR_PROF_DATA_SECT_NAME INSTR_PROF_DATA_COFF
806#define INSTR_PROF_NAME_SECT_NAME INSTR_PROF_NAME_COFF
807#define INSTR_PROF_CNTS_SECT_NAME INSTR_PROF_CNTS_COFF
808#define INSTR_PROF_BITS_SECT_NAME INSTR_PROF_BITS_COFF
809#define INSTR_PROF_VTAB_SECT_NAME INSTR_PROF_VTAB_COFF
810#define INSTR_PROF_VNAME_SECT_NAME INSTR_PROF_VNAME_COFF
814#define INSTR_PROF_VALS_SECT_NAME INSTR_PROF_VALS_COFF
816#define INSTR_PROF_VNODES_SECT_NAME INSTR_PROF_VNODES_COFF
817#define INSTR_PROF_COVMAP_SECT_NAME INSTR_PROF_COVMAP_COFF
818#define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_COVFUN_COFF
819#define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_COVDATA_COFF
820#define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_COVNAME_COFF
821#define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_COVINIT_COFF
824#define INSTR_PROF_DATA_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_DATA_COMMON)
825#define INSTR_PROF_NAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_NAME_COMMON)
826#define INSTR_PROF_CNTS_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_CNTS_COMMON)
827#define INSTR_PROF_BITS_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_BITS_COMMON)
828#define INSTR_PROF_VTAB_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VTAB_COMMON)
829#define INSTR_PROF_VNAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VNAME_COMMON)
833#define INSTR_PROF_VALS_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VALS_COMMON)
835#define INSTR_PROF_VNODES_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_VNODES_COMMON)
836#define INSTR_PROF_COVMAP_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVMAP_COMMON)
837#define INSTR_PROF_COVFUN_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVFUN_COMMON)
838#define INSTR_PROF_COVDATA_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVDATA_COMMON)
839#define INSTR_PROF_COVNAME_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVNAME_COMMON)
840#define INSTR_PROF_COVINIT_SECT_NAME INSTR_PROF_QUOTE(INSTR_PROF_COVINIT_COMMON)
848#define INSTR_PROF_SECT_START(Sect) \
849 INSTR_PROF_CONCAT(__start_,Sect)
850#define INSTR_PROF_SECT_STOP(Sect) \
851 INSTR_PROF_CONCAT(__stop_,Sect)
854#define INSTR_PROF_VALUE_PROF_FUNC __llvm_profile_instrument_target
855#define INSTR_PROF_VALUE_PROF_FUNC_STR \
856 INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_FUNC)
857#define INSTR_PROF_VALUE_PROF_MEMOP_FUNC __llvm_profile_instrument_memop
858#define INSTR_PROF_VALUE_PROF_MEMOP_FUNC_STR \
859 INSTR_PROF_QUOTE(INSTR_PROF_VALUE_PROF_MEMOP_FUNC)
862#define INSTR_PROF_DATA_ALIGNMENT 8
867typedef struct InstrProfValueData {
877#undef INSTR_PROF_DATA_DEFINED
880#undef COVMAP_V2_OR_V3
882#ifdef INSTR_PROF_VALUE_PROF_MEMOP_API
885#define INSTR_PROF_INLINE inline
887#define INSTR_PROF_INLINE
920#define INSTR_PROF_NUM_BUCKETS 22
927#if defined(_MSC_VER) && !defined(__clang__)
931int InstProfClzll(
unsigned long long X) {
932 unsigned long LeadZeroIdx = 0;
933#if !defined(_M_ARM64) && !defined(_M_X64)
935 if (_BitScanReverse(&LeadZeroIdx, (
unsigned long)(
X >> 32)))
936 return (
int)(63 - (LeadZeroIdx + 32));
939 if (_BitScanReverse(&LeadZeroIdx, (
unsigned long)(
X)))
940 return (
int)(63 - LeadZeroIdx);
942 if (_BitScanReverse64(&LeadZeroIdx,
X))
return 63 - LeadZeroIdx;
947int InstProfPopcountll(
unsigned long long X) {
949 unsigned long long v =
X;
950 v =
v - ((
v >> 1) & 0x5555555555555555ULL);
951 v = (
v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL);
952 v = (
v + (
v >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
953 return (
int)((
unsigned long long)(
v * 0x0101010101010101ULL) >> 56);
959int InstProfClzll(
unsigned long long X) {
return __builtin_clzll(
X); }
961int InstProfPopcountll(
unsigned long long X) {
return __builtin_popcountll(
X); }
970InstrProfGetRangeRepValue(
uint64_t Value) {
974 else if (Value >= 513)
977 else if (InstProfPopcountll(Value) == 1)
982 return (UINT64_C(1) << (64 - InstProfClzll(Value) - 1)) + 1;
989InstrProfIsSingleValRange(
uint64_t Value) {
993 else if (InstProfPopcountll(Value) == 1)
#define offsetof(TYPE, MEMBER)
#define INSTR_PROF_VALUE_NODE(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 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 TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
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