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