Commit 5c1eb617 by Richard Guenther Committed by Richard Biener

re PR lto/47788 (New LTO failures)

2012-10-04  Richard Guenther  <rguenther@suse.de>

	PR lto/47788
	* tree-streamer-out.c (write_ts_block_tree_pointers): For
	inlined functions outer scopes write the ultimate origin
	as BLOCK_ABSTRACT_ORIGIN and BLOCK_SOURCE_LOCATION.
	Do not stream the fragment chains.
	* tree-streamer-in.c (lto_input_ts_block_tree_pointers): Likewise.
	* dwarf2out.c (gen_subprogram_die): Handle NULL DECL_INITIAL.
	(dwarf2out_decl): Always output DECL_ABSTRACT function decls.

From-SVN: r192075
parent 9cb62ce3
2012-10-04 Richard Guenther <rguenther@suse.de>
PR lto/47788
* tree-streamer-out.c (write_ts_block_tree_pointers): For
inlined functions outer scopes write the ultimate origin
as BLOCK_ABSTRACT_ORIGIN and BLOCK_SOURCE_LOCATION.
Do not stream the fragment chains.
* tree-streamer-in.c (lto_input_ts_block_tree_pointers): Likewise.
* dwarf2out.c (gen_subprogram_die): Handle NULL DECL_INITIAL.
(dwarf2out_decl): Always output DECL_ABSTRACT function decls.
2012-10-04 Arnaud Charlet <charlet@adacore.com> 2012-10-04 Arnaud Charlet <charlet@adacore.com>
* dumpfile.h, dumpfile.c: Remove TDI_ada. * dumpfile.h, dumpfile.c: Remove TDI_ada.
......
...@@ -17329,7 +17329,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) ...@@ -17329,7 +17329,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
a BLOCK node representing the function's outermost pair of curly braces, a BLOCK node representing the function's outermost pair of curly braces,
and any blocks used for the base and member initializers of a C++ and any blocks used for the base and member initializers of a C++
constructor function. */ constructor function. */
if (! declaration && TREE_CODE (outer_scope) != ERROR_MARK) if (! declaration && outer_scope && TREE_CODE (outer_scope) != ERROR_MARK)
{ {
int call_site_note_count = 0; int call_site_note_count = 0;
int tail_call_site_note_count = 0; int tail_call_site_note_count = 0;
...@@ -19622,8 +19622,14 @@ dwarf2out_decl (tree decl) ...@@ -19622,8 +19622,14 @@ dwarf2out_decl (tree decl)
inline" functions as DECL_EXTERNAL, but we need to generate DWARF for inline" functions as DECL_EXTERNAL, but we need to generate DWARF for
them anyway. Note that the C++ front-end also plays some similar games them anyway. Note that the C++ front-end also plays some similar games
for inline function definitions appearing within include files which for inline function definitions appearing within include files which
also contain `#pragma interface' pragmas. */ also contain `#pragma interface' pragmas.
if (DECL_INITIAL (decl) == NULL_TREE)
If we are called from dwarf2out_abstract_function output a DIE
anyway. We can end up here this way with early inlining and LTO
where the inlined function is output in a different LTRANS unit
or not at all. */
if (DECL_INITIAL (decl) == NULL_TREE
&& ! DECL_ABSTRACT (decl))
return; return;
/* If we're a nested function, initially use a parent of NULL; if we're /* If we're a nested function, initially use a parent of NULL; if we're
......
...@@ -792,22 +792,22 @@ static void ...@@ -792,22 +792,22 @@ static void
lto_input_ts_block_tree_pointers (struct lto_input_block *ib, lto_input_ts_block_tree_pointers (struct lto_input_block *ib,
struct data_in *data_in, tree expr) struct data_in *data_in, tree expr)
{ {
/* Do not stream BLOCK_SOURCE_LOCATION. We cannot handle debug information
for early inlining so drop it on the floor instead of ICEing in
dwarf2out.c. */
BLOCK_VARS (expr) = streamer_read_chain (ib, data_in); BLOCK_VARS (expr) = streamer_read_chain (ib, data_in);
/* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
for early inlining so drop it on the floor instead of ICEing in
dwarf2out.c. */
BLOCK_SUPERCONTEXT (expr) = stream_read_tree (ib, data_in); BLOCK_SUPERCONTEXT (expr) = stream_read_tree (ib, data_in);
/* Do not stream BLOCK_ABSTRACT_ORIGIN. We cannot handle debug information /* Stream BLOCK_ABSTRACT_ORIGIN and BLOCK_SOURCE_LOCATION for
for early inlining so drop it on the floor instead of ICEing in 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. */ dwarf2out.c. */
BLOCK_FRAGMENT_ORIGIN (expr) = stream_read_tree (ib, data_in); BLOCK_ABSTRACT_ORIGIN (expr) = stream_read_tree (ib, data_in);
BLOCK_FRAGMENT_CHAIN (expr) = stream_read_tree (ib, data_in); BLOCK_SOURCE_LOCATION (expr) = lto_input_location (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
dwarf2out.c. */
/* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
streaming time. */
/* We re-compute BLOCK_SUBBLOCKS of our parent here instead /* We re-compute BLOCK_SUBBLOCKS of our parent here instead
of streaming it. For non-BLOCK BLOCK_SUPERCONTEXTs we still of streaming it. For non-BLOCK BLOCK_SUPERCONTEXTs we still
......
...@@ -685,21 +685,32 @@ write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p) ...@@ -685,21 +685,32 @@ write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
static void static void
write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p) write_ts_block_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
{ {
/* Do not stream BLOCK_SOURCE_LOCATION. We cannot handle debug information
for early inlining so drop it on the floor instead of ICEing in
dwarf2out.c. */
streamer_write_chain (ob, BLOCK_VARS (expr), ref_p); streamer_write_chain (ob, BLOCK_VARS (expr), ref_p);
stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
/* 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. */
if (inlined_function_outer_scope_p (expr))
{
tree ultimate_origin = block_ultimate_origin (expr);
stream_write_tree (ob, ultimate_origin, ref_p);
lto_output_location (ob, BLOCK_SOURCE_LOCATION (expr));
}
else
{
stream_write_tree (ob, NULL_TREE, ref_p);
lto_output_location (ob, UNKNOWN_LOCATION);
}
/* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information /* Do not stream BLOCK_NONLOCALIZED_VARS. We cannot handle debug information
for early inlining so drop it on the floor instead of ICEing in for early inlined BLOCKs so drop it on the floor instead of ICEing in
dwarf2out.c. */ dwarf2out.c. */
stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p); /* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
/* Do not stream BLOCK_ABSTRACT_ORIGIN. We cannot handle debug information streaming time. */
for early inlining so drop it on the floor instead of ICEing in
dwarf2out.c. */
stream_write_tree (ob, BLOCK_FRAGMENT_ORIGIN (expr), ref_p);
stream_write_tree (ob, BLOCK_FRAGMENT_CHAIN (expr), ref_p);
/* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this /* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
list is re-constructed from BLOCK_SUPERCONTEXT. */ list is re-constructed from BLOCK_SUPERCONTEXT. */
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment