> 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 >