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:
parent
23a3541f27
commit
7e54c6084d
8 changed files with 51 additions and 12 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 *,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
13
gcc/testsuite/g++.dg/lto/pr51573-1_0.C
Normal file
13
gcc/testsuite/g++.dg/lto/pr51573-1_0.C
Normal 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;
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
/* { dg-lto-do run } */
|
||||
/* { dg-lto-options { { -g -O -flto } } } */
|
||||
|
||||
int
|
||||
test (void)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue