[PATCH] Fix PR53433, LTO and constant folding confused about error_mark_node
Richard Guenther
rguenther@suse.de
Wed Jul 4 12:40:00 GMT 2012
In initializer constant folding we use error_mark_node as a magic
return value which indicates a not present but kown zero initializer.
LTO on the other hand uses error_mark_node to mark something as
having a non-empty initializer but not present in the current ltrans
unit. Those uses conflict - thus avoid leaking the latter into the
former.
Bootstrap and regtest ongoing on x86_64-unknown-linux-gnu (it
is confirmed that it fixes the LTO profiledbootstrap case).
I'll apply this to all affected branches once tested.
Thanks,
Richard.
2012-07-04 Richard Guenther <rguenther@suse.de>
PR middle-end/53433
* gimple-fold.c (get_base_constructor): Do not return an
error_mark_node DECL_INITIAL.
Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c (revision 189251)
+++ gcc/gimple-fold.c (working copy)
@@ -2713,6 +2713,10 @@ get_base_constructor (tree base, HOST_WI
if (!DECL_INITIAL (base)
&& (TREE_STATIC (base) || DECL_EXTERNAL (base)))
return error_mark_node;
+ /* Do not return an error_mark_node DECL_INITIAL. LTO uses this
+ as special marker (_not_ zero ...) for its own purposes. */
+ if (DECL_INITIAL (base) == error_mark_node)
+ return NULL_TREE;
return DECL_INITIAL (base);
case ARRAY_REF:
More information about the Gcc-patches
mailing list