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