https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99385

--- Comment #2 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot 
Uni-Bielefeld.DE> ---
> --- Comment #1 from Martin Liška <marxin at gcc dot gnu.org> ---
> Thanks for the report and the analysis.
> The code should not segfault as we do:
>
>       if (ptr != MAP_FAILED)
>         {
>           __gcov_kvp_dynamic_pool = ptr;
>           __gcov_kvp_dynamic_pool_size = MMAP_CHUNK_SIZE / kvp_sizeof;
>           __gcov_kvp_dynamic_pool_index = 0;
>         }
> ...
>   if (new_node == NULL)
>     new_node = (struct gcov_kvp *)xcalloc (1, kvp_sizeof);
>
> can you please investigate why it crashes?

When I compile both libgcc and the indir-call-prof-malloc.c testcase
with -g3 -O0, it turns out the SEGV is caused by a stack overflow.  The
default stack size is 8 MB, and with bt 20 I get

#0  0x0805279a in calloc (n=1, size=20) at
/vol/gcc/src/hg/master/local/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c:37
#1  0x080535ac in allocate_gcov_kvp () at
/vol/gcc/src/hg/master/local/libgcc/libgcov.h:455
#2  0x08053711 in gcov_topn_add_value (counters=0x8065df8 <__gcov4.malloc+24>,
value=629554396, count=1, use_atomic=0, increment_total=1) at
/vol/gcc/src/hg/master/local/libgcc/libgcov.h:510
#3  0x0805383d in __gcov_topn_values_profiler_body (counters=0x8065df8
<__gcov4.malloc+24>, value=629554396, use_atomic=0) at
/vol/gcc/src/hg/master/local/libgcc/libgcov-profiler.c:103
#4  0x08053892 in __gcov_indirect_call_profiler_body (value=629554396,
cur_func=0x80524ad <report1>, use_atomic=0) at
/vol/gcc/src/hg/master/local/libgcc/libgcov-profiler.c:163
#5  0x080538d9 in __gcov_indirect_call_profiler_v4 (value=629554396,
cur_func=0x80524ad <report1>) at
/vol/gcc/src/hg/master/local/libgcc/libgcov-profiler.c:172
#6  0x080524da in report1 (size=20) at
/vol/gcc/src/hg/master/local/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c:12
#7  0x08052748 in malloc (size=20) at
/vol/gcc/src/hg/master/local/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c:31
#8  0x08052806 in calloc (n=1, size=20) at
/vol/gcc/src/hg/master/local/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c:38
#9  0x080535ac in allocate_gcov_kvp () at
/vol/gcc/src/hg/master/local/libgcc/libgcov.h:455
#10 0x08053711 in gcov_topn_add_value (counters=0x8065df8 <__gcov4.malloc+24>,
value=629554396, count=1, use_atomic=0, increment_total=1) at
/vol/gcc/src/hg/master/local/libgcc/libgcov.h:510
#11 0x0805383d in __gcov_topn_values_profiler_body (counters=0x8065df8
<__gcov4.malloc+24>, value=629554396, use_atomic=0) at
/vol/gcc/src/hg/master/local/libgcc/libgcov-profiler.c:103
#12 0x08053892 in __gcov_indirect_call_profiler_body (value=629554396,
cur_func=0x80524ad <report1>, use_atomic=0) at
/vol/gcc/src/hg/master/local/libgcc/libgcov-profiler.c:163
#13 0x080538d9 in __gcov_indirect_call_profiler_v4 (value=629554396,
cur_func=0x80524ad <report1>) at
/vol/gcc/src/hg/master/local/libgcc/libgcov-profiler.c:172
#14 0x080524da in report1 (size=20) at
/vol/gcc/src/hg/master/local/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c:12
#15 0x08052748 in malloc (size=20) at
/vol/gcc/src/hg/master/local/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c:31
#16 0x08052806 in calloc (n=1, size=20) at
/vol/gcc/src/hg/master/local/gcc/testsuite/gcc.dg/tree-prof/indir-call-prof-malloc.c:38
#17 0x080535ac in allocate_gcov_kvp () at
/vol/gcc/src/hg/master/local/libgcc/libgcov.h:455
#18 0x08053711 in gcov_topn_add_value (counters=0x8065df8 <__gcov4.malloc+24>,
value=629554396, count=1, use_atomic=0, increment_total=1) at
/vol/gcc/src/hg/master/local/libgcc/libgcov.h:510
#19 0x0805383d in __gcov_topn_values_profiler_body (counters=0x8065df8
<__gcov4.malloc+24>, value=629554396, use_atomic=0) at
/vol/gcc/src/hg/master/local/libgcc/libgcov-profiler.c:103
(More stack frames follow...)

Running bt without a count gets into the 20000s when I stopped it.

Reply via email to