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> 2011-12-19 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/51583 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 /* 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 OB. If THIS_REF_P is true, the leaves of EXPR are emitted as references
via lto_output_tree_ref. */ via lto_output_tree_ref. REF_P is used for streaming siblings of EXPR. */
void 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; unsigned ix;
bool existed_p; bool existed_p;
@ -385,7 +386,7 @@ lto_output_tree (struct output_block *ob, tree expr, bool ref_p)
return; return;
} }
if (ref_p && tree_is_indexable (expr)) if (this_ref_p && tree_is_indexable (expr))
{ {
lto_output_tree_ref (ob, expr); lto_output_tree_ref (ob, expr);
return; 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 void lto_register_decl_definition (tree, struct lto_file_decl_data *);
extern struct output_block *create_output_block (enum lto_section_type); extern struct output_block *create_output_block (enum lto_section_type);
extern void destroy_output_block (struct output_block *); 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 lto_output_toplevel_asms (void);
extern void produce_asm (struct output_block *ob, tree fn); extern void produce_asm (struct output_block *ob, tree fn);
void lto_output_decl_state_streams (struct output_block *, 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 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 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 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 tree itself. The second boolean parameter specifies this for
implement. */ the tree itself, the first for all siblings that are streamed.
void (*write_tree) (struct output_block *, tree, bool); 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 /* [REQ] Called by every tree streaming routine that needs to read
a tree node. It takes two arguments: an lto_input_block pointing 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) \ #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) \ #define stream_read_tree(IB, DATA_IN) \
streamer_hooks.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> 2011-12-19 Jakub Jelinek <jakub@redhat.com>
PR c++/51619 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-do run } */
/* { dg-lto-options { { -g -O -flto } } } */
int int
test (void) 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 to the global decls section as we do not want to have them
enter decl merging. This is, of course, only for the call enter decl merging. This is, of course, only for the call
for streaming BLOCK_VARS, but other callers are safe. */ for streaming BLOCK_VARS, but other callers are safe. */
stream_write_tree (ob, t, if (VAR_OR_FUNCTION_DECL_P (t)
ref_p && !(VAR_OR_FUNCTION_DECL_P (t) && DECL_EXTERNAL (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; TREE_CHAIN (t) = saved_chain;
t = TREE_CHAIN (t); t = TREE_CHAIN (t);