gcov.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Profiling infrastructure declarations.
  4. *
  5. * This file is based on gcc-internal definitions. Data structures are
  6. * defined to be compatible with gcc counterparts. For a better
  7. * understanding, refer to gcc source: gcc/gcov-io.h.
  8. *
  9. * Copyright IBM Corp. 2009
  10. * Author(s): Peter Oberparleiter <[email protected]>
  11. *
  12. * Uses gcc-internal data definitions.
  13. */
  14. #ifndef GCOV_H
  15. #define GCOV_H GCOV_H
  16. #include <linux/module.h>
  17. #include <linux/types.h>
  18. /*
  19. * Profiling data types used for gcc 3.4 and above - these are defined by
  20. * gcc and need to be kept as close to the original definition as possible to
  21. * remain compatible.
  22. */
  23. #define GCOV_DATA_MAGIC ((unsigned int) 0x67636461)
  24. #define GCOV_TAG_FUNCTION ((unsigned int) 0x01000000)
  25. #define GCOV_TAG_COUNTER_BASE ((unsigned int) 0x01a10000)
  26. #define GCOV_TAG_FOR_COUNTER(count) \
  27. (GCOV_TAG_COUNTER_BASE + ((unsigned int) (count) << 17))
  28. #if BITS_PER_LONG >= 64
  29. typedef long gcov_type;
  30. #else
  31. typedef long long gcov_type;
  32. #endif
  33. /* Opaque gcov_info. The gcov structures can change as for example in gcc 4.7 so
  34. * we cannot use full definition here and they need to be placed in gcc specific
  35. * implementation of gcov. This also means no direct access to the members in
  36. * generic code and usage of the interface below.*/
  37. struct gcov_info;
  38. /* Interface to access gcov_info data */
  39. const char *gcov_info_filename(struct gcov_info *info);
  40. unsigned int gcov_info_version(struct gcov_info *info);
  41. struct gcov_info *gcov_info_next(struct gcov_info *info);
  42. void gcov_info_link(struct gcov_info *info);
  43. void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info);
  44. bool gcov_info_within_module(struct gcov_info *info, struct module *mod);
  45. size_t convert_to_gcda(char *buffer, struct gcov_info *info);
  46. /* Base interface. */
  47. enum gcov_action {
  48. GCOV_ADD,
  49. GCOV_REMOVE,
  50. };
  51. void gcov_event(enum gcov_action action, struct gcov_info *info);
  52. void gcov_enable_events(void);
  53. /* writing helpers */
  54. size_t store_gcov_u32(void *buffer, size_t off, u32 v);
  55. size_t store_gcov_u64(void *buffer, size_t off, u64 v);
  56. /* gcov_info control. */
  57. void gcov_info_reset(struct gcov_info *info);
  58. int gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2);
  59. void gcov_info_add(struct gcov_info *dest, struct gcov_info *source);
  60. struct gcov_info *gcov_info_dup(struct gcov_info *info);
  61. void gcov_info_free(struct gcov_info *info);
  62. struct gcov_link {
  63. enum {
  64. OBJ_TREE,
  65. SRC_TREE,
  66. } dir;
  67. const char *ext;
  68. };
  69. extern const struct gcov_link gcov_link[];
  70. extern int gcov_events_enabled;
  71. extern struct mutex gcov_lock;
  72. #endif /* GCOV_H */