This simply streams it all.
LTO bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2018-06-21 Richard Biener <rguent...@suse.de> * lto-streamer-out.c (DFS::DFS_write_tree_body): Update outdated comment. Follow BLOCK_ABSTRACT_ORIGIN unconditionally. * tree-streamer-in.c (lto_input_ts_block_tree_pointers): Update comment. * tree-streamer-out.c (write_ts_block_tree_pointers): Stream BLOCK_ABSTRACT_ORIGIN unconditionally. Index: gcc/lto-streamer-out.c =================================================================== --- gcc/lto-streamer-out.c (revision 261845) +++ gcc/lto-streamer-out.c (working copy) @@ -801,10 +801,7 @@ DFS::DFS_write_tree_body (struct output_ DFS_follow_tree_edge (DECL_ATTRIBUTES (expr)); - /* Do not follow DECL_ABSTRACT_ORIGIN. We cannot handle debug information - for early inlining so drop it on the floor instead of ICEing in - dwarf2out.c. - We however use DECL_ABSTRACT_ORIGIN == error_mark_node to mark + /* We use DECL_ABSTRACT_ORIGIN == error_mark_node to mark declarations which should be eliminated by decl merging. Be sure none leaks to this point. */ gcc_assert (DECL_ABSTRACT_ORIGIN (expr) != error_mark_node); @@ -917,20 +914,8 @@ DFS::DFS_write_tree_body (struct output_ DFS_follow_tree_edge (t); DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr)); + DFS_follow_tree_edge (BLOCK_ABSTRACT_ORIGIN (expr)); - /* Follow BLOCK_ABSTRACT_ORIGIN for the limited cases we can - handle - those that represent inlined function scopes. - For the drop rest them on the floor instead of ICEing - in dwarf2out.c, but keep the notion of whether the block - is an inlined block by refering to itself for the sake of - tree_nonartificial_location. */ - if (inlined_function_outer_scope_p (expr)) - { - tree ultimate_origin = block_ultimate_origin (expr); - DFS_follow_tree_edge (ultimate_origin); - } - else if (BLOCK_ABSTRACT_ORIGIN (expr)) - DFS_follow_tree_edge (expr); /* Do not follow BLOCK_NONLOCALIZED_VARS. We cannot handle debug information for early inlined BLOCKs so drop it on the floor instead of ICEing in dwarf2out.c. */ Index: gcc/tree-streamer-in.c =================================================================== --- gcc/tree-streamer-in.c (revision 261845) +++ gcc/tree-streamer-in.c (working copy) @@ -927,11 +927,6 @@ lto_input_ts_block_tree_pointers (struct BLOCK_VARS (expr) = streamer_read_chain (ib, data_in); BLOCK_SUPERCONTEXT (expr) = stream_read_tree (ib, data_in); - - /* Stream BLOCK_ABSTRACT_ORIGIN and BLOCK_SOURCE_LOCATION for - the limited cases we can handle - those that represent inlined - function scopes. For the rest them on the floor instead of ICEing in - dwarf2out.c. */ BLOCK_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in); /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information for early inlined BLOCKs so drop it on the floor instead of ICEing in Index: gcc/tree-streamer-out.c =================================================================== --- gcc/tree-streamer-out.c (revision 261845) +++ gcc/tree-streamer-out.c (working copy) @@ -779,20 +779,8 @@ write_ts_block_tree_pointers (struct out streamer_write_chain (ob, BLOCK_VARS (expr), ref_p); stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p); + stream_write_tree (ob, BLOCK_ABSTRACT_ORIGIN (expr), ref_p); - /* Stream BLOCK_ABSTRACT_ORIGIN for the limited cases we can handle - those - that represent inlined function scopes. - For the rest them on the floor instead of ICEing in dwarf2out.c, but - keep the notion of whether the block is an inlined block by refering - to itself for the sake of tree_nonartificial_location. */ - if (inlined_function_outer_scope_p (expr)) - { - tree ultimate_origin = block_ultimate_origin (expr); - stream_write_tree (ob, ultimate_origin, ref_p); - } - else - stream_write_tree (ob, (BLOCK_ABSTRACT_ORIGIN (expr) - ? expr : NULL_TREE), ref_p); /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information for early inlined BLOCKs so drop it on the floor instead of ICEing in dwarf2out.c. */