summaryrefslogtreecommitdiff
path: root/gcc/symtab.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-02-05 01:02:22 -0500
committerJason Merrill <jason@redhat.com>2020-02-05 21:22:40 -0500
commit3774c0b934c4fe13c2d527b757002bdea09f7039 (patch)
tree56ada75be841738a061433b8991f0a71374b071c /gcc/symtab.c
parentb8e165be65e967addb4913369d39a182c442eecc (diff)
cgraph: A COMDAT decl always has non-zero address.
We should be able to assume that a template instantiation or other COMDAT has non-zero address even if MAKE_DECL_ONE_ONLY for the target sets DECL_WEAK and we haven't yet decided to emit a definition in this translation unit. PR c++/92003 * symtab.c (symtab_node::nonzero_address): A DECL_COMDAT decl has non-zero address even if weak and not yet defined.
Diffstat (limited to 'gcc/symtab.c')
-rw-r--r--gcc/symtab.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/gcc/symtab.c b/gcc/symtab.c
index eae891ab211..a879c095a1a 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -2058,22 +2058,22 @@ symtab_node::nonzero_address ()
bind to NULL. This is on by default on embedded targets only.
Otherwise all non-WEAK symbols must be defined and thus non-NULL or
- linking fails. Important case of WEAK we want to do well are comdats.
- Those are handled by later check for definition.
+ linking fails. Important case of WEAK we want to do well are comdats,
+ which also must be defined somewhere.
When parsing, beware the cases when WEAK attribute is added later. */
- if (!DECL_WEAK (decl)
+ if ((!DECL_WEAK (decl) || DECL_COMDAT (decl))
&& flag_delete_null_pointer_checks)
{
refuse_visibility_changes = true;
return true;
}
- /* If target is defined and either comdat or not extern, we know it will be
+ /* If target is defined and not extern, we know it will be
output and thus it will bind to non-NULL.
Play safe for flag_delete_null_pointer_checks where weak definition may
be re-defined by NULL. */
- if (definition && (!DECL_EXTERNAL (decl) || DECL_COMDAT (decl))
+ if (definition && !DECL_EXTERNAL (decl)
&& (flag_delete_null_pointer_checks || !DECL_WEAK (decl)))
{
if (!DECL_WEAK (decl))