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:
parent
9cb62ce3c7
commit
5c1eb617e4
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue