The following one-liner segfaults on arm-eabi when compiled with
-mfloat-abi=hard -g:
__simd64_float16_t usingit;
The problem is that the pretty printer (in simple_type_specificer()) is
dereferencing a NULL result from c_common_type_for_mode:
int prec = TYPE_PRECISION (t);
if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (t)))
t = c_common_type_for_mode (TYPE_MODE (t), TYPE_SATURATING (t));
else
t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
if (TYPE_NAME (t))
The type in question is:
<real_type 0x7fffefdeb150 HF ...>
which corresponds to HFmode and which AFAICT, does not have a type by
design.
I see that other uses of *type_for_node() throughout the compiler check
the result for NULL, so perhaps we should do the same here.
The attached patch fixes the problem.
OK for trunk?
commit 10c5a54cb1bf4684864b01cb965d83f3fe474797
Author: Aldy Hernandez <al...@redhat.com>
Date: Wed Oct 26 12:06:09 2016 -0700
PR debug/77773
* c-pretty-print.c (simple_type_specifier): Do not dereference `t'
if NULL.
diff --git a/gcc/c-family/c-pretty-print.c b/gcc/c-family/c-pretty-print.c
index 90428ca..6bb38a9 100644
--- a/gcc/c-family/c-pretty-print.c
+++ b/gcc/c-family/c-pretty-print.c
@@ -348,7 +348,7 @@ c_pretty_printer::simple_type_specifier (tree t)
t = c_common_type_for_mode (TYPE_MODE (t), TYPE_SATURATING (t));
else
t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
- if (TYPE_NAME (t))
+ if (t && TYPE_NAME (t))
{
simple_type_specifier (t);
if (TYPE_PRECISION (t) != prec)
@@ -362,6 +362,7 @@ c_pretty_printer::simple_type_specifier (tree t)
switch (code)
{
case INTEGER_TYPE:
+ gcc_assert (t != NULL);
translate_string (TYPE_UNSIGNED (t)
? "<unnamed-unsigned:"
: "<unnamed-signed:");