public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-1987] lto/106540 - fix LTO tree input wrt dwarf2out_register_external_die
@ 2022-08-08  9:13 Richard Biener
  0 siblings, 0 replies; only message in thread
From: Richard Biener @ 2022-08-08  9:13 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:2a1448f2763a72c83e2ec496f78243a975b0d44e

commit r13-1987-g2a1448f2763a72c83e2ec496f78243a975b0d44e
Author: Richard Biener <rguenther@suse.de>
Date:   Mon Aug 8 09:07:23 2022 +0200

    lto/106540 - fix LTO tree input wrt dwarf2out_register_external_die
    
    I've revisited the earlier two workarounds for dwarf2out_register_external_die
    getting duplicate entries.  It turns out that r11-525-g03d90a20a1afcb
    added dref_queue pruning to lto_input_tree but decl reading uses that
    to stream in DECL_INITIAL even when in the middle of SCC streaming.
    When that SCC then gets thrown away we can end up with debug nodes
    registered which isn't supposed to happen.  The following adjusts
    the DECL_INITIAL streaming to go the in-SCC way, using lto_input_tree_1,
    since no SCCs are expected at this point, just refs.
    
            PR lto/106540
            PR lto/106334
            * dwarf2out.cc (dwarf2out_register_external_die): Restore
            original assert.
            * lto-streamer-in.cc (lto_read_tree_1): Use lto_input_tree_1
            to input DECL_INITIAL, avoiding to commit drefs.

Diff:
---
 gcc/dwarf2out.cc       | 7 +------
 gcc/lto-streamer-in.cc | 7 +++++--
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index cfea9cf6451..e3920c898f5 100644
--- a/gcc/dwarf2out.cc
+++ b/gcc/dwarf2out.cc
@@ -6069,12 +6069,7 @@ dwarf2out_register_external_die (tree decl, const char *sym,
 
   if (!external_die_map)
     external_die_map = hash_map<tree, sym_off_pair>::create_ggc (1000);
-  /* When we do tree merging during WPA or with -flto-partition=none we
-     can end up re-using GC memory as there's currently no way to unregister
-     external DIEs.  Ideally we'd register them only after merging finished
-     but allowing override here is easiest.  See PR106334.  */
-  gcc_checking_assert (!(in_lto_p && !flag_wpa)
-		       || !external_die_map->get (decl));
+  gcc_checking_assert (!external_die_map->get (decl));
   sym_off_pair p = { IDENTIFIER_POINTER (get_identifier (sym)), off };
   external_die_map->put (decl, p);
 }
diff --git a/gcc/lto-streamer-in.cc b/gcc/lto-streamer-in.cc
index fe5a4e7fe1d..a7dad70363f 100644
--- a/gcc/lto-streamer-in.cc
+++ b/gcc/lto-streamer-in.cc
@@ -1699,11 +1699,14 @@ lto_read_tree_1 (class lto_input_block *ib, class data_in *data_in, tree expr)
   /* Read all the pointer fields in EXPR.  */
   streamer_read_tree_body (ib, data_in, expr);
 
-  /* Read any LTO-specific data not read by the tree streamer.  */
+  /* Read any LTO-specific data not read by the tree streamer.  Do not use
+     stream_read_tree here since that flushes the dref_queue in mids of
+     SCC reading.  */
   if (DECL_P (expr)
       && TREE_CODE (expr) != FUNCTION_DECL
       && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
-    DECL_INITIAL (expr) = stream_read_tree (ib, data_in);
+    DECL_INITIAL (expr)
+      = lto_input_tree_1 (ib, data_in, streamer_read_record_start (ib), 0);
 
   /* Stream references to early generated DIEs.  Keep in sync with the
      trees handled in dwarf2out_register_external_die.  */


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-08-08  9:13 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-08  9:13 [gcc r13-1987] lto/106540 - fix LTO tree input wrt dwarf2out_register_external_die Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).