xref: /linux/kernel/gcov/gcov.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
22521f2c2SPeter Oberparleiter /*
32521f2c2SPeter Oberparleiter  *  Profiling infrastructure declarations.
42521f2c2SPeter Oberparleiter  *
52521f2c2SPeter Oberparleiter  *  This file is based on gcc-internal definitions. Data structures are
62521f2c2SPeter Oberparleiter  *  defined to be compatible with gcc counterparts. For a better
72521f2c2SPeter Oberparleiter  *  understanding, refer to gcc source: gcc/gcov-io.h.
82521f2c2SPeter Oberparleiter  *
92521f2c2SPeter Oberparleiter  *    Copyright IBM Corp. 2009
102521f2c2SPeter Oberparleiter  *    Author(s): Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
112521f2c2SPeter Oberparleiter  *
122521f2c2SPeter Oberparleiter  *    Uses gcc-internal data definitions.
132521f2c2SPeter Oberparleiter  */
142521f2c2SPeter Oberparleiter 
152521f2c2SPeter Oberparleiter #ifndef GCOV_H
162521f2c2SPeter Oberparleiter #define GCOV_H GCOV_H
172521f2c2SPeter Oberparleiter 
18e178a5beSGreg Hackmann #include <linux/module.h>
192521f2c2SPeter Oberparleiter #include <linux/types.h>
202521f2c2SPeter Oberparleiter 
212521f2c2SPeter Oberparleiter /*
222521f2c2SPeter Oberparleiter  * Profiling data types used for gcc 3.4 and above - these are defined by
232521f2c2SPeter Oberparleiter  * gcc and need to be kept as close to the original definition as possible to
242521f2c2SPeter Oberparleiter  * remain compatible.
252521f2c2SPeter Oberparleiter  */
262521f2c2SPeter Oberparleiter #define GCOV_DATA_MAGIC		((unsigned int) 0x67636461)
272521f2c2SPeter Oberparleiter #define GCOV_TAG_FUNCTION	((unsigned int) 0x01000000)
282521f2c2SPeter Oberparleiter #define GCOV_TAG_COUNTER_BASE	((unsigned int) 0x01a10000)
292521f2c2SPeter Oberparleiter #define GCOV_TAG_FOR_COUNTER(count)					\
302521f2c2SPeter Oberparleiter 	(GCOV_TAG_COUNTER_BASE + ((unsigned int) (count) << 17))
312521f2c2SPeter Oberparleiter 
322521f2c2SPeter Oberparleiter #if BITS_PER_LONG >= 64
332521f2c2SPeter Oberparleiter typedef long gcov_type;
342521f2c2SPeter Oberparleiter #else
352521f2c2SPeter Oberparleiter typedef long long gcov_type;
362521f2c2SPeter Oberparleiter #endif
372521f2c2SPeter Oberparleiter 
388cbce376SFrantisek Hrbata /* Opaque gcov_info. The gcov structures can change as for example in gcc 4.7 so
398cbce376SFrantisek Hrbata  * we cannot use full definition here and they need to be placed in gcc specific
408cbce376SFrantisek Hrbata  * implementation of gcov. This also means no direct access to the members in
418cbce376SFrantisek Hrbata  * generic code and usage of the interface below.*/
428cbce376SFrantisek Hrbata struct gcov_info;
432521f2c2SPeter Oberparleiter 
448cbce376SFrantisek Hrbata /* Interface to access gcov_info data  */
458cbce376SFrantisek Hrbata const char *gcov_info_filename(struct gcov_info *info);
468cbce376SFrantisek Hrbata unsigned int gcov_info_version(struct gcov_info *info);
478cbce376SFrantisek Hrbata struct gcov_info *gcov_info_next(struct gcov_info *info);
488cbce376SFrantisek Hrbata void gcov_info_link(struct gcov_info *info);
498cbce376SFrantisek Hrbata void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info);
50e178a5beSGreg Hackmann bool gcov_info_within_module(struct gcov_info *info, struct module *mod);
51*7a1d55b9SJohannes Berg size_t convert_to_gcda(char *buffer, struct gcov_info *info);
522521f2c2SPeter Oberparleiter 
532521f2c2SPeter Oberparleiter /* Base interface. */
542521f2c2SPeter Oberparleiter enum gcov_action {
552521f2c2SPeter Oberparleiter 	GCOV_ADD,
562521f2c2SPeter Oberparleiter 	GCOV_REMOVE,
572521f2c2SPeter Oberparleiter };
582521f2c2SPeter Oberparleiter 
592521f2c2SPeter Oberparleiter void gcov_event(enum gcov_action action, struct gcov_info *info);
602521f2c2SPeter Oberparleiter void gcov_enable_events(void);
612521f2c2SPeter Oberparleiter 
62*7a1d55b9SJohannes Berg /* writing helpers */
63*7a1d55b9SJohannes Berg size_t store_gcov_u32(void *buffer, size_t off, u32 v);
64*7a1d55b9SJohannes Berg size_t store_gcov_u64(void *buffer, size_t off, u64 v);
652521f2c2SPeter Oberparleiter 
662521f2c2SPeter Oberparleiter /* gcov_info control. */
672521f2c2SPeter Oberparleiter void gcov_info_reset(struct gcov_info *info);
682521f2c2SPeter Oberparleiter int gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2);
692521f2c2SPeter Oberparleiter void gcov_info_add(struct gcov_info *dest, struct gcov_info *source);
702521f2c2SPeter Oberparleiter struct gcov_info *gcov_info_dup(struct gcov_info *info);
712521f2c2SPeter Oberparleiter void gcov_info_free(struct gcov_info *info);
722521f2c2SPeter Oberparleiter 
732521f2c2SPeter Oberparleiter struct gcov_link {
742521f2c2SPeter Oberparleiter 	enum {
752521f2c2SPeter Oberparleiter 		OBJ_TREE,
762521f2c2SPeter Oberparleiter 		SRC_TREE,
772521f2c2SPeter Oberparleiter 	} dir;
782521f2c2SPeter Oberparleiter 	const char *ext;
792521f2c2SPeter Oberparleiter };
802521f2c2SPeter Oberparleiter extern const struct gcov_link gcov_link[];
812521f2c2SPeter Oberparleiter 
82826eba0dSGreg Hackmann extern int gcov_events_enabled;
83826eba0dSGreg Hackmann extern struct mutex gcov_lock;
84826eba0dSGreg Hackmann 
852521f2c2SPeter Oberparleiter #endif /* GCOV_H */
86