diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/gcov/gcc_3_4.c | 12 | ||||
-rw-r--r-- | kernel/gcov/gcov.h | 11 |
2 files changed, 22 insertions, 1 deletions
diff --git a/kernel/gcov/gcc_3_4.c b/kernel/gcov/gcc_3_4.c index d753d1152b7b..bc78336bc345 100644 --- a/kernel/gcov/gcc_3_4.c +++ b/kernel/gcov/gcc_3_4.c @@ -466,8 +466,12 @@ int gcov_iter_write(struct gcov_iterator *iter, struct seq_file *seq) rc = seq_write_gcov_u32(seq, GCOV_TAG_FUNCTION); break; case RECORD_FUNCTON_TAG_LEN: +#ifdef GCOV_FN_INFO_HAS_NAME_FIELD rc = seq_write_gcov_u32(seq, GCOV_TAG_FUNCTION_LENGTH + (sizeof_str(get_func(iter)->name))); +#else + rc = seq_write_gcov_u32(seq, GCOV_TAG_FUNCTION_LENGTH); +#endif break; case RECORD_FUNCTION_IDENT: rc = seq_write_gcov_u32(seq, get_func(iter)->ident); @@ -479,11 +483,19 @@ int gcov_iter_write(struct gcov_iterator *iter, struct seq_file *seq) rc = seq_write_gcov_u32(seq, get_func(iter)->cfg_checksum); break; case RECORD_FUNCTION_NAME_LEN: +#ifdef GCOV_FN_INFO_HAS_NAME_FIELD rc = seq_write_gcov_u32(seq, (sizeof_str(get_func(iter)->name) - 1)); +#else + rc = 0; +#endif break; case RECORD_FUNCTION_NAME: +#ifdef GCOV_FN_INFO_HAS_NAME_FIELD rc = seq_write_gcov_str(seq, get_func(iter)->name); +#else + rc = 0; +#endif break; case RECORD_COUNT_TAG: rc = seq_write_gcov_u32(seq, diff --git a/kernel/gcov/gcov.h b/kernel/gcov/gcov.h index 040c6980df0d..8c5130a5c1b5 100644 --- a/kernel/gcov/gcov.h +++ b/kernel/gcov/gcov.h @@ -17,7 +17,14 @@ #include <linux/types.h> /* - * Profiling data types used for gcc 3.4 and above - these are defined by + * GCC 4.6 drops the 'name' field from 'struct gcov_fn_info'. + */ +#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6) +#define GCOV_FN_INFO_HAS_NAME_FIELD +#endif + +/* + * Profiling data types used for at least gcc 4.4 and 4.6 - these are defined by * gcc and need to be kept as close to the original definition as possible to * remain compatible. */ @@ -77,7 +84,9 @@ struct gcov_fn_info { unsigned int lineno_checksum; unsigned int cfg_checksum; unsigned int dc_offset; +#ifdef GCOV_FN_INFO_HAS_NAME_FIELD const char *name; +#endif unsigned int n_ctrs[0]; }; |