On Mon, 26 Jun 2006, Richard Guenther wrote:
> On Mon, 26 Jun 2006, Eric Botcazou wrote:
>
> > > Reverting your patch makes it go away too. I'll try and look into it
> > > tomorrow.
> >
> > tree
> > build_string (int len, const char *str)
> > {
> > tree s;
> > size_t length;
> >
> > length = len + sizeof (struct tree_string);
> >
> > s = ggc_alloc_tree (length);
> >
> > Breakpoint 5, build_string (len=34,
> > str=0x1048e58 "No space for profiling buffer(s)\n")
> > at /home/eric/svn/gcc/gcc/tree.c:1124
> > 1124 length = len + sizeof (struct tree_string);
> > (gdb) next
> > 1131 s = ggc_alloc_tree (length);
> > (gdb) p length
> > $1 = 58
> > (gdb) next
> > 1133 memset (s, 0, sizeof (struct tree_common));
> > (gdb) p s
> > $2 = 0xff3803fc
> >
> > 's' should be 8-byte aligned because it's a "tree".
>
> The way it works is that ggc_alloc_stat is asked for 58 bytes, which
> if being a correct C object size, has alignof (object) == 2. Now, with
>
> struct tree_string GTY(())
> {
> struct tree_common common;
> int length;
> char str[1];
> };
>
> it is unfortunate that we compute the allocation size by doing magic
> arithmetic instead of asking for sizeof (struct
> tree_string_with_length_FOO) (maybe one can do this with some VLA
> type?!).
Note that at present
length = len + sizeof (struct tree_string);
always allocates too much, because sizeof (struct tree_string) is a
multiple of alignof (struct tree_string) and so has the trailing
char[] array padded to 8 bytes (in your case). So even
(len + sizeof (struct tree_string)) & ~__alignof__(struct tree_string)
might magically work in every case.
Richard.
--
Richard Guenther <[EMAIL PROTECTED]>
Novell / SUSE Labs