1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | |
3 | #include <linux/export.h> |
4 | #include <linux/kernel.h> |
5 | #include <linux/mutex.h> |
6 | #include "gcov.h" |
7 | |
8 | /* |
9 | * __gcov_init is called by gcc-generated constructor code for each object |
10 | * file compiled with -fprofile-arcs. |
11 | */ |
12 | void __gcov_init(struct gcov_info *info) |
13 | { |
14 | static unsigned int gcov_version; |
15 | |
16 | mutex_lock(&gcov_lock); |
17 | if (gcov_version == 0) { |
18 | gcov_version = gcov_info_version(info); |
19 | /* |
20 | * Printing gcc's version magic may prove useful for debugging |
21 | * incompatibility reports. |
22 | */ |
23 | pr_info("version magic: 0x%x\n", gcov_version); |
24 | } |
25 | /* |
26 | * Add new profiling data structure to list and inform event |
27 | * listener. |
28 | */ |
29 | gcov_info_link(info); |
30 | if (gcov_events_enabled) |
31 | gcov_event(action: GCOV_ADD, info); |
32 | mutex_unlock(lock: &gcov_lock); |
33 | } |
34 | EXPORT_SYMBOL(__gcov_init); |
35 | |
36 | /* |
37 | * These functions may be referenced by gcc-generated profiling code but serve |
38 | * no function for kernel profiling. |
39 | */ |
40 | void __gcov_flush(void) |
41 | { |
42 | /* Unused. */ |
43 | } |
44 | EXPORT_SYMBOL(__gcov_flush); |
45 | |
46 | void __gcov_merge_add(gcov_type *counters, unsigned int n_counters) |
47 | { |
48 | /* Unused. */ |
49 | } |
50 | EXPORT_SYMBOL(__gcov_merge_add); |
51 | |
52 | void __gcov_merge_single(gcov_type *counters, unsigned int n_counters) |
53 | { |
54 | /* Unused. */ |
55 | } |
56 | EXPORT_SYMBOL(__gcov_merge_single); |
57 | |
58 | void __gcov_merge_delta(gcov_type *counters, unsigned int n_counters) |
59 | { |
60 | /* Unused. */ |
61 | } |
62 | EXPORT_SYMBOL(__gcov_merge_delta); |
63 | |
64 | void __gcov_merge_ior(gcov_type *counters, unsigned int n_counters) |
65 | { |
66 | /* Unused. */ |
67 | } |
68 | EXPORT_SYMBOL(__gcov_merge_ior); |
69 | |
70 | void __gcov_merge_time_profile(gcov_type *counters, unsigned int n_counters) |
71 | { |
72 | /* Unused. */ |
73 | } |
74 | EXPORT_SYMBOL(__gcov_merge_time_profile); |
75 | |
76 | void __gcov_merge_icall_topn(gcov_type *counters, unsigned int n_counters) |
77 | { |
78 | /* Unused. */ |
79 | } |
80 | EXPORT_SYMBOL(__gcov_merge_icall_topn); |
81 | |
82 | void __gcov_exit(void) |
83 | { |
84 | /* Unused. */ |
85 | } |
86 | EXPORT_SYMBOL(__gcov_exit); |
87 |