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
This commit is contained in:
Richard Guenther 2012-10-04 11:23:18 +00:00 committed by Richard Biener
parent 9cb62ce3c7
commit 5c1eb617e4
4 changed files with 52 additions and 24 deletions

View File

@ -1,3 +1,14 @@
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>
* dumpfile.h, dumpfile.c: Remove TDI_ada.

View File

@ -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,
and any blocks used for the base and member initializers of a C++
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 tail_call_site_note_count = 0;
@ -19622,8 +19622,14 @@ dwarf2out_decl (tree decl)
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
for inline function definitions appearing within include files which
also contain `#pragma interface' pragmas. */
if (DECL_INITIAL (decl) == NULL_TREE)
also contain `#pragma interface' pragmas.
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;
/* If we're a nested function, initially use a parent of NULL; if we're

View File

@ -792,22 +792,22 @@ static void
lto_input_ts_block_tree_pointers (struct lto_input_block *ib,
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);
/* 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);
/* Do not stream BLOCK_ABSTRACT_ORIGIN. We cannot handle debug information
for early inlining so drop it on the floor instead of ICEing 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_FRAGMENT_ORIGIN (expr) = stream_read_tree (ib, data_in);
BLOCK_FRAGMENT_CHAIN (expr) = stream_read_tree (ib, data_in);
BLOCK_ABSTRACT_ORIGIN (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
of streaming it. For non-BLOCK BLOCK_SUPERCONTEXTs we still

View File

@ -685,21 +685,32 @@ write_ts_exp_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
static void
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);
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
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. */
stream_write_tree (ob, BLOCK_SUPERCONTEXT (expr), ref_p);
/* Do not stream BLOCK_ABSTRACT_ORIGIN. We cannot handle debug information
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);
/* BLOCK_FRAGMENT_ORIGIN and BLOCK_FRAGMENT_CHAIN is not live at LTO
streaming time. */
/* Do not output BLOCK_SUBBLOCKS. Instead on streaming-in this
list is re-constructed from BLOCK_SUPERCONTEXT. */
}