]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR lto/47788 (New LTO failures)
authorRichard Guenther <rguenther@suse.de>
Thu, 4 Oct 2012 11:23:18 +0000 (11:23 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 4 Oct 2012 11:23:18 +0000 (11:23 +0000)
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

gcc/ChangeLog
gcc/dwarf2out.c
gcc/tree-streamer-in.c
gcc/tree-streamer-out.c

index dd6a3b8e0ab0dbd3326d71dff051f5c2c2eb60b4..da28a560969c3ac3adcdde8a3bf4b0ac8bb5805e 100644 (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.
index 25f57c06b9c3b26e40bf064d473f6c2001cbc07b..95fc130c3dbf42bbdbdacc2224a0f4280f379220 100644 (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
index 73a81c9c3ccd352872121be3a52e21a7157823c3..fc6984583e84edc4781eeb1f89365a459f336f6b 100644 (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
index 63f7a02d5876ea762a7417a2c131a7d2ab68fbdb..4fccd7720d2ef19f23b2ab73fe2b17ea6efd083a 100644 (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.  */
 }