1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2019 Google, Inc.
4 * modified from kernel/gcov/gcc_4_7.c
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
16 * LLVM uses profiling data that's deliberately similar to GCC, but has a
17 * very different way of exporting that data. LLVM calls llvm_gcov_init() once
18 * per module, and provides a couple of callbacks that we can use to ask for
21 * We care about the "writeout" callback, which in turn calls back into
22 * compiler-rt/this module to dump all the gathered coverage data to disk:
24 * llvm_gcda_start_file()
25 * llvm_gcda_emit_function()
26 * llvm_gcda_emit_arcs()
27 * llvm_gcda_emit_function()
28 * llvm_gcda_emit_arcs()
29 * [... repeats for each function ...]
30 * llvm_gcda_summary_info()
31 * llvm_gcda_end_file()
33 * This design is much more stateless and unstructured than gcc's, and is
34 * intended to run at process exit. This forces us to keep some local state
35 * about which module we're dealing with at the moment. On the other hand, it
36 * also means we don't depend as much on how LLVM represents profiling data
39 * See LLVM's lib/Transforms/Instrumentation/GCOVProfiling.cpp for more
40 * details on how this works, particularly GCOVProfiler::emitProfileArcs(),
41 * GCOVProfiler::insertCounterWriteout(), and
42 * GCOVProfiler::insertFlush().
45 #define pr_fmt(fmt) "gcov: " fmt
47 #include <linux/kernel.h>
48 #include <linux/list.h>
49 #include <linux/printk.h>
50 #include <linux/ratelimit.h>
51 #include <linux/seq_file.h>
52 #include <linux/slab.h>
53 #include <linux/vmalloc.h>
56 typedef void (*llvm_gcov_callback
)(void);
59 struct list_head head
;
65 struct list_head functions
;
69 struct list_head head
;
73 u8 use_extra_checksum
;
78 const char *function_name
;
81 static struct gcov_info
*current_info
;
83 static LIST_HEAD(clang_gcov_list
);
85 void llvm_gcov_init(llvm_gcov_callback writeout
, llvm_gcov_callback flush
)
87 struct gcov_info
*info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
92 INIT_LIST_HEAD(&info
->head
);
93 INIT_LIST_HEAD(&info
->functions
);
95 mutex_lock(&gcov_lock
);
97 list_add_tail(&info
->head
, &clang_gcov_list
);
101 if (gcov_events_enabled
)
102 gcov_event(GCOV_ADD
, info
);
104 mutex_unlock(&gcov_lock
);
106 EXPORT_SYMBOL(llvm_gcov_init
);
108 void llvm_gcda_start_file(const char *orig_filename
, const char version
[4],
111 current_info
->filename
= orig_filename
;
112 memcpy(¤t_info
->version
, version
, sizeof(current_info
->version
));
113 current_info
->checksum
= checksum
;
115 EXPORT_SYMBOL(llvm_gcda_start_file
);
117 void llvm_gcda_emit_function(u32 ident
, const char *function_name
,
118 u32 func_checksum
, u8 use_extra_checksum
, u32 cfg_checksum
)
120 struct gcov_fn_info
*info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
125 INIT_LIST_HEAD(&info
->head
);
127 info
->checksum
= func_checksum
;
128 info
->use_extra_checksum
= use_extra_checksum
;
129 info
->cfg_checksum
= cfg_checksum
;
131 info
->function_name
= kstrdup(function_name
, GFP_KERNEL
);
133 list_add_tail(&info
->head
, ¤t_info
->functions
);
135 EXPORT_SYMBOL(llvm_gcda_emit_function
);
137 void llvm_gcda_emit_arcs(u32 num_counters
, u64
*counters
)
139 struct gcov_fn_info
*info
= list_last_entry(¤t_info
->functions
,
140 struct gcov_fn_info
, head
);
142 info
->num_counters
= num_counters
;
143 info
->counters
= counters
;
145 EXPORT_SYMBOL(llvm_gcda_emit_arcs
);
147 void llvm_gcda_summary_info(void)
150 EXPORT_SYMBOL(llvm_gcda_summary_info
);
152 void llvm_gcda_end_file(void)
155 EXPORT_SYMBOL(llvm_gcda_end_file
);
158 * gcov_info_filename - return info filename
159 * @info: profiling data set
161 const char *gcov_info_filename(struct gcov_info
*info
)
163 return info
->filename
;
167 * gcov_info_version - return info version
168 * @info: profiling data set
170 unsigned int gcov_info_version(struct gcov_info
*info
)
172 return info
->version
;
176 * gcov_info_next - return next profiling data set
177 * @info: profiling data set
179 * Returns next gcov_info following @info or first gcov_info in the chain if
182 struct gcov_info
*gcov_info_next(struct gcov_info
*info
)
185 return list_first_entry_or_null(&clang_gcov_list
,
186 struct gcov_info
, head
);
187 if (list_is_last(&info
->head
, &clang_gcov_list
))
189 return list_next_entry(info
, head
);
193 * gcov_info_link - link/add profiling data set to the list
194 * @info: profiling data set
196 void gcov_info_link(struct gcov_info
*info
)
198 list_add_tail(&info
->head
, &clang_gcov_list
);
202 * gcov_info_unlink - unlink/remove profiling data set from the list
203 * @prev: previous profiling data set
204 * @info: profiling data set
206 void gcov_info_unlink(struct gcov_info
*prev
, struct gcov_info
*info
)
208 /* Generic code unlinks while iterating. */
209 __list_del_entry(&info
->head
);
213 * gcov_info_within_module - check if a profiling data set belongs to a module
214 * @info: profiling data set
217 * Returns true if profiling data belongs module, false otherwise.
219 bool gcov_info_within_module(struct gcov_info
*info
, struct module
*mod
)
221 return within_module((unsigned long)info
->filename
, mod
);
224 /* Symbolic links to be created for each profiling data file. */
225 const struct gcov_link gcov_link
[] = {
226 { OBJ_TREE
, "gcno" }, /* Link to .gcno file in $(objtree). */
231 * gcov_info_reset - reset profiling data to zero
232 * @info: profiling data set
234 void gcov_info_reset(struct gcov_info
*info
)
236 struct gcov_fn_info
*fn
;
238 list_for_each_entry(fn
, &info
->functions
, head
)
239 memset(fn
->counters
, 0,
240 sizeof(fn
->counters
[0]) * fn
->num_counters
);
244 * gcov_info_is_compatible - check if profiling data can be added
245 * @info1: first profiling data set
246 * @info2: second profiling data set
248 * Returns non-zero if profiling data can be added, zero otherwise.
250 int gcov_info_is_compatible(struct gcov_info
*info1
, struct gcov_info
*info2
)
252 struct gcov_fn_info
*fn_ptr1
= list_first_entry_or_null(
253 &info1
->functions
, struct gcov_fn_info
, head
);
254 struct gcov_fn_info
*fn_ptr2
= list_first_entry_or_null(
255 &info2
->functions
, struct gcov_fn_info
, head
);
257 if (info1
->checksum
!= info2
->checksum
)
260 return fn_ptr1
== fn_ptr2
;
261 while (!list_is_last(&fn_ptr1
->head
, &info1
->functions
) &&
262 !list_is_last(&fn_ptr2
->head
, &info2
->functions
)) {
263 if (fn_ptr1
->checksum
!= fn_ptr2
->checksum
)
265 if (fn_ptr1
->use_extra_checksum
!= fn_ptr2
->use_extra_checksum
)
267 if (fn_ptr1
->use_extra_checksum
&&
268 fn_ptr1
->cfg_checksum
!= fn_ptr2
->cfg_checksum
)
270 fn_ptr1
= list_next_entry(fn_ptr1
, head
);
271 fn_ptr2
= list_next_entry(fn_ptr2
, head
);
273 return list_is_last(&fn_ptr1
->head
, &info1
->functions
) &&
274 list_is_last(&fn_ptr2
->head
, &info2
->functions
);
278 * gcov_info_add - add up profiling data
279 * @dest: profiling data set to which data is added
280 * @source: profiling data set which is added
282 * Adds profiling counts of @source to @dest.
284 void gcov_info_add(struct gcov_info
*dst
, struct gcov_info
*src
)
286 struct gcov_fn_info
*dfn_ptr
;
287 struct gcov_fn_info
*sfn_ptr
= list_first_entry_or_null(&src
->functions
,
288 struct gcov_fn_info
, head
);
290 list_for_each_entry(dfn_ptr
, &dst
->functions
, head
) {
293 for (i
= 0; i
< sfn_ptr
->num_counters
; i
++)
294 dfn_ptr
->counters
[i
] += sfn_ptr
->counters
[i
];
298 static struct gcov_fn_info
*gcov_fn_info_dup(struct gcov_fn_info
*fn
)
300 size_t cv_size
; /* counter values size */
301 struct gcov_fn_info
*fn_dup
= kmemdup(fn
, sizeof(*fn
),
305 INIT_LIST_HEAD(&fn_dup
->head
);
307 fn_dup
->function_name
= kstrdup(fn
->function_name
, GFP_KERNEL
);
308 if (!fn_dup
->function_name
)
311 cv_size
= fn
->num_counters
* sizeof(fn
->counters
[0]);
312 fn_dup
->counters
= vmalloc(cv_size
);
313 if (!fn_dup
->counters
)
315 memcpy(fn_dup
->counters
, fn
->counters
, cv_size
);
320 kfree(fn_dup
->function_name
);
327 * gcov_info_dup - duplicate profiling data set
328 * @info: profiling data set to duplicate
330 * Return newly allocated duplicate on success, %NULL on error.
332 struct gcov_info
*gcov_info_dup(struct gcov_info
*info
)
334 struct gcov_info
*dup
;
335 struct gcov_fn_info
*fn
;
337 dup
= kmemdup(info
, sizeof(*dup
), GFP_KERNEL
);
340 INIT_LIST_HEAD(&dup
->head
);
341 INIT_LIST_HEAD(&dup
->functions
);
342 dup
->filename
= kstrdup(info
->filename
, GFP_KERNEL
);
346 list_for_each_entry(fn
, &info
->functions
, head
) {
347 struct gcov_fn_info
*fn_dup
= gcov_fn_info_dup(fn
);
351 list_add_tail(&fn_dup
->head
, &dup
->functions
);
362 * gcov_info_free - release memory for profiling data set duplicate
363 * @info: profiling data set duplicate to free
365 void gcov_info_free(struct gcov_info
*info
)
367 struct gcov_fn_info
*fn
, *tmp
;
369 list_for_each_entry_safe(fn
, tmp
, &info
->functions
, head
) {
370 kfree(fn
->function_name
);
375 kfree(info
->filename
);
379 #define ITER_STRIDE PAGE_SIZE
382 * struct gcov_iterator - specifies current file position in logical records
383 * @info: associated profiling data
384 * @buffer: buffer containing file data
385 * @size: size of buffer
386 * @pos: current position in file
388 struct gcov_iterator
{
389 struct gcov_info
*info
;
396 * store_gcov_u32 - store 32 bit number in gcov format to buffer
397 * @buffer: target buffer or NULL
398 * @off: offset into the buffer
399 * @v: value to be stored
401 * Number format defined by gcc: numbers are recorded in the 32 bit
402 * unsigned binary form of the endianness of the machine generating the
403 * file. Returns the number of bytes stored. If @buffer is %NULL, doesn't
406 static size_t store_gcov_u32(void *buffer
, size_t off
, u32 v
)
415 return sizeof(*data
);
419 * store_gcov_u64 - store 64 bit number in gcov format to buffer
420 * @buffer: target buffer or NULL
421 * @off: offset into the buffer
422 * @v: value to be stored
424 * Number format defined by gcc: numbers are recorded in the 32 bit
425 * unsigned binary form of the endianness of the machine generating the
426 * file. 64 bit numbers are stored as two 32 bit numbers, the low part
427 * first. Returns the number of bytes stored. If @buffer is %NULL, doesn't store
430 static size_t store_gcov_u64(void *buffer
, size_t off
, u64 v
)
437 data
[0] = (v
& 0xffffffffUL
);
441 return sizeof(*data
) * 2;
445 * convert_to_gcda - convert profiling data set to gcda file format
446 * @buffer: the buffer to store file data or %NULL if no data should be stored
447 * @info: profiling data set to be converted
449 * Returns the number of bytes that were/would have been stored into the buffer.
451 static size_t convert_to_gcda(char *buffer
, struct gcov_info
*info
)
453 struct gcov_fn_info
*fi_ptr
;
457 pos
+= store_gcov_u32(buffer
, pos
, GCOV_DATA_MAGIC
);
458 pos
+= store_gcov_u32(buffer
, pos
, info
->version
);
459 pos
+= store_gcov_u32(buffer
, pos
, info
->checksum
);
461 list_for_each_entry(fi_ptr
, &info
->functions
, head
) {
465 if (fi_ptr
->use_extra_checksum
)
468 pos
+= store_gcov_u32(buffer
, pos
, GCOV_TAG_FUNCTION
);
469 pos
+= store_gcov_u32(buffer
, pos
, len
);
470 pos
+= store_gcov_u32(buffer
, pos
, fi_ptr
->ident
);
471 pos
+= store_gcov_u32(buffer
, pos
, fi_ptr
->checksum
);
472 if (fi_ptr
->use_extra_checksum
)
473 pos
+= store_gcov_u32(buffer
, pos
, fi_ptr
->cfg_checksum
);
475 pos
+= store_gcov_u32(buffer
, pos
, GCOV_TAG_COUNTER_BASE
);
476 pos
+= store_gcov_u32(buffer
, pos
, fi_ptr
->num_counters
* 2);
477 for (i
= 0; i
< fi_ptr
->num_counters
; i
++)
478 pos
+= store_gcov_u64(buffer
, pos
, fi_ptr
->counters
[i
]);
485 * gcov_iter_new - allocate and initialize profiling data iterator
486 * @info: profiling data set to be iterated
488 * Return file iterator on success, %NULL otherwise.
490 struct gcov_iterator
*gcov_iter_new(struct gcov_info
*info
)
492 struct gcov_iterator
*iter
;
494 iter
= kzalloc(sizeof(struct gcov_iterator
), GFP_KERNEL
);
499 /* Dry-run to get the actual buffer size. */
500 iter
->size
= convert_to_gcda(NULL
, info
);
501 iter
->buffer
= vmalloc(iter
->size
);
505 convert_to_gcda(iter
->buffer
, info
);
516 * gcov_iter_get_info - return profiling data set for given file iterator
517 * @iter: file iterator
519 void gcov_iter_free(struct gcov_iterator
*iter
)
526 * gcov_iter_get_info - return profiling data set for given file iterator
527 * @iter: file iterator
529 struct gcov_info
*gcov_iter_get_info(struct gcov_iterator
*iter
)
535 * gcov_iter_start - reset file iterator to starting position
536 * @iter: file iterator
538 void gcov_iter_start(struct gcov_iterator
*iter
)
544 * gcov_iter_next - advance file iterator to next logical record
545 * @iter: file iterator
547 * Return zero if new position is valid, non-zero if iterator has reached end.
549 int gcov_iter_next(struct gcov_iterator
*iter
)
551 if (iter
->pos
< iter
->size
)
552 iter
->pos
+= ITER_STRIDE
;
554 if (iter
->pos
>= iter
->size
)
561 * gcov_iter_write - write data for current pos to seq_file
562 * @iter: file iterator
563 * @seq: seq_file handle
565 * Return zero on success, non-zero otherwise.
567 int gcov_iter_write(struct gcov_iterator
*iter
, struct seq_file
*seq
)
571 if (iter
->pos
>= iter
->size
)
575 if (iter
->pos
+ len
> iter
->size
)
576 len
= iter
->size
- iter
->pos
;
578 seq_write(seq
, iter
->buffer
+ iter
->pos
, len
);