[Bug target/77330] __float128 segfaults on 32-bit x86 due to 8-byte malloc alignment
bernd.edlinger at hotmail dot de
gcc-bugzilla@gcc.gnu.org
Tue Aug 23 21:07:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77330
--- Comment #9 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
(In reply to joseph@codesourcery.com from comment #8)
> On Tue, 23 Aug 2016, bernd.edlinger at hotmail dot de wrote:
>
> > gcc assumes that malloc, calloc, realloc, strdup, strndup
> > and anything with the __attribute__((__malloc__))
> > returns a pointer that is aligned to MALLOC_ABI_ALIGNMENT bits.
>
> That it makes this more conservative assumption for some optimization
> purposes is separate from the assumption that if you dereference a pointer
> to a type, that pointer, however you got it, meets the alignment
> requirements for the type. __float128 is 16-byte-aligned, so GCC assumes
> any dereferenced pointer to it is also 16-byte-aligned, and it's the
Yes, but isn't that an ABI decision?
What if the ABI says __float128 has to be 8-byte-aligned on this machine,
because the memory returned from malloc is per definition usable for
anything that contains __float128?
Like this:
Index: gcc/tree.c
===================================================================
--- gcc/tree.c (revision 239659)
+++ gcc/tree.c (working copy)
@@ -10349,6 +10349,7 @@ build_common_tree_nodes (bool signed_char)
SET_TYPE_MODE (FLOATN_NX_TYPE_NODE (i), mode);
}
+ SET_TYPE_ALIGN (float128_type_node, MALLOC_ABI_ALIGNMENT);
float_ptr_type_node = build_pointer_type (float_type_node);
double_ptr_type_node = build_pointer_type (double_type_node);
long_double_ptr_type_node = build_pointer_type (long_double_type_node);
More information about the Gcc-bugs
mailing list