llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-analysis <details> <summary>Changes</summary> The changes include: 1) Insert value profile intrinsics and lowering them. - Introduced INSTR_PROF_VTABLE_DATA to record per-vtable data. - Modified LLVM_PROF_RAW_HEADER to record the metadata for vtable profiles. - Test case in llvm/test/Transforms/PGOProfile/vtable_profile.ll 2) Tooling support in llvm-profdata to show the added vtable information - Changes are made in {raw,text,indexed} prof reader and/or writer to read/write vtable profile data. - Test cases added in llvm/test/tools/llvm-profdata --- Patch is 127.87 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/66825.diff 44 Files Affected: - (modified) clang/test/CodeGen/coverage-profile-raw-version.c (+2-2) - (modified) compiler-rt/include/profile/InstrProfData.inc (+29-3) - (modified) compiler-rt/lib/profile/InstrProfiling.h (+19-1) - (modified) compiler-rt/lib/profile/InstrProfilingBuffer.c (+52-8) - (modified) compiler-rt/lib/profile/InstrProfilingInternal.h (+9-2) - (modified) compiler-rt/lib/profile/InstrProfilingMerge.c (+19-1) - (modified) compiler-rt/lib/profile/InstrProfilingPlatformLinux.c (+20) - (modified) compiler-rt/lib/profile/InstrProfilingWriter.c (+38-7) - (modified) compiler-rt/test/profile/Linux/instrprof-value-prof-warn.test (+1-1) - (modified) compiler-rt/test/profile/instrprof-write-buffer-internal.c (+8-2) - (modified) llvm/include/llvm/Analysis/IndirectCallVisitor.h (+20-2) - (modified) llvm/include/llvm/ProfileData/InstrProf.h (+124-1) - (modified) llvm/include/llvm/ProfileData/InstrProfData.inc (+28-3) - (modified) llvm/include/llvm/ProfileData/InstrProfReader.h (+57-2) - (modified) llvm/include/llvm/ProfileData/InstrProfWriter.h (+4) - (modified) llvm/include/llvm/Transforms/Instrumentation/InstrProfiling.h (+12) - (modified) llvm/lib/ProfileData/InstrProf.cpp (+144-28) - (modified) llvm/lib/ProfileData/InstrProfReader.cpp (+75-4) - (modified) llvm/lib/ProfileData/InstrProfWriter.cpp (+87-5) - (modified) llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp (+165) - (modified) llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp (+1) - (modified) llvm/lib/Transforms/Instrumentation/ValueProfilePlugins.inc (+25-1) - (added) llvm/test/Transforms/PGOProfile/Inputs/update_vtable_value_prof_inputs.sh (+84) - (modified) llvm/test/Transforms/PGOProfile/comdat_internal.ll (+2-2) - (modified) llvm/test/Transforms/PGOProfile/indirect_call_profile_funclet.ll (+3-2) - (added) llvm/test/Transforms/PGOProfile/vtable_profile.ll (+139) - (modified) llvm/test/tools/llvm-profdata/Inputs/c-general.profraw () - (added) llvm/test/tools/llvm-profdata/Inputs/vtable-prof.proftext (+73) - (added) llvm/test/tools/llvm-profdata/Inputs/vtable_prof.profraw () - (modified) llvm/test/tools/llvm-profdata/binary-ids-padding.test (+8-2) - (modified) llvm/test/tools/llvm-profdata/large-binary-id-size.test (+3-1) - (modified) llvm/test/tools/llvm-profdata/malformed-not-space-for-another-header.test (+6-1) - (modified) llvm/test/tools/llvm-profdata/malformed-num-counters-zero.test (+6-1) - (modified) llvm/test/tools/llvm-profdata/malformed-ptr-to-counter-array.test (+6-1) - (modified) llvm/test/tools/llvm-profdata/misaligned-binary-ids-size.test (+3-1) - (modified) llvm/test/tools/llvm-profdata/mismatched-raw-profile-header.test (+2) - (modified) llvm/test/tools/llvm-profdata/raw-32-bits-be.test (+6-1) - (modified) llvm/test/tools/llvm-profdata/raw-32-bits-le.test (+5-1) - (modified) llvm/test/tools/llvm-profdata/raw-64-bits-be.test (+11-2) - (modified) llvm/test/tools/llvm-profdata/raw-64-bits-le.test (+27-2) - (modified) llvm/test/tools/llvm-profdata/raw-two-profiles.test (+8-2) - (added) llvm/test/tools/llvm-profdata/vtable-prof.proftext (+16) - (added) llvm/test/tools/llvm-profdata/vtable-value-prof-basic.test (+100) - (modified) llvm/tools/llvm-profdata/llvm-profdata.cpp (+27-10) ``````````diff diff --git a/clang/test/CodeGen/coverage-profile-raw-version.c b/clang/test/CodeGen/coverage-profile-raw-version.c index 749dce50298f025..bb30fd8c1c70ae7 100644 --- a/clang/test/CodeGen/coverage-profile-raw-version.c +++ b/clang/test/CodeGen/coverage-profile-raw-version.c @@ -1,8 +1,8 @@ // RUN: %clang_cc1 -debug-info-kind=standalone -fprofile-instrument=clang -fcoverage-mapping -emit-llvm -o - %s | FileCheck %s // RUN: %clang_cc1 -debug-info-kind=standalone -mllvm -debug-info-correlate -fprofile-instrument=clang -fcoverage-mapping -emit-llvm -o - %s | FileCheck %s --check-prefix=DEBUG_INFO -// CHECK: @__llvm_profile_raw_version = {{.*}}constant i64 8 -// DEBUG_INFO: @__llvm_profile_raw_version = {{.*}}constant i64 576460752303423496 +// CHECK: @__llvm_profile_raw_version = {{.*}}constant i64 9 +// DEBUG_INFO: @__llvm_profile_raw_version = {{.*}}constant i64 576460752303423497 int main() { return 0; diff --git a/compiler-rt/include/profile/InstrProfData.inc b/compiler-rt/include/profile/InstrProfData.inc index 4456bf1ab176325..b49f9d983e0f46d 100644 --- a/compiler-rt/include/profile/InstrProfData.inc +++ b/compiler-rt/include/profile/InstrProfData.inc @@ -92,6 +92,19 @@ INSTR_PROF_DATA(const uint16_t, Int16ArrayTy, NumValueSites[IPVK_Last+1], \ /* INSTR_PROF_DATA end. */ +#ifndef INSTR_PROF_VTABLE_DATA +#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Initializer) +#else +#define INSTR_PROF_VTABLE_DATA_DEFINED +#endif +INSTR_PROF_VTABLE_DATA(const uint64_t, llvm::Type::getInt64Ty(Ctx), VTableNameHash, \ + ConstantInt::get(llvm::Type::getInt64Ty(Ctx), IndexedInstrProf::ComputeHash(VTableName))) +INSTR_PROF_VTABLE_DATA(const IntPtrT, llvm::Type::getInt8PtrTy(Ctx), VTablePointer, VTableAddr) +INSTR_PROF_VTABLE_DATA(const uint32_t, llvm::Type::getInt32Ty(Ctx), VTableSize, \ + ConstantInt::get(llvm::Type::getInt32Ty(Ctx), VTableSizeVal)) +#undef INSTR_PROF_VTABLE_DATA +/* INSTR_PROF_VTABLE_DATA end. */ + /* This is an internal data structure used by value profiler. It * is defined here to allow serialization code sharing by LLVM * to be used in unit test. @@ -136,6 +149,8 @@ INSTR_PROF_RAW_HEADER(uint64_t, NamesSize, NamesSize) INSTR_PROF_RAW_HEADER(uint64_t, CountersDelta, (uintptr_t)CountersBegin - (uintptr_t)DataBegin) INSTR_PROF_RAW_HEADER(uint64_t, NamesDelta, (uintptr_t)NamesBegin) +INSTR_PROF_RAW_HEADER(uint64_t, VNamesSize, VNamesSize) +INSTR_PROF_RAW_HEADER(uint64_t, NumVTables, NumVTables) INSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last) #undef INSTR_PROF_RAW_HEADER /* INSTR_PROF_RAW_HEADER end */ @@ -177,13 +192,14 @@ VALUE_PROF_FUNC_PARAM(uint32_t, CounterIndex, Type::getInt32Ty(Ctx)) VALUE_PROF_KIND(IPVK_IndirectCallTarget, 0, "indirect call target") /* For memory intrinsic functions size profiling. */ VALUE_PROF_KIND(IPVK_MemOPSize, 1, "memory intrinsic functions size") +VALUE_PROF_KIND(IPVK_VTableTarget, 2, "vtable target") /* These two kinds must be the last to be * declared. This is to make sure the string * array created with the template can be * indexed with the kind value. */ VALUE_PROF_KIND(IPVK_First, IPVK_IndirectCallTarget, "first") -VALUE_PROF_KIND(IPVK_Last, IPVK_MemOPSize, "last") +VALUE_PROF_KIND(IPVK_Last, IPVK_VTableTarget, "last") #undef VALUE_PROF_KIND /* VALUE_PROF_KIND end */ @@ -270,12 +286,18 @@ INSTR_PROF_SECT_ENTRY(IPSK_cnts, \ INSTR_PROF_SECT_ENTRY(IPSK_name, \ INSTR_PROF_QUOTE(INSTR_PROF_NAME_COMMON), \ INSTR_PROF_NAME_COFF, "__DATA,") +INSTR_PROF_SECT_ENTRY(IPSK_vname, \ + INSTR_PROF_QUOTE(INSTR_PROF_VNAME_COMMON), \ + INSTR_PROF_VNAME_COFF, "__DATA,") INSTR_PROF_SECT_ENTRY(IPSK_vals, \ INSTR_PROF_QUOTE(INSTR_PROF_VALS_COMMON), \ INSTR_PROF_VALS_COFF, "__DATA,") INSTR_PROF_SECT_ENTRY(IPSK_vnodes, \ INSTR_PROF_QUOTE(INSTR_PROF_VNODES_COMMON), \ INSTR_PROF_VNODES_COFF, "__DATA,") +INSTR_PROF_SECT_ENTRY(IPSK_vtab, \ + INSTR_PROF_QUOTE(INSTR_PROF_VTAB_COMMON), \ + INSTR_PROF_VTAB_COFF, "__DATA,") INSTR_PROF_SECT_ENTRY(IPSK_covmap, \ INSTR_PROF_QUOTE(INSTR_PROF_COVMAP_COMMON), \ INSTR_PROF_COVMAP_COFF, "__LLVM_COV,") @@ -646,9 +668,9 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, /* FIXME: Please remedy the fixme in the header before bumping the version. */ /* Raw profile format version (start from 1). */ -#define INSTR_PROF_RAW_VERSION 8 +#define INSTR_PROF_RAW_VERSION 9 /* Indexed profile format version (start from 1). */ -#define INSTR_PROF_INDEX_VERSION 10 +#define INSTR_PROF_INDEX_VERSION 11 /* Coverage mapping format version (start from 0). */ #define INSTR_PROF_COVMAP_VERSION 5 @@ -686,9 +708,11 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, than WIN32 */ #define INSTR_PROF_DATA_COMMON __llvm_prf_data #define INSTR_PROF_NAME_COMMON __llvm_prf_names +#define INSTR_PROF_VNAME_COMMON __llvm_prf_vnames #define INSTR_PROF_CNTS_COMMON __llvm_prf_cnts #define INSTR_PROF_VALS_COMMON __llvm_prf_vals #define INSTR_PROF_VNODES_COMMON __llvm_prf_vnds +#define INSTR_PROF_VTAB_COMMON __llvm_prf_vtab #define INSTR_PROF_COVMAP_COMMON __llvm_covmap #define INSTR_PROF_COVFUN_COMMON __llvm_covfun #define INSTR_PROF_ORDERFILE_COMMON __llvm_orderfile @@ -697,9 +721,11 @@ serializeValueProfDataFrom(ValueProfRecordClosure *Closure, */ #define INSTR_PROF_DATA_COFF ".lprfd$M" #define INSTR_PROF_NAME_COFF ".lprfn$M" +#define INSTR_PROF_VNAME_COFF ".lprfn$M" #define INSTR_PROF_CNTS_COFF ".lprfc$M" #define INSTR_PROF_VALS_COFF ".lprfv$M" #define INSTR_PROF_VNODES_COFF ".lprfnd$M" +#define INSTR_PROF_VTAB_COFF ".lprfvt$M" #define INSTR_PROF_COVMAP_COFF ".lcovmap$M" #define INSTR_PROF_COVFUN_COFF ".lcovfun$M" #define INSTR_PROF_ORDERFILE_COFF ".lorderfile$M" diff --git a/compiler-rt/lib/profile/InstrProfiling.h b/compiler-rt/lib/profile/InstrProfiling.h index 4433d7bd48871fc..f3afa694e02c27d 100644 --- a/compiler-rt/lib/profile/InstrProfiling.h +++ b/compiler-rt/lib/profile/InstrProfiling.h @@ -38,6 +38,12 @@ typedef struct ValueProfNode { #include "profile/InstrProfData.inc" } ValueProfNode; +typedef void *IntPtrT; +typedef struct VTableProfData { +#define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Initializer) Type Name; +#include "profile/InstrProfData.inc" +} VTableProfData; + /*! * \brief Return 1 if profile counters are continuously synced to the raw * profile via an mmap(). This is in contrast to the default mode, in which @@ -86,10 +92,14 @@ const __llvm_profile_data *__llvm_profile_begin_data(void); const __llvm_profile_data *__llvm_profile_end_data(void); const char *__llvm_profile_begin_names(void); const char *__llvm_profile_end_names(void); +const char *__llvm_profile_begin_vnames(void); +const char *__llvm_profile_end_vnames(void); char *__llvm_profile_begin_counters(void); char *__llvm_profile_end_counters(void); ValueProfNode *__llvm_profile_begin_vnodes(); ValueProfNode *__llvm_profile_end_vnodes(); +VTableProfData *__llvm_profile_begin_vtables(); +VTableProfData *__llvm_profile_end_vtables(); uint32_t *__llvm_profile_begin_orderfile(); /*! @@ -276,6 +286,12 @@ uint64_t __llvm_profile_get_num_counters(const char *Begin, const char *End); /*! \brief Get the size of the profile counters section in bytes. */ uint64_t __llvm_profile_get_counters_size(const char *Begin, const char *End); +uint64_t __llvm_profile_get_num_vtable(const VTableProfData *Begin, + const VTableProfData *End); + +uint64_t __llvm_profile_get_vtable_size(const VTableProfData *Begin, + const VTableProfData *End); + /* ! \brief Given the sizes of the data and counter information, return the * number of padding bytes before and after the counters, and after the names, * in the raw profile. @@ -287,8 +303,10 @@ uint64_t __llvm_profile_get_counters_size(const char *Begin, const char *End); */ void __llvm_profile_get_padding_sizes_for_counters( uint64_t DataSize, uint64_t CountersSize, uint64_t NamesSize, + uint64_t VTableSize, uint64_t VNameSize, uint64_t *PaddingBytesBeforeCounters, uint64_t *PaddingBytesAfterCounters, - uint64_t *PaddingBytesAfterNames); + uint64_t *PaddingBytesAfterNames, uint64_t *PaddingBytesAfterVTable, + uint64_t *PaddingBytesAfterVNames); /*! * \brief Set the flag that profile data has been dumped to the file. diff --git a/compiler-rt/lib/profile/InstrProfilingBuffer.c b/compiler-rt/lib/profile/InstrProfilingBuffer.c index 61ac5d9c0285002..0c36e40444c7344 100644 --- a/compiler-rt/lib/profile/InstrProfilingBuffer.c +++ b/compiler-rt/lib/profile/InstrProfilingBuffer.c @@ -9,6 +9,8 @@ // Note: This is linked into the Darwin kernel, and must remain compatible // with freestanding compilation. See `darwin_add_builtin_libraries`. +#include <assert.h> + #include "InstrProfiling.h" #include "InstrProfilingInternal.h" #include "InstrProfilingPort.h" @@ -45,9 +47,14 @@ uint64_t __llvm_profile_get_size_for_buffer(void) { const char *CountersEnd = __llvm_profile_end_counters(); const char *NamesBegin = __llvm_profile_begin_names(); const char *NamesEnd = __llvm_profile_end_names(); + const VTableProfData *VTableBegin = __llvm_profile_begin_vtables(); + const VTableProfData *VTableEnd = __llvm_profile_end_vtables(); + const char *VNamesBegin = __llvm_profile_begin_vnames(); + const char *VNamesEnd = __llvm_profile_end_vnames(); return __llvm_profile_get_size_for_buffer_internal( - DataBegin, DataEnd, CountersBegin, CountersEnd, NamesBegin, NamesEnd); + DataBegin, DataEnd, CountersBegin, CountersEnd, NamesBegin, NamesEnd, + VTableBegin, VTableEnd, VNamesBegin, VNamesEnd); } COMPILER_RT_VISIBILITY @@ -63,6 +70,18 @@ uint64_t __llvm_profile_get_data_size(const __llvm_profile_data *Begin, const __llvm_profile_data *End) { return __llvm_profile_get_num_data(Begin, End) * sizeof(__llvm_profile_data); } +COMPILER_RT_VISIBILITY +uint64_t __llvm_profile_get_num_vtable(const VTableProfData *Begin, + const VTableProfData *End) { + intptr_t EndI = (intptr_t)End, BeginI = (intptr_t)Begin; + return (EndI + sizeof(VTableProfData) - 1 - BeginI) / sizeof(VTableProfData); +} + +COMPILER_RT_VISIBILITY +uint64_t __llvm_profile_get_vtable_size(const VTableProfData *Begin, + const VTableProfData *End) { + return __llvm_profile_get_num_vtable(Begin, End) * sizeof(VTableProfData); +} COMPILER_RT_VISIBILITY size_t __llvm_profile_counter_entry_size(void) { if (__llvm_profile_get_version() & VARIANT_MASK_BYTE_COVERAGE) @@ -103,46 +122,68 @@ static int needsCounterPadding(void) { COMPILER_RT_VISIBILITY void __llvm_profile_get_padding_sizes_for_counters( uint64_t DataSize, uint64_t CountersSize, uint64_t NamesSize, + uint64_t VTableSize, uint64_t VNameSize, uint64_t *PaddingBytesBeforeCounters, uint64_t *PaddingBytesAfterCounters, - uint64_t *PaddingBytesAfterNames) { + uint64_t *PaddingBytesAfterNames, uint64_t *PaddingBytesAfterVTable, + uint64_t *PaddingBytesAfterVName) { + // Counter padding is needed only if continuous mode is enabled. if (!needsCounterPadding()) { *PaddingBytesBeforeCounters = 0; *PaddingBytesAfterCounters = __llvm_profile_get_num_padding_bytes(CountersSize); *PaddingBytesAfterNames = __llvm_profile_get_num_padding_bytes(NamesSize); + *PaddingBytesAfterVTable = __llvm_profile_get_num_padding_bytes(VTableSize); + *PaddingBytesAfterVName = __llvm_profile_get_num_padding_bytes(VNameSize); return; } + // Value profiling not supported in continuous mode at profile-write time + // according to + // https://github.com/llvm/llvm-project/blob/e6a007f6b51a661ed3dd8b0210b734b3e9b4354f/compiler-rt/lib/profile/InstrProfilingWriter.c#L328 + assert(VTableSize == 0 && VNameSize == 0 && + "Value profile not supported for continuous mode"); // In continuous mode, the file offsets for headers and for the start of // counter sections need to be page-aligned. *PaddingBytesBeforeCounters = calculateBytesNeededToPageAlign(sizeof(__llvm_profile_header) + DataSize); *PaddingBytesAfterCounters = calculateBytesNeededToPageAlign(CountersSize); *PaddingBytesAfterNames = calculateBytesNeededToPageAlign(NamesSize); + // Set these two variables to zero to avoid uninitialized variables + // even if VTableSize and VNameSize are asserted to be zero. + *PaddingBytesAfterVTable = 0; + *PaddingBytesAfterVName = 0; } COMPILER_RT_VISIBILITY uint64_t __llvm_profile_get_size_for_buffer_internal( const __llvm_profile_data *DataBegin, const __llvm_profile_data *DataEnd, const char *CountersBegin, const char *CountersEnd, const char *NamesBegin, - const char *NamesEnd) { + const char *NamesEnd, const VTableProfData *VTableBegin, + const VTableProfData *VTableEnd, const char *VNamesBegin, + const char *VNamesEnd) { /* Match logic in __llvm_profile_write_buffer(). */ const uint64_t NamesSize = (NamesEnd - NamesBegin) * sizeof(char); uint64_t DataSize = __llvm_profile_get_data_size(DataBegin, DataEnd); uint64_t CountersSize = __llvm_profile_get_counters_size(CountersBegin, CountersEnd); + uint64_t VTableSize = __llvm_profile_get_vtable_size(VTableBegin, VTableEnd); + uint64_t VNameSize = (VNamesEnd - VNamesBegin) * sizeof(char); /* Determine how much padding is needed before/after the counters and after * the names. */ uint64_t PaddingBytesBeforeCounters, PaddingBytesAfterCounters, - PaddingBytesAfterNames; + PaddingBytesAfterNames, PaddingBytesAfterVTable, PaddingBytesAfterVNames; __llvm_profile_get_padding_sizes_for_counters( - DataSize, CountersSize, NamesSize, &PaddingBytesBeforeCounters, - &PaddingBytesAfterCounters, &PaddingBytesAfterNames); + DataSize, CountersSize, NamesSize, VTableSize, VNameSize, + &PaddingBytesBeforeCounters, &PaddingBytesAfterCounters, + &PaddingBytesAfterNames, &PaddingBytesAfterVTable, + &PaddingBytesAfterVNames); return sizeof(__llvm_profile_header) + __llvm_write_binary_ids(NULL) + DataSize + PaddingBytesBeforeCounters + CountersSize + - PaddingBytesAfterCounters + NamesSize + PaddingBytesAfterNames; + PaddingBytesAfterCounters + NamesSize + PaddingBytesAfterNames + + VTableSize + PaddingBytesAfterVTable + VNameSize + + PaddingBytesAfterVNames; } COMPILER_RT_VISIBILITY @@ -163,6 +204,9 @@ COMPILER_RT_VISIBILITY int __llvm_profile_write_buffer_internal( const char *CountersEnd, const char *NamesBegin, const char *NamesEnd) { ProfDataWriter BufferWriter; initBufferWriter(&BufferWriter, Buffer); + // Set virtual table arguments to NULL since they are not supported yet. return lprofWriteDataImpl(&BufferWriter, DataBegin, DataEnd, CountersBegin, - CountersEnd, 0, NamesBegin, NamesEnd, 0); + CountersEnd, 0, NamesBegin, NamesEnd, + NULL /* VTableBegin */, NULL /* VTableEnd */, + NULL /* VNamesBegin */, NULL /* VNamesEnd */, 0); } diff --git a/compiler-rt/lib/profile/InstrProfilingInternal.h b/compiler-rt/lib/profile/InstrProfilingInternal.h index 360165e32ab3fe2..bce333f933f0ffe 100644 --- a/compiler-rt/lib/profile/InstrProfilingInternal.h +++ b/compiler-rt/lib/profile/InstrProfilingInternal.h @@ -18,11 +18,16 @@ * pointers to the live data in memory. This function is probably not what you * want. Use __llvm_profile_get_size_for_buffer instead. Use this function if * your program has a custom memory layout. + * NOTE: The change of function signature requires modifying c source code + * as demonstrated by the existing tests. If this is causing backward + * compatible issues, considering adding another function for new use cases. */ uint64_t __llvm_profile_get_size_for_buffer_internal( const __llvm_profile_data *DataBegin, const __llvm_profile_data *DataEnd, const char *CountersBegin, const char *CountersEnd, const char *NamesBegin, - const char *NamesEnd); + const char *NamesEnd, const VTableProfData *VTableBegin, + const VTableProfData *VTableEnd, const char *VNamesBegin, + const char *VNamesEnd); /*! * \brief Write instrumentation data to the given buffer, given explicit @@ -154,7 +159,9 @@ int lprofWriteDataImpl(ProfDataWriter *Writer, const __llvm_profile_data *DataEnd, const char *CountersBegin, const char *CountersEnd, VPDataReaderType *VPDataReader, const char *NamesBegin, - const char *NamesEnd, int SkipNameDataWrite); + const char *NamesEnd, const VTableProfData *VTableBegin, + const VTableProfData *VTableEnd, const char *VNamesBegin, + const char *VNamesEnd, int SkipNameDataWrite); /* Merge value profile data pointed to by SrcValueProfData into * in-memory profile counters pointed by to DstData. */ diff --git a/compiler-rt/lib/profile/InstrProfilingMerge.c b/compiler-rt/lib/profile/InstrProfilingMerge.c index 9cf12f251f7262d..2ef6227599ff139 100644 --- a/compiler-rt/lib/profile/InstrProfilingMerge.c +++ b/compiler-rt/lib/profile/InstrProfilingMerge.c @@ -124,9 +124,27 @@ int __llvm_profile_merge_from_buffer(const char *ProfileData, SrcCountersEnd = SrcCountersStart + Header->NumCounters * __llvm_profile_counter_entry_size(); SrcNameStart = SrcCountersEnd; - SrcValueProfDataStart = + // This is to assume counter size is a multiple of 8 bytes. + // uint64_t NamesSize = Header->NamesSize; + // uint64_t PaddingBytesAfterNames = + // __llvm_profile_get_num_padding_bytes(Header->NamesSize); + // First, skip rather than merge them + uint64_t VTableSectionSize = Header->NumVTables * sizeof(VTableProfData); + uint64_t PaddingBytesAfterVTableSection = + __llvm_profile_get_num_padding_bytes(VTableSectionSize); + uint64_t VNamesSize = Header->VNamesSize; + uint64_t PaddingBytesAfterVNamesSize = + __llvm_profile_get_num_padding_bytes(VNamesSize); + + uint64_t VTableProfDataOffset = SrcNameStart + Header->NamesSize + __llvm_profile_get_num_padding_bytes(Header->NamesSize); + + uint64_t VTableNamesOffset = + VTableProfDataOffset + VTableSectionSize + PaddingBytesAfterVTableSection; + + SrcValueProfDataStart = + VTableNamesOffset + VNamesSize + PaddingBytesAfterVNamesSize; if (SrcNameStart < SrcCountersStart) return 1; diff --git a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c index 2cce0a4b2c48d35..dc861632271ce79 100644 --- a/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c +++ b/compiler-rt/lib/profile/InstrProfilingPlatformLinux.c @@ -33,8 +33,12 @@ #define PROF_DATA_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_DATA_COMMON) #define PROF_NAME_START INSTR_PROF_SECT_START(INSTR_PROF_NAME_COMMON) #define PROF_NAME_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_NAME_COMMON) +#define PROF_VNAME_START INSTR_PROF_SECT_START(INSTR_PROF_VNAME_COMMON) +#define PROF_VNAME_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_VNAME_COMMON) #define PROF_CNTS_START INSTR_PROF_SECT_START(INSTR_PROF_CNTS_COMMON) #define PROF_CNTS_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_CNTS_COMMON) +#define PROF_VTABLE_START INSTR_PROF_SECT_START(INSTR_PROF_VTAB_COMMON) +#define PROF_VTABLE_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_VTAB_COMMON) #define PROF_ORDERFILE_START INSTR_PROF_SECT_START(INSTR_PROF_ORDERFILE_COMMON) #define PROF_VNODES_START INSTR_PROF_SECT_START(INSTR_PROF_VNODES_COMMON) #define PROF_VNODES_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_VNODES_COMMON) @@ -48,6 +52,10 @@ extern __llvm_profile_data PROF_DATA_STOP COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; extern char PROF_CNTS_START COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; extern char PROF_CNTS_STOP COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; +extern VTableProfData PROF_VTABLE_START COMPILER_RT_VISIBILITY COMPILER_RT_WEAK; +extern V... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/66825 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits