diff options
author | Martin Liska <mliska@suse.cz> | 2020-06-02 13:31:48 +0200 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2020-07-31 10:57:50 +0200 |
commit | bc2b1a232b1825b421a1aaa21a0865b2d1e4e08c (patch) | |
tree | ca7bba49f12a55544ae9fa3ab9c44dfa5d9d0742 /gcc | |
parent | 072a8b8fb6e861d8ac2db847bcc81dbcb1ef1b35 (diff) | |
download | gcc-bc2b1a232b1825b421a1aaa21a0865b2d1e4e08c.zip gcc-bc2b1a232b1825b421a1aaa21a0865b2d1e4e08c.tar.gz gcc-bc2b1a232b1825b421a1aaa21a0865b2d1e4e08c.tar.bz2 |
libgcov: support overloaded malloc
gcc/ChangeLog:
* gcov-io.h (GCOV_PREALLOCATED_KVP): New.
libgcc/ChangeLog:
* libgcov-driver.c: Add __gcov_kvp_pool
and __gcov_kvp_pool_index variables.
* libgcov.h (allocate_gcov_kvp): New.
(gcov_topn_add_value): Use it.
gcc/testsuite/ChangeLog:
* gcc.dg/tree-prof/indir-call-prof-malloc.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gcov-io.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c | 49 |
2 files changed, 52 insertions, 0 deletions
diff --git a/gcc/gcov-io.h b/gcc/gcov-io.h index 940eb7d..4dba01c 100644 --- a/gcc/gcov-io.h +++ b/gcc/gcov-io.h @@ -292,6 +292,9 @@ GCOV_COUNTERS /* Maximum number of tracked TOP N value profiles. */ #define GCOV_TOPN_MAXIMUM_TRACKED_VALUES 32 +/* Number of pre-allocated gcov_kvp structures. */ +#define GCOV_PREALLOCATED_KVP 16 + /* Convert a counter index to a tag. */ #define GCOV_TAG_FOR_COUNTER(COUNT) \ (GCOV_TAG_COUNTER_BASE + ((gcov_unsigned_t)(COUNT) << 17)) diff --git a/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c b/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c new file mode 100644 index 0000000..454e224 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c @@ -0,0 +1,49 @@ +/* { dg-options "-O2 -ldl" } */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <stdint.h> +#include <dlfcn.h> + +int global; +int global2; + +void report1 (size_t size) +{ + global++; +} + +void report2 (size_t size) +{ + global2++; +} + +typedef void (*tp) (size_t); +static tp fns[] = {report1, report2}; + +void* malloc(size_t size) +{ + static void* (*real_malloc)(size_t) = NULL; + if (!real_malloc) + real_malloc = dlsym(RTLD_NEXT, "malloc"); + + void *p = real_malloc (size); + fns[size % 2] (size); + // fprintf(stderr, "malloc(%d) = %p\n", size, p); + return p; +} + +void *calloc (size_t n, size_t size) +{ + void *ptr = malloc (n * size); + __builtin_memset (ptr, 0, n * size); + return ptr; +} + +void *ptr; + +int main() +{ + ptr = malloc (16); + return 0; +} |