gcov: move gcov structs definitions to a gcc version specific file
Since also the gcov structures(gcov_info, gcov_fn_info, gcov_ctr_info) can change between gcc releases, as shown in gcc 4.7, they cannot be defined in a common header and need to be moved to a specific gcc implemention file. This also requires to make the gcov_info structure opaque for the common code and to introduce simple helpers for accessing data inside gcov_info. Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com> Cc: Jan Stancek <jstancek@redhat.com> Cc: Kees Cook <keescook@chromium.org> Acked-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Andy Gospodarek <agospoda@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
0d20633b04
commit
8cbce376e3
@ -21,6 +21,121 @@
|
||||
#include <linux/vmalloc.h>
|
||||
#include "gcov.h"
|
||||
|
||||
#define GCOV_COUNTERS 5
|
||||
|
||||
static struct gcov_info *gcov_info_head;
|
||||
|
||||
/**
|
||||
* 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];
|
||||
};
|
||||
|
||||
/**
|
||||
* gcov_info_filename - return info filename
|
||||
* @info: profiling data set
|
||||
*/
|
||||
const char *gcov_info_filename(struct gcov_info *info)
|
||||
{
|
||||
return info->filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* gcov_info_version - return info version
|
||||
* @info: profiling data set
|
||||
*/
|
||||
unsigned int gcov_info_version(struct gcov_info *info)
|
||||
{
|
||||
return info->version;
|
||||
}
|
||||
|
||||
/**
|
||||
* gcov_info_next - return next profiling data set
|
||||
* @info: profiling data set
|
||||
*
|
||||
* Returns next gcov_info following @info or first gcov_info in the chain if
|
||||
* @info is %NULL.
|
||||
*/
|
||||
struct gcov_info *gcov_info_next(struct gcov_info *info)
|
||||
{
|
||||
if (!info)
|
||||
return gcov_info_head;
|
||||
|
||||
return info->next;
|
||||
}
|
||||
|
||||
/**
|
||||
* gcov_info_link - link/add profiling data set to the list
|
||||
* @info: profiling data set
|
||||
*/
|
||||
void gcov_info_link(struct gcov_info *info)
|
||||
{
|
||||
info->next = gcov_info_head;
|
||||
gcov_info_head = info;
|
||||
}
|
||||
|
||||
/**
|
||||
* gcov_info_unlink - unlink/remove profiling data set from the list
|
||||
* @prev: previous profiling data set
|
||||
* @info: profiling data set
|
||||
*/
|
||||
void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = info->next;
|
||||
else
|
||||
gcov_info_head = info->next;
|
||||
}
|
||||
|
||||
/* Symbolic links to be created for each profiling data file. */
|
||||
const struct gcov_link gcov_link[] = {
|
||||
{ OBJ_TREE, "gcno" }, /* Link to .gcno file in $(objtree). */
|
||||
|
Reference in New Issue
Block a user