Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 68 additions & 7 deletions xen/common/coverage/llvm.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,27 +44,65 @@
((uint64_t)'f' << 16) | ((uint64_t)'R' << 8) | ((uint64_t)129)
#endif

#define LLVM_PROFILE_VERSION 4
#if __clang_major__ >= 19
#define LLVM_PROFILE_VERSION 10
#define LLVM_PROFILE_NUM_KINDS 3
#elif __clang_major__ == 18
#define LLVM_PROFILE_VERSION 9
#define LLVM_PROFILE_NUM_KINDS 2
#elif __clang_major__ >= 14
#define LLVM_PROFILE_VERSION 8
#define LLVM_PROFILE_NUM_KINDS 2
#elif __clang_major__ == 13
#define LLVM_PROFILE_VERSION 7
#define LLVM_PROFILE_NUM_KINDS 2
#elif __clang_major__ >= 11
#define LLVM_PROFILE_VERSION 5
#define LLVM_PROFILE_NUM_KINDS 2
#else
#error "LLVM coverage selected but an unsupported clang version is used"
#endif

struct llvm_profile_data {
uint64_t name_ref;
uint64_t function_hash;
void *counter;
void *relative_counter;
#if __clang_major__ >= 18
void *relative_bitmap;
#endif
void *function;
void *values;
uint32_t nr_counters;
uint16_t nr_value_sites[LLVM_PROFILE_NUM_KINDS];
#if __clang_major__ >= 18
uint32_t numbitmap_bytes;
#endif
};

struct llvm_profile_header {
uint64_t magic;
uint64_t version;
uint64_t data_size;
uint64_t counters_size;
#if __clang_major__ >= 13
uint64_t binary_ids_size;
#endif
uint64_t num_data;
uint64_t padding_bytes_before_counters;
uint64_t num_counters;
uint64_t padding_bytes_after_counters;
#if __clang_major__ >= 18
uint64_t num_bitmap_bytes;
uint64_t padding_bytes_after_bitmap_bytes;
#endif
uint64_t names_size;
uint64_t counters_delta;
#if __clang_major__ >= 18
uint64_t bitmap_delta;
#endif
uint64_t names_delta;
#if __clang_major__ >= 19
uint64_t num_vtables;
uint64_t vnames_size;
#endif
uint64_t value_kind_last;
};

Expand Down Expand Up @@ -107,11 +145,34 @@ static int cf_check dump(
struct llvm_profile_header header = {
.magic = LLVM_PROFILE_MAGIC,
.version = LLVM_PROFILE_VERSION,
.data_size = (END_DATA - START_DATA) / sizeof(struct llvm_profile_data),
.counters_size = (END_COUNTERS - START_COUNTERS) / sizeof(uint64_t),
#if __clang_major__ >= 13
.binary_ids_size = 0,
#endif
.num_data = ((END_DATA + sizeof(struct llvm_profile_data) - 1)
- START_DATA) / sizeof(struct llvm_profile_data),
.padding_bytes_before_counters = 0,
.num_counters = ((END_COUNTERS + sizeof(uint64_t) - 1)
- START_COUNTERS) / sizeof(uint64_t),
.padding_bytes_after_counters = 0,
#if __clang_major__ >= 18
.num_bitmap_bytes = 0,
.padding_bytes_after_bitmap_bytes = 0,
#endif
.names_size = END_NAMES - START_NAMES,
.counters_delta = (uintptr_t)START_COUNTERS,
#if __clang_major__ >= 14
.counters_delta = START_COUNTERS - START_DATA,
#elif
.counters_delta = (uintptr_t)START_COUNTERS
#endif

#if __clang_major__ >= 18
.bitmap_delta = 0,
#endif
.names_delta = (uintptr_t)START_NAMES,
#if __clang_major__ >= 19
.num_vtables = 0,
.vnames_size = 0,
#endif
.value_kind_last = LLVM_PROFILE_NUM_KINDS - 1,
};
unsigned int off = 0;
Expand Down