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