Commit 7e54c608 by Richard Guenther Committed by Richard Biener

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
parent 23a3541f
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
...@@ -370,11 +370,12 @@ lto_write_tree (struct output_block *ob, tree expr, bool ref_p) ...@@ -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) ...@@ -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;
......
...@@ -825,7 +825,7 @@ tree lto_input_tree (struct lto_input_block *, struct data_in *); ...@@ -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 *,
......
...@@ -41,9 +41,10 @@ struct streamer_hooks { ...@@ -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 { ...@@ -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)
......
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
......
// { dg-lto-do link }
// { dg-lto-options { { -flto } { -flto -g } } }
struct T
{
virtual void m () { }
};
int
main ()
{
bool fn (T);
return 0;
}
/* { dg-lto-do run } */ /* { dg-lto-do run } */
/* { dg-lto-options { { -g -O -flto } } } */
int int
test (void) test (void)
......
...@@ -410,9 +410,11 @@ streamer_write_chain (struct output_block *ob, tree t, bool ref_p) ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment