re PR lto/51573 (ICE (segfault) in lto_varpool_encoder_encode_initializer_p)

2011-12-19  Richard Guenther  <rguenther@suse.de>

	PR lto/51573
	* streamer-hooks.h (struct streamer_hooks): Add second
	ref_p parameter to write_tree.
	(stream_write_tree): Adjust.
	(stream_write_tree_shallow_non_ref): New define.
	* lto-streamer.h (lto_output_tree): Adjust.
	* lto-streamer-out.c (lto_output_tree): Likewise.
	* tree-streamer-out.c (streamer_write_chain): Only
	force the immediate tree to be streamed as non-reference.

	* gcc.dg/lto/20111207-2_0.c: Adjust.
	* g++.dg/lto/pr51573-1_0.C: New testcase.

From-SVN: r182487
This commit is contained in:
Richard Guenther 2011-12-19 15:57:02 +00:00 committed by Richard Biener
parent 23a3541f27
commit 7e54c6084d
8 changed files with 51 additions and 12 deletions

View File

@ -1,3 +1,15 @@
2011-12-19 Richard Guenther <rguenther@suse.de>
PR lto/51573
* streamer-hooks.h (struct streamer_hooks): Add second
ref_p parameter to write_tree.
(stream_write_tree): Adjust.
(stream_write_tree_shallow_non_ref): New define.
* lto-streamer.h (lto_output_tree): Adjust.
* lto-streamer-out.c (lto_output_tree): Likewise.
* tree-streamer-out.c (streamer_write_chain): Only
force the immediate tree to be streamed as non-reference.
2011-12-19 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/51583

View File

@ -370,11 +370,12 @@ lto_write_tree (struct output_block *ob, tree expr, bool ref_p)
/* Emit the physical representation of tree node EXPR to output block
OB. If REF_P is true, the leaves of EXPR are emitted as references
via lto_output_tree_ref. */
OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
void
lto_output_tree (struct output_block *ob, tree expr, bool ref_p)
lto_output_tree (struct output_block *ob, tree expr,
bool ref_p, bool this_ref_p)
{
unsigned ix;
bool existed_p;
@ -385,7 +386,7 @@ lto_output_tree (struct output_block *ob, tree expr, bool ref_p)
return;
}
if (ref_p && tree_is_indexable (expr))
if (this_ref_p && tree_is_indexable (expr))
{
lto_output_tree_ref (ob, expr);
return;

View File

@ -825,7 +825,7 @@ tree lto_input_tree (struct lto_input_block *, struct data_in *);
extern void lto_register_decl_definition (tree, struct lto_file_decl_data *);
extern struct output_block *create_output_block (enum lto_section_type);
extern void destroy_output_block (struct output_block *);
extern void lto_output_tree (struct output_block *, tree, bool);
extern void lto_output_tree (struct output_block *, tree, bool, bool);
extern void lto_output_toplevel_asms (void);
extern void produce_asm (struct output_block *ob, tree fn);
void lto_output_decl_state_streams (struct output_block *,

View File

@ -41,9 +41,10 @@ struct streamer_hooks {
a tree node. The arguments are: output_block where to write the
node, the tree node to write and a boolean flag that should be true
if the caller wants to write a reference to the tree, instead of the
tree itself. The referencing mechanism is up to each streamer to
implement. */
void (*write_tree) (struct output_block *, tree, bool);
tree itself. The second boolean parameter specifies this for
the tree itself, the first for all siblings that are streamed.
The referencing mechanism is up to each streamer to implement. */
void (*write_tree) (struct output_block *, tree, bool, bool);
/* [REQ] Called by every tree streaming routine that needs to read
a tree node. It takes two arguments: an lto_input_block pointing
@ -64,7 +65,10 @@ struct streamer_hooks {
};
#define stream_write_tree(OB, EXPR, REF_P) \
streamer_hooks.write_tree(OB, EXPR, REF_P)
streamer_hooks.write_tree(OB, EXPR, REF_P, REF_P)
#define stream_write_tree_shallow_non_ref(OB, EXPR, REF_P) \
streamer_hooks.write_tree(OB, EXPR, REF_P, false)
#define stream_read_tree(IB, DATA_IN) \
streamer_hooks.read_tree(IB, DATA_IN)

View File

@ -1,3 +1,9 @@
2011-12-19 Richard Guenther <rguenther@suse.de>
PR lto/51573
* gcc.dg/lto/20111207-2_0.c: Adjust.
* g++.dg/lto/pr51573-1_0.C: New testcase.
2011-12-19 Jakub Jelinek <jakub@redhat.com>
PR c++/51619

View File

@ -0,0 +1,13 @@
// { dg-lto-do link }
// { dg-lto-options { { -flto } { -flto -g } } }
struct T
{
virtual void m () { }
};
int
main ()
{
bool fn (T);
return 0;
}

View File

@ -1,4 +1,5 @@
/* { dg-lto-do run } */
/* { dg-lto-options { { -g -O -flto } } } */
int
test (void)

View File

@ -410,9 +410,11 @@ streamer_write_chain (struct output_block *ob, tree t, bool ref_p)
to the global decls section as we do not want to have them
enter decl merging. This is, of course, only for the call
for streaming BLOCK_VARS, but other callers are safe. */
stream_write_tree (ob, t,
ref_p && !(VAR_OR_FUNCTION_DECL_P (t)
&& DECL_EXTERNAL (t)));
if (VAR_OR_FUNCTION_DECL_P (t)
&& DECL_EXTERNAL (t))
stream_write_tree_shallow_non_ref (ob, t, ref_p);
else
stream_write_tree (ob, t, ref_p);
TREE_CHAIN (t) = saved_chain;
t = TREE_CHAIN (t);