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
@@ -20,7 +20,6 @@
|
||||
#include <linux/mutex.h>
|
||||
#include "gcov.h"
|
||||
|
||||
static struct gcov_info *gcov_info_head;
|
||||
static int gcov_events_enabled;
|
||||
static DEFINE_MUTEX(gcov_lock);
|
||||
|
||||
@@ -34,7 +33,7 @@ void __gcov_init(struct gcov_info *info)
|
||||
|
||||
mutex_lock(&gcov_lock);
|
||||
if (gcov_version == 0) {
|
||||
gcov_version = info->version;
|
||||
gcov_version = gcov_info_version(info);
|
||||
/*
|
||||
* Printing gcc's version magic may prove useful for debugging
|
||||
* incompatibility reports.
|
||||
@@ -45,8 +44,7 @@ void __gcov_init(struct gcov_info *info)
|
||||
* Add new profiling data structure to list and inform event
|
||||
* listener.
|
||||
*/
|
||||
info->next = gcov_info_head;
|
||||
gcov_info_head = info;
|
||||
gcov_info_link(info);
|
||||
if (gcov_events_enabled)
|
||||
gcov_event(GCOV_ADD, info);
|
||||
mutex_unlock(&gcov_lock);
|
||||
@@ -91,13 +89,15 @@ EXPORT_SYMBOL(__gcov_merge_delta);
|
||||
*/
|
||||
void gcov_enable_events(void)
|
||||
{
|
||||
struct gcov_info *info;
|
||||
struct gcov_info *info = NULL;
|
||||
|
||||
mutex_lock(&gcov_lock);
|
||||
gcov_events_enabled = 1;
|
||||
|
||||
/* Perform event callback for previously registered entries. */
|
||||
for (info = gcov_info_head; info; info = info->next)
|
||||
while ((info = gcov_info_next(info)))
|
||||
gcov_event(GCOV_ADD, info);
|
||||
|
||||
mutex_unlock(&gcov_lock);
|
||||
}
|
||||
|
||||
@@ -112,25 +112,23 @@ static int gcov_module_notifier(struct notifier_block *nb, unsigned long event,
|
||||
void *data)
|
||||
{
|
||||
struct module *mod = data;
|
||||
struct gcov_info *info;
|
||||
struct gcov_info *prev;
|
||||
struct gcov_info *info = NULL;
|
||||
struct gcov_info *prev = NULL;
|
||||
|
||||
if (event != MODULE_STATE_GOING)
|
||||
return NOTIFY_OK;
|
||||
mutex_lock(&gcov_lock);
|
||||
prev = NULL;
|
||||
|
||||
/* Remove entries located in module from linked list. */
|
||||
for (info = gcov_info_head; info; info = info->next) {
|
||||
while ((info = gcov_info_next(info))) {
|
||||
if (within(info, mod->module_core, mod->core_size)) {
|
||||
if (prev)
|
||||
prev->next = info->next;
|
||||
else
|
||||
gcov_info_head = info->next;
|
||||
gcov_info_unlink(prev, info);
|
||||
if (gcov_events_enabled)
|
||||
gcov_event(GCOV_REMOVE, info);
|
||||
} else
|
||||
prev = info;
|
||||
}
|
||||
|
||||
mutex_unlock(&gcov_lock);
|
||||
|
||||
return NOTIFY_OK;
|
||||
|
||||
Reference in New Issue
Block a user