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

Reply via email to