[PATCH] Fix --enable-gather-detailed-mem-stats build.

Iain Sandoe idsandoe@googlemail.com
Wed Dec 16 09:08:39 GMT 2020


Martin Liška <mliska@suse.cz> wrote:

> The build suffers from the static initialization order fiasco:
>
> ==30085== Invalid read of size 4
> ==30085==    at 0x1D451CD: hash_table_mod1 (hash-table.h:344)
> ==30085==    by 0x1D451CD:  
> hash_table<hash_map<mem_alloc_description<vec_usage>::mem_location_hash,  
> vec_usage*,  
> simple_hashmap_traits<default_hash_traits<mem_alloc_description<vec_usage>::mem_location_hash>,  
> vec_usage*> >::hash_entry, false,  
> xcallocator>::find_with_hash(mem_location* const&, unsigned int)  
> (hash-table.h:911)
> ==30085==    by 0x1D411F7: get (hash-map.h:185)
> ==30085==    by 0x1D411F7: register_descriptor (mem-stats.h:417)
> ==30085==    by 0x1D411F7: register_descriptor (mem-stats.h:451)
> ==30085==    by 0x1D411F7: vec_prefix::register_overhead(void*, unsigned  
> long, unsigned long, char const*, int, char const*) (vec.c:132)
> ==30085==    by 0xA2DB28: reserve<loc_spans::span> (vec.h:294)
> ==30085==    by 0xA2DB28: vec<loc_spans::span, va_heap,  
> vl_ptr>::reserve(unsigned int, bool, char const*, int, char const*)  
> [clone .isra.0] (vec.h:1778)
> ==30085==    by 0x9039C7: reserve_exact (vec.h:1798)
> ==30085==    by 0x9039C7: create (vec.h:1813)
> ==30085==    by 0x9039C7: loc_spans (module.cc:3281)
> ==30085==    by 0x9039C7: __static_initialization_and_destruction_0  
> (module.cc:3340)
> ==30085==    by 0x9039C7: _GLOBAL__sub_I_map_context_from  
> (gt-cp-module.h:360)
> ==30085==    by 0x1E00F6C: __libc_csu_init (elf-init.c:89)
> ==30085==    by 0x4FFF0DD: (below main) (in /lib64/libc-2.32.so)
> ==30085==  Address 0x28 is not stack'd, malloc'd or (recently) free'd
>
> So vec_mem_desc is not initialized before a static member in module.cc.
> That can be fixed by usage of GNU C++ extension init_priority.
>
> Ready to be installed?
> Thanks,
> Martin
>
> gcc/ChangeLog:
>
> 	* vec.c: Use init_priority for vec_mem_desc.
> ---
> gcc/vec.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/vec.c b/gcc/vec.c
> index a28899170ed..1671f26c045 100644
> --- a/gcc/vec.c
> +++ b/gcc/vec.c
> @@ -121,7 +121,8 @@ public:
> };
>  /* Vector memory description.  */
> -static mem_alloc_description <vec_usage> vec_mem_desc;
> +static mem_alloc_description <vec_usage> vec_mem_desc
> +  __attribute__ ((init_priority (101)));

This will break bootstrap on targets without init_priority (e.g. Darwin)

Iain



More information about the Gcc-patches mailing list