xref: /linux/kernel/gcov/gcc_base.c (revision 826eba0d)
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