diff options
Diffstat (limited to 'kernel/gcov/gcc_base.c')
-rw-r--r-- | kernel/gcov/gcc_base.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/kernel/gcov/gcc_base.c b/kernel/gcov/gcc_base.c new file mode 100644 index 000000000000..3cf736b9f880 --- /dev/null +++ b/kernel/gcov/gcc_base.c | |||
@@ -0,0 +1,86 @@ | |||
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(GCOV_ADD, info); | ||
32 | mutex_unlock(&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); | ||