aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-02-17 09:58:37 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2015-02-17 08:58:37 +0000
commit87be7f0cbbd5927135c54e2ca9c56b522851a2d6 (patch)
tree9264313f245864186f9fda4ff8b7a195578c0634 /gcc
parent4414e22eeeaaf9dbd41f182173aa0a23ee792d1a (diff)
downloadgcc-87be7f0cbbd5927135c54e2ca9c56b522851a2d6.zip
gcc-87be7f0cbbd5927135c54e2ca9c56b522851a2d6.tar.gz
gcc-87be7f0cbbd5927135c54e2ca9c56b522851a2d6.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/lto-cgraph.c15
-rw-r--r--gcc/symtab.c5
-rw-r--r--gcc/varasm.c3
4 files changed, 28 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bbeee3f..d7fc1f4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2015-02-16 Jan Hubicka <hubicka@ucw.cz>
+
+ * 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 <law@redhat.com>
PR tree-optimization/64823
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index c0fa47d..6add7fd 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 ee47a73..7a70b10 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 7485499..dc7cfd7 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);