text: /*
   *  Profiling infrastructure declarations.
   *
   *  This file is based on gcc-internal definitions. Data structures are
   *  defined to be compatible with gcc counterparts. For a better
   *  understanding, refer to gcc source: gcc/gcov-io.h.
   *
   *    Copyright IBM Corp. 2009
   *    Author(s): Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
   *
   *    Uses gcc-internal data definitions.
   */
  
  #ifndef GCOV_H
  #define GCOV_H GCOV_H
  
  #include <linux/types.h>
  
  /*
   * Profiling data types used for gcc 3.4 and above - these are defined by
   * gcc and need to be kept as close to the original definition as possible to
   * remain compatible.
   */
  #define GCOV_COUNTERS		5
  #define GCOV_DATA_MAGIC		((unsigned int) 0x67636461)
  #define GCOV_TAG_FUNCTION	((unsigned int) 0x01000000)
  #define GCOV_TAG_COUNTER_BASE	((unsigned int) 0x01a10000)
  #define GCOV_TAG_FOR_COUNTER(count)					\
  	(GCOV_TAG_COUNTER_BASE + ((unsigned int) (count) << 17))
  
  #if BITS_PER_LONG >= 64
  typedef long gcov_type;
  #else
  typedef long long gcov_type;
  #endif
  
  /**
   * struct gcov_fn_info - profiling meta data per function
   * @ident: object file-unique function identifier
   * @checksum: function checksum
   * @n_ctrs: number of values per counter type belonging to this function
   *
   * This data is generated by gcc during compilation and doesn't change
   * at run-time.
   */
  struct gcov_fn_info {
  	unsigned int ident;
  	unsigned int checksum;
  	unsigned int n_ctrs[0];
  };
  
  /**
   * struct gcov_ctr_info - profiling data per counter type
   * @num: number of counter values for this type
   * @values: array of counter values for this type
   * @merge: merge function for counter values of this type (unused)
   *
   * This data is generated by gcc during compilation and doesn't change
   * at run-time with the exception of the values array.
   */
  struct gcov_ctr_info {
  	unsigned int	num;
  	gcov_type	*values;
  	void		(*merge)(gcov_type *, unsigned int);
  };
  
  /**
   * struct gcov_info - profiling data per object file
   * @version: gcov version magic indicating the gcc version used for compilation
   * @next: list head for a singly-linked list
   * @stamp: time stamp
   * @filename: name of the associated gcov data file
   * @n_functions: number of instrumented functions
   * @functions: function data
   * @ctr_mask: mask specifying which counter types are active
   * @counts: counter data per counter type
   *
   * This data is generated by gcc during compilation and doesn't change
   * at run-time with the exception of the next pointer.
   */
  struct gcov_info {
  	unsigned int			version;
  	struct gcov_info		*next;
  	unsigned int			stamp;
  	const char			*filename;
  	unsigned int			n_functions;
  	const struct gcov_fn_info	*functions;
  	unsigned int			ctr_mask;
  	struct gcov_ctr_info		counts[0];
  };
  
  /* Base interface. */
  enum gcov_action {
  	GCOV_ADD,
  	GCOV_REMOVE,
  };
  
  void gcov_event(enum gcov_action action, struct gcov_info *info);
  void gcov_enable_events(void);
  
  /* Iterator control. */
  struct seq_file;
  struct gcov_iterator;
  
  struct gcov_iterator *gcov_iter_new(struct gcov_info *info);
  void gcov_iter_free(struct gcov_iterator *iter);
  void gcov_iter_start(struct gcov_iterator *iter);
  int gcov_iter_next(struct gcov_iterator *iter);
  int gcov_iter_write(struct gcov_iterator *iter, struct seq_file *seq);
  struct gcov_info *gcov_iter_get_info(struct gcov_iterator *iter);
  
  /* gcov_info control. */
  void gcov_info_reset(struct gcov_info *info);
  int gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2);
  void gcov_info_add(struct gcov_info *dest, struct gcov_info *source);
  struct gcov_info *gcov_info_dup(struct gcov_info *info);
  void gcov_info_free(struct gcov_info *info);
  
  struct gcov_link {
  	enum {
  		OBJ_TREE,
  		SRC_TREE,
  	} dir;
  	const char *ext;
  };
  extern const struct gcov_link gcov_link[];
  
  #endif /* GCOV_H */
  