On Wed, Dec 16, 2020 at 10:20:09AM +0100, Martin Liška wrote:
> So vec_mem_desc is not initialized before a static member in module.cc.
> We can fix it by using constructor attribute.
>
> gcc/ChangeLog:
>
> * vec.c (init_vec_mem_desc): New function.
> (vec_prefix::register_overhead): Use vec_mem_desc as pointer
> now.
> (vec_prefix::release_overhead): Likewise.
> (dump_vec_loc_statistics): Likewise.
> ---
> gcc/vec.c | 28 +++++++++++++++++++---------
> 1 file changed, 19 insertions(+), 9 deletions(-)
>
> diff --git a/gcc/vec.c b/gcc/vec.c
> index a28899170ed..ac91400c2df 100644
> --- a/gcc/vec.c
> +++ b/gcc/vec.c
> @@ -121,7 +121,17 @@ public:
> };
>
> /* Vector memory description. */
> -static mem_alloc_description <vec_usage> vec_mem_desc;
> +static mem_alloc_description <vec_usage> *vec_mem_desc;
> +
> +/* Static constructor for vec_mem_desc that happens before ithe
> initialization
s/ithe/the/
> + of all static variables. */
> +
> +static void
> +__attribute__((constructor (101)))
I think this needs to be guarded based on which compiler is used to compile
GCC. Perhaps we could say that we don't support
--enable-gather-detailed-mem-stats when the compiler isn't built by GCC (or
other compiler that supports the constructor attribute) and #error on that.
> +init_vec_mem_desc (void)
> +{
> + vec_mem_desc = new mem_alloc_description<vec_usage> ();
> +}
>
> /* Account the overhead. */
>
> @@ -129,10 +139,10 @@ void
> vec_prefix::register_overhead (void *ptr, size_t elements,
> size_t element_size MEM_STAT_DECL)
> {
> - vec_mem_desc.register_descriptor (ptr, VEC_ORIGIN, false
> - FINAL_PASS_MEM_STAT);
> + vec_mem_desc->register_descriptor (ptr, VEC_ORIGIN, false
> + FINAL_PASS_MEM_STAT);
> vec_usage *usage
> - = vec_mem_desc.register_instance_overhead (elements * element_size, ptr);
> + = vec_mem_desc->register_instance_overhead (elements * element_size,
> ptr);
> usage->m_element_size = element_size;
> usage->m_items += elements;
> if (usage->m_items_peak < usage->m_items)
> @@ -145,11 +155,11 @@ void
> vec_prefix::release_overhead (void *ptr, size_t size, size_t elements,
> bool in_dtor MEM_STAT_DECL)
> {
> - if (!vec_mem_desc.contains_descriptor_for_instance (ptr))
> - vec_mem_desc.register_descriptor (ptr, VEC_ORIGIN,
> + if (!vec_mem_desc->contains_descriptor_for_instance (ptr))
> + vec_mem_desc->register_descriptor (ptr, VEC_ORIGIN,
> false FINAL_PASS_MEM_STAT);
> - vec_usage *usage = vec_mem_desc.release_instance_overhead (ptr, size,
> - in_dtor);
> + vec_usage *usage = vec_mem_desc->release_instance_overhead (ptr, size,
> + in_dtor);
> usage->m_items -= elements;
> }
>
> @@ -183,7 +193,7 @@ vec_prefix::calculate_allocation_1 (unsigned alloc,
> unsigned desired)
> void
> dump_vec_loc_statistics (void)
> {
> - vec_mem_desc.dump (VEC_ORIGIN);
> + vec_mem_desc->dump (VEC_ORIGIN);
> }
>
> #if CHECKING_P
Jakub