summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2012-10-04 11:23:18 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2012-10-04 11:23:18 +0000
commitae52f82e512d7e2439171c2a575ed170c9438e22 (patch)
tree8bbabc4c74321f88facd411646c5cf2e47605c23
parent74275ad386ba7c3a4fb25955179606da56c87caf (diff)
downloadgcc-ae52f82e512d7e2439171c2a575ed170c9438e22.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192075 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/dwarf2out.c12
-rw-r--r--gcc/tree-streamer-in.c22
-rw-r--r--gcc/tree-streamer-out.c31
4 files changed, 52 insertions, 24 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dd6a3b8e0ab..da28a560969 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 25f57c06b9c..95fc130c3db 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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
diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c
index 73a81c9c3cc..fc6984583e8 100644
--- a/gcc/tree-streamer-in.c
+++ b/gcc/tree-streamer-in.c
@@ -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
diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c
index 63f7a02d587..4fccd7720d2 100644
--- a/gcc/tree-streamer-out.c
+++ b/gcc/tree-streamer-out.c
@@ -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. */
}