On Mon, 26 Jun 2006, Richard Guenther wrote:

> On Mon, 26 Jun 2006, Andrew Pinski wrote:
> 
> > 
> > On Jun 26, 2006, at 2:07 AM, Richard Guenther wrote:
> > 
> > >So even
> > >(len + sizeof (struct tree_string)) & ~__alignof__(struct tree_string)
> > >might magically work in every case.
> > 
> > Of course using __alignof__ is wrong in GCC sources since that would mean
> > you have to use GCC to bootstrap with which is not documented.
> > 
> > But this does not explain PPC-Darwin's problem as PPC is not a
> > STRICT_ALIGNMENT target.
> > So either we are allocating too little or someone is going past an array
> > bounds somewhere.
> 
> I'll currently investigate "fixing" build_string, which interestingly
> fails and may hint at a problem elsewhere.  Of course alignof is wrong, 
> but one can use
> 
>   /* Make sure to request aligned storage and do not waste bytes
>      provided by padding of struct tree_string.  */
>   length = ((len + sizeof (struct tree_string))
>             & ~(sizeof (struct tree_string)
>                 - offsetof (struct tree_string, str) - 1));
> 
> instead (not pretty, but works).

Though it will not fix the alignment problem, only not waste the
bytes from the padding (which is why using __alignof__ didn't work,
it was wrong).  A fix that also fixes the alignment problem would
look like

  /* Make sure to request aligned storage and do not waste bytes
     provided by padding of struct tree_string.  */
  length = ((len + sizeof (struct tree_string))
            & ~(sizeof (struct tree_string)
                - offsetof (struct tree_string, str) - 1));
  length = ((length + __alignof__ (struct tree_string) - 1)
            & ~(__alignof__ (struct tree_string) - 1));

that is, align length - I don't know how to avoid using __alignof__
here, though, other than using a fake struct like

 struct foo_align_for_tree_string {
   char c;
   struct tree_string s;
 }

and offsetof (struct foo_align_for_tree_string, s).  Which would make it
as ugly as

  struct dummy_to_get_alignof_tree_string {
    char c;
    struct tree_string s;
  };
 
  /* Make sure to request aligned storage and do not waste bytes
     provided by padding of struct tree_string.  */
  length = ((len + sizeof (struct tree_string))
            & ~(sizeof (struct tree_string)
                - offsetof (struct tree_string, str) - 1));
  length = ((length + offsetof (struct dummy_to_get_alignof_tree_string, 
s) - 1)
            & ~(offsetof (struct dummy_to_get_alignof_tree_string, s) - 
1));

:/

I'll go ahead and revert the ggc-page.c patch now.

Richard.

--
Richard Guenther <[EMAIL PROTECTED]>
Novell / SUSE Labs

Reply via email to