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