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
	* lto-streamer-in.cc (lto_read_tree_1): Use lto_input_tree_1
	to input DECL_INITIAL, avoiding to commit drefs.

(cherry picked from commit 2a1448f276)
This commit is contained in:
Richard Biener 2022-08-08 09:07:23 +02:00
parent 04e3c9a18b
commit 4769ac6c5d
1 changed files with 5 additions and 2 deletions

View File

@ -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. */