Jakub discovered that -fdump-go-spec crashes when it tries to print an
enum value which does not fit in a signed HOST_WIDE_INT. This patch
fixes the problem. Bootstrapped and tested on x86_64-unknown-linux-gnu.
Committed to mainline.
Ian
2011-10-03 Jakub Jelinek <[email protected]>
Ian Lance Taylor <[email protected]>
* godump.c (go_output_typedef): Support printing enum values that
don't fit in a signed HOST_WIDE_INT.
Index: godump.c
===================================================================
--- godump.c (revision 179472)
+++ godump.c (working copy)
@@ -920,9 +920,20 @@ go_output_typedef (struct godump_contain
if (*slot == NULL)
{
*slot = CONST_CAST (char *, name);
- fprintf (go_dump_file,
- "const _%s = " HOST_WIDE_INT_PRINT_DEC "\n",
- name, tree_low_cst (TREE_VALUE (element), 0));
+ fprintf (go_dump_file, "const _%s = ", name);
+ if (host_integerp (TREE_VALUE (element), 0))
+ fprintf (go_dump_file, HOST_WIDE_INT_PRINT_DEC,
+ tree_low_cst (TREE_VALUE (element), 0));
+ else if (host_integerp (TREE_VALUE (element), 1))
+ fprintf (go_dump_file, HOST_WIDE_INT_PRINT_UNSIGNED,
+ ((unsigned HOST_WIDE_INT)
+ tree_low_cst (TREE_VALUE (element), 1)));
+ else
+ fprintf (go_dump_file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
+ ((unsigned HOST_WIDE_INT)
+ TREE_INT_CST_HIGH (TREE_VALUE (element))),
+ TREE_INT_CST_LOW (TREE_VALUE (element)));
+ fprintf (go_dump_file, "\n");
}
}
pointer_set_insert (container->decls_seen, TREE_TYPE (decl));