From: Jan Hubicka Date: Tue, 17 Feb 2015 08:58:37 +0000 (+0100) Subject: symtab.c (symtab_node::verify_base): Verify body_removed->!definiton X-Git-Tag: releases/gcc-5.1.0~926 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=87be7f0cbbd5927135c54e2ca9c56b522851a2d6;p=gcc.git symtab.c (symtab_node::verify_base): Verify body_removed->!definiton * symtab.c (symtab_node::verify_base): Verify body_removed->!definiton * lto-cgraph.c (lto_output_varpool_node): Do not keep definition of variables in boundary that have no inlitalizer encoded and are not aliases. * varasm.c (default_binds_local_p_2): External definitions do not count as definitions here. From-SVN: r220749 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bbeee3fdebcd..d7fc1f4b06ac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-02-16 Jan Hubicka + + * symtab.c (symtab_node::verify_base): Verify body_removed->!definiton + * lto-cgraph.c (lto_output_varpool_node): Do not keep definition of + variables in boundary that have no inlitalizer encoded and are + not aliases. + * varasm.c (default_binds_local_p_2): External definitions do not + count as definitions here. + 2015-02-16 Jeff Law PR tree-optimization/64823 diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index c0fa47d2c25a..6add7fdf3d8f 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -608,12 +608,18 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node, lto_symtab_encoder_t encoder) { bool boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node); + bool encode_initializer_p + = (node->definition + && lto_symtab_encoder_encode_initializer_p (encoder, node)); struct bitpack_d bp; int ref; const char *comdat; const char *section; tree group; + gcc_assert (!encode_initializer_p || node->definition); + gcc_assert (boundary_p || encode_initializer_p); + streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, LTO_symtab_variable); streamer_write_hwi_stream (ob->main_stream, node->order); @@ -624,11 +630,14 @@ lto_output_varpool_node (struct lto_simple_output_block *ob, varpool_node *node, bp_pack_value (&bp, node->force_output, 1); bp_pack_value (&bp, node->forced_by_abi, 1); bp_pack_value (&bp, node->unique_name, 1); - bp_pack_value (&bp, node->body_removed - || !lto_symtab_encoder_encode_initializer_p (encoder, node), 1); + bp_pack_value (&bp, + node->body_removed + || (!encode_initializer_p && !node->alias && node->definition), + 1); bp_pack_value (&bp, node->implicit_section, 1); bp_pack_value (&bp, node->writeonly, 1); - bp_pack_value (&bp, node->definition, 1); + bp_pack_value (&bp, node->definition && (encode_initializer_p || node->alias), + 1); bp_pack_value (&bp, node->alias, 1); bp_pack_value (&bp, node->weakref, 1); bp_pack_value (&bp, node->analyzed && !boundary_p, 1); diff --git a/gcc/symtab.c b/gcc/symtab.c index ee47a738508a..7a70b100da17 100644 --- a/gcc/symtab.c +++ b/gcc/symtab.c @@ -978,6 +978,11 @@ symtab_node::verify_base (void) error ("double linked list of assembler names corrupted"); error_found = true; } + if (body_removed && definition) + { + error ("node has body_removed but is definition"); + error_found = true; + } if (analyzed && !definition) { error ("node is analyzed byt it is not a definition"); diff --git a/gcc/varasm.c b/gcc/varasm.c index 748549937891..dc7cfd7acdee 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -6831,7 +6831,8 @@ default_binds_local_p_2 (const_tree exp, bool shlib, bool weak_dominate) bool defined_locally = false; if (symtab_node *node = symtab_node::get (exp)) { - if (node->definition || node->in_other_partition) + if ((node->definition && !DECL_EXTERNAL (node->decl)) + || node->in_other_partition) { defined_locally = true; resolved_locally = (weak_dominate && !shlib);