> On Tue, 21 Aug 2018, Jan Hubicka wrote:
> 
> > Hi,
> > extra sanity checking I am going to send in followup patch noticed that we
> > stream pointer types that was never seen by free_lang_data.  This is because
> > they are referenced by TYPE_POINTER_TO list and are inserted into the gimple
> > statements later when we wrap everything in MEM_REF (by make_pointer_type).
> > 
> > Bootstrapped/regtested x86_64-linux, OK?
> 
> Hmm, but make_pointer_type might as well create new pointer types
> that didn't exist before - shouldn't those have the same problem
> (which actually is?)?  Note the pointed-to types are already in the IL,

I am now clearing TYPE_STUB_DECL to NULL and check that it is NULL later in
streaming.  There are indeed some other cases where this check triggers.

Pointer types are not problem because they are created w/o stubs.  Other issues
I see with this are backend produced structures - gcov, asan and ubsan all
create structures with non-NULL stubs.  They are DECL_ARTIFICIAL so I am not
quite sure why we set stubs there.

  tree type_decl = build_decl (input_location, TYPE_DECL,                       
                               get_identifier ("__asan_global"), ret);          
  DECL_IGNORED_P (type_decl) = 1;                                               
  DECL_ARTIFICIAL (type_decl) = 1;                                              
  TYPE_FIELDS (ret) = fields[0];                                                
  TYPE_NAME (ret) = type_decl;                                                  
  TYPE_STUB_DECL (ret) = type_decl;                                             

It seems to me that setting TYPE_NAME to identifier node would be easier.
gcov uses finish_builtin_struct which in turn does:

#if 0 /* not yet, should get fixed properly later */                            
  TYPE_NAME (type) = make_type_decl (get_identifier (name), type);
#else
  TYPE_NAME (type) = build_decl (BUILTINS_LOCATION,
                                 TYPE_DECL, get_identifier (name), type);
#endif
  TYPE_STUB_DECL (type) = TYPE_NAME (type);

It does not seem to set artificial.  I am not quite sure what to do about
those.

In any case we should free lang data frontend created pointer types that may
get back to IL stream.  C++ will give them TYPE_DECL based TYPE_NAMEs that
we want to translate to identifiers for example.

Honza

Reply via email to