> On Thu, Oct 29, 2020 at 04:50:54PM +0100, Jan Hubicka wrote:
> >     * tree.c (build_string): Update.
> >     * tree-core.h (tree_fixed_cst): Avoid typeless storage.
> 
> Is it valid then to
> #define TREE_STRING_POINTER(NODE) \
>   ((const char *)(STRING_CST_CHECK (NODE)->string.str))
> and strcpy etc. it around though?
> Maybe yes, because stores through char can alias anything.

Yep, I think it should be valid for that reason.  The whole thing is not
terribly pretty (the wide-int change was better), but I do not know of
better solution and it affects our core datastructure.  Typeless storage
is really complicated concept.  Forutnately it seems that there are no
more hacks like this needed: both tree and gimple now gets non-zero
alias set.

Honza
> 
> > diff --git a/gcc/tree-core.h b/gcc/tree-core.h
> > index c9280a8d3b1..63dbb5b8eab 100644
> > --- a/gcc/tree-core.h
> > +++ b/gcc/tree-core.h
> > @@ -1401,7 +1401,8 @@ struct GTY(()) tree_fixed_cst {
> >  struct GTY(()) tree_string {
> >    struct tree_typed typed;
> >    int length;
> > -  char str[1];
> > +  /* Avoid char array that would make whole type to be typeless storage.  
> > */
> > +  struct {char c;} str[1];
> >  };
> >  
> >  struct GTY(()) tree_complex {
> > diff --git a/gcc/tree.c b/gcc/tree.c
> > index 81f867ddded..84115630184 100644
> > --- a/gcc/tree.c
> > +++ b/gcc/tree.c
> > @@ -2273,7 +2273,7 @@ build_string (unsigned len, const char *str /*= NULL 
> > */)
> >      memcpy (s->string.str, str, len);
> >    else
> >      memset (s->string.str, 0, len);
> > -  s->string.str[len] = '\0';
> > +  s->string.str[len].c = '\0';
> >  
> >    return s;
> >  }
> 
>       Jakub
> 

Reply via email to