> On Mon, 15 Dec 2014, Jan Hubicka wrote:
>
> > Hi, actually this patch break fortran, I get streaming error in: lto1:
> > internal compiler error: in streamer_get_pickled_tree apparently picking
> > error_mark_node for variable constructor results in reading
> > integer_type...
>
> ?
>
> Probably the default nodes are referenced by another builtin tree instead
> and you get inconsistent streaming between f951 and lto1. See the
> assert placed into record_common_node which you should extend to cover
> the optimization node trees.
It seems that whole common node preloading is a major can of worms ;(. Anyway
the problem here is that record_common_node replaces every NULL by
error_mark_node.
It thus matters what is the last NULL pointer recorded. It used to be
TI_CURRENT_OPTIMIZE_PRAGMA
but now it is TI_PID_TYPE in some cases, TI_MAIN_IDENTIFIER in others and
real error_mark_node in rest of cases.
I am testing the following.
Honza
Index: tree-streamer.c
===================================================================
--- tree-streamer.c (revision 218726)
+++ tree-streamer.c (working copy)
@@ -324,7 +324,18 @@ preload_common_nodes (struct streamer_tr
/* Skip boolean type and constants, they are frontend dependent. */
if (i != TI_BOOLEAN_TYPE
&& i != TI_BOOLEAN_FALSE
- && i != TI_BOOLEAN_TRUE)
+ && i != TI_BOOLEAN_TRUE
+ /* MAIN_IDENTIFIER is not always initialized by Fortran FE. */
+ && i != TI_MAIN_IDENTIFIER
+ /* PID_TYPE is initialized only by C family front-ends. */
+ && i != TI_PID_TYPE
+ /* Skip optimization and target option nodes; they depend on flags. */
+ && i != TI_OPTIMIZATION_DEFAULT
+ && i != TI_OPTIMIZATION_CURRENT
+ && i != TI_TARGET_OPTION_DEFAULT
+ && i != TI_TARGET_OPTION_CURRENT
+ && i != TI_CURRENT_TARGET_PRAGMA
+ && i != TI_CURRENT_OPTIMIZE_PRAGMA)
record_common_node (cache, global_trees[i]);
}