https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90569
Bug ID: 90569
Summary: __STDCPP_DEFAULT_NEW_ALIGNMENT__ is wrong for
i386-pc-solaris2.11
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
CC: ro at gcc dot gnu.org
Target Milestone: ---
Target: i386-pc-solaris2.11
The default value for __STDCPP_DEFAULT_NEW_ALIGNMENT__ is alignof(max_align_t),
but GCC's max_align_t does not agree with the OS on i386-pc-solaris2.*, see PR
77691. This means that operator new(size_t) does not necessarily meet the
guarantee that __STDCPP_DEFAULT_NEW_ALIGNMENT__ is supposed to provide.
It looks like changing MALLOC_ABI_ALIGNMENT for the target should work, except
for this in gcc/cp/init.c:
/* Return the alignment we expect malloc to guarantee. This should just be
MALLOC_ABI_ALIGNMENT, but that macro defaults to only BITS_PER_WORD for some
reason, so don't let the threshold be smaller than max_align_t_align. */
unsigned
malloc_alignment ()
{
return MAX (max_align_t_align(), MALLOC_ABI_ALIGNMENT);
}
Shouldn't we trust the target if it has overridden the default? e.g.
/* Return the alignment we expect malloc to guarantee. This should just be
MALLOC_ABI_ALIGNMENT, but that macro defaults to only BITS_PER_WORD for some
reason. If MALLOC_ABI_ALIGNMENT has been changed from the default, use it.
Otherwise don't let the threshold be smaller than max_align_t_align. */
unsigned
malloc_alignment ()
{
if (MALLOC_ABI_ALIGNMENT != BITS_PER_WORD)
return MALLOC_ABI_ALIGNMENT;
return MAX (max_align_t_align(), MALLOC_ABI_ALIGNMENT);
}