diff options
author | Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> | 2003-05-04 17:20:26 +0200 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2003-05-04 15:20:26 +0000 |
commit | 09780dfb652960d422da1c5a9d81dc536cdf09f4 (patch) | |
tree | 05de4edb80cb0ae6e59ff9b0f5b6509cae6fde04 /gcc/coverage.c | |
parent | c71f2ffd78811e3aaafdca4618c737c0c10e72ca (diff) | |
download | gcc-09780dfb652960d422da1c5a9d81dc536cdf09f4.zip gcc-09780dfb652960d422da1c5a9d81dc536cdf09f4.tar.gz gcc-09780dfb652960d422da1c5a9d81dc536cdf09f4.tar.bz2 |
Makefile.in (LIBGCOV): Add _gcov_merge_add.
* Makefile.in (LIBGCOV): Add _gcov_merge_add.
* gcov-io.h: Make GCOV_LINKAGE extern in libgcov and prevent resulting
namespace clash.
(GCOV_MERGE_FUNCTIONS): New.
(gcov_merge_fn): Declare.
(struct gcov_ctr_info): New field "merge".
(__gcov_merge_add): Declare.
* coverage.c (ctr_merge_functions): New.
(build_ctr_info_type, build_ctr_info_value): Initialize merge field
of gcov_ctr_info type.
* libgcov.c (__gcov_merge_add): New.
(gcov_exit): Call a hook to merge values of counters.
From-SVN: r66457
Diffstat (limited to 'gcc/coverage.c')
-rw-r--r-- | gcc/coverage.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/gcc/coverage.c b/gcc/coverage.c index 6d8ae9a..36400f3 100644 --- a/gcc/coverage.c +++ b/gcc/coverage.c @@ -98,6 +98,9 @@ static htab_t counts_hash = NULL; /* The names of the counter tables. */ static GTY(()) rtx ctr_labels[GCOV_COUNTERS]; +/* The names of merge functions for counters. */ +static const char *ctr_merge_functions[GCOV_COUNTERS] = GCOV_MERGE_FUNCTIONS; + /* Forward declarations. */ static hashval_t htab_counts_entry_hash PARAMS ((const void *)); static int htab_counts_entry_eq PARAMS ((const void *, const void *)); @@ -559,6 +562,7 @@ build_ctr_info_type () { tree type = (*lang_hooks.types.make_type) (RECORD_TYPE); tree field, fields = NULL_TREE; + tree gcov_merge_fn_type; /* counters */ field = build_decl (FIELD_DECL, NULL_TREE, unsigned_type_node); @@ -571,6 +575,18 @@ build_ctr_info_type () TREE_CHAIN (field) = fields; fields = field; + /* merge */ + gcov_merge_fn_type = + build_function_type_list ( + void_type_node, + build_pointer_type (make_signed_type (GCOV_TYPE_SIZE)), + unsigned_type_node, + NULL_TREE); + field = build_decl (FIELD_DECL, NULL_TREE, + build_pointer_type (gcov_merge_fn_type)); + TREE_CHAIN (field) = fields; + fields = field; + finish_builtin_struct (type, "__gcov_ctr_info", fields, NULL_TREE); return type; @@ -587,6 +603,7 @@ build_ctr_info_value (counter, type) { tree value = NULL_TREE; tree fields = TYPE_FIELDS (type); + tree fn; /* counters */ value = tree_cons (fields, @@ -614,6 +631,20 @@ build_ctr_info_value (counter, type) } else value = tree_cons (fields, null_pointer_node, value); + fields = TREE_CHAIN (fields); + + fn = build_decl (FUNCTION_DECL, + get_identifier (ctr_merge_functions[counter]), + TREE_TYPE (TREE_TYPE (fields))); + DECL_EXTERNAL (fn) = 1; + TREE_PUBLIC (fn) = 1; + DECL_ARTIFICIAL (fn) = 1; + TREE_NOTHROW (fn) = 1; + value = tree_cons (fields, + build1 (ADDR_EXPR, + TREE_TYPE (fields), + fn), + value); value = build_constructor (type, nreverse (value)); |