From f8584bcb678dba92241c20b3e81895a52fc865f3 Mon Sep 17 00:00:00 2001 From: marxin Date: Tue, 25 Jul 2017 13:11:28 +0200 Subject: [PATCH] Introduce TARGET_SUPPORTS_ALIASES gcc/c-family/ChangeLog: 2017-07-25 Martin Liska * c-opts.c (c_common_post_options): Replace ASM_OUTPUT_DEF with TARGET_SUPPORTS_ALIASES. gcc/ChangeLog: 2017-07-25 Martin Liska * asan.c (asan_protect_global): Replace ASM_OUTPUT_DEF with TARGET_SUPPORTS_ALIASES. * cgraph.c (cgraph_node::create_same_body_alias): Likewise. * ipa-visibility.c (can_replace_by_local_alias): Likewise. (optimize_weakref): Likewise. * symtab.c (symtab_node::noninterposable_alias): Likewise. * varpool.c (varpool_node::create_extra_name_alias): Likewise. * defaults.h: Introduce TARGET_SUPPORTS_ALIASES. gcc/cp/ChangeLog: 2017-07-25 Martin Liska * decl2.c (get_tls_init_fn): Replace ASM_OUTPUT_DEF with TARGET_SUPPORTS_ALIASES. (handle_tls_init): Likewise. (note_mangling_alias): Likewise. * optimize.c (can_alias_cdtor): Likewise. --- gcc/asan.c | 4 +--- gcc/c-family/c-opts.c | 22 ++++++++++++---------- gcc/cgraph.c | 7 ++++--- gcc/cp/decl2.c | 23 ++++++++++------------- gcc/cp/optimize.c | 6 +++--- gcc/defaults.h | 9 +++++++++ gcc/ipa-visibility.c | 15 +++++---------- gcc/symtab.c | 6 +++--- gcc/varpool.c | 6 +++--- 9 files changed, 50 insertions(+), 48 deletions(-) diff --git a/gcc/asan.c b/gcc/asan.c index 5f9275f6425..d8cb2b52c8b 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -1663,10 +1663,8 @@ asan_protect_global (tree decl) if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) return false; -#ifndef ASM_OUTPUT_DEF - if (asan_needs_local_alias (decl)) + if (!TARGET_SUPPORTS_ALIASES && asan_needs_local_alias (decl)) return false; -#endif return true; } diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index 1657e7a4390..0b13a188c1b 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -957,16 +957,18 @@ c_common_post_options (const char **pfilename) if (flag_extern_tls_init) { -#if !defined (ASM_OUTPUT_DEF) || !SUPPORTS_WEAK - /* Lazy TLS initialization for a variable in another TU requires - alias and weak reference support. */ - if (flag_extern_tls_init > 0) - sorry ("external TLS initialization functions not supported " - "on this target"); - flag_extern_tls_init = 0; -#else - flag_extern_tls_init = 1; -#endif + if (!TARGET_SUPPORTS_ALIASES || !SUPPORTS_WEAK) + { + /* Lazy TLS initialization for a variable in another TU requires + alias and weak reference support. */ + if (flag_extern_tls_init > 0) + sorry ("external TLS initialization functions not supported " + "on this target"); + + flag_extern_tls_init = 0; + } + else + flag_extern_tls_init = 1; } if (num_in_fnames > 1) diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 2f820f1bb67..356bcd311e1 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -582,10 +582,11 @@ cgraph_node * cgraph_node::create_same_body_alias (tree alias, tree decl) { cgraph_node *n; -#ifndef ASM_OUTPUT_DEF + /* If aliases aren't supported by the assembler, fail. */ - return NULL; -#endif + if (!TARGET_SUPPORTS_ALIASES) + return NULL; + /* Langhooks can create same body aliases of symbols not defined. Those are useless. Drop them on the floor. */ if (symtab->global_info_ready) diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 2a52f8ca3e2..5119d4e62cc 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -3156,11 +3156,9 @@ get_tls_init_fn (tree var) if (!flag_extern_tls_init && DECL_EXTERNAL (var)) return NULL_TREE; -#ifdef ASM_OUTPUT_DEF /* If the variable is internal, or if we can't generate aliases, call the local init function directly. */ - if (!TREE_PUBLIC (var)) -#endif + if (!TREE_PUBLIC (var) || !TARGET_SUPPORTS_ALIASES) return get_local_tls_init_fn (); tree sname = mangle_tls_init_fn (var); @@ -4241,9 +4239,8 @@ handle_tls_init (void) tree init = TREE_PURPOSE (vars); one_static_initialization_or_destruction (var, init, true); -#ifdef ASM_OUTPUT_DEF /* Output init aliases even with -fno-extern-tls-init. */ - if (TREE_PUBLIC (var)) + if (TARGET_SUPPORTS_ALIASES && TREE_PUBLIC (var)) { tree single_init_fn = get_tls_init_fn (var); if (single_init_fn == NULL_TREE) @@ -4253,7 +4250,6 @@ handle_tls_init (void) (single_init_fn, fn); gcc_assert (alias != NULL); } -#endif } finish_then_clause (if_stmt); @@ -4300,15 +4296,16 @@ generate_mangling_alias (tree decl, tree id2) void note_mangling_alias (tree decl ATTRIBUTE_UNUSED, tree id2 ATTRIBUTE_UNUSED) { -#ifdef ASM_OUTPUT_DEF - if (!defer_mangling_aliases) - generate_mangling_alias (decl, id2); - else + if (TARGET_SUPPORTS_ALIASES) { - vec_safe_push (mangling_aliases, decl); - vec_safe_push (mangling_aliases, id2); + if (!defer_mangling_aliases) + generate_mangling_alias (decl, id2); + else + { + vec_safe_push (mangling_aliases, decl); + vec_safe_push (mangling_aliases, id2); + } } -#endif } /* Emit all mangling aliases that were deferred up to this point. */ diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index a1c387092d4..09ffbda7ca8 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -184,10 +184,10 @@ cdtor_comdat_group (tree complete, tree base) static bool can_alias_cdtor (tree fn) { -#ifndef ASM_OUTPUT_DEF /* If aliases aren't supported by the assembler, fail. */ - return false; -#endif + if (!TARGET_SUPPORTS_ALIASES) + return false; + /* We can't use an alias if there are virtual bases. */ if (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fn))) return false; diff --git a/gcc/defaults.h b/gcc/defaults.h index 7ad92d920f8..072ef6b6d17 100644 --- a/gcc/defaults.h +++ b/gcc/defaults.h @@ -863,6 +863,15 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #endif #endif +/* Decide whether target supports aliases. */ +#ifndef TARGET_SUPPORTS_ALIASES +#ifdef ASM_OUTPUT_DEF +#define TARGET_SUPPORTS_ALIASES 1 +#else +#define TARGET_SUPPORTS_ALIASES 0 +#endif +#endif + /* Select a format to encode pointers in exception handling data. We prefer those that result in fewer dynamic relocations. Assume no special support here and encode direct references. */ diff --git a/gcc/ipa-visibility.c b/gcc/ipa-visibility.c index 21321703dbb..b78e66e622a 100644 --- a/gcc/ipa-visibility.c +++ b/gcc/ipa-visibility.c @@ -334,10 +334,10 @@ varpool_node::externally_visible_p (void) static bool can_replace_by_local_alias (symtab_node *node) { -#ifndef ASM_OUTPUT_DEF /* If aliases aren't supported, we can't do replacement. */ - return false; -#endif + if (!TARGET_SUPPORTS_ALIASES) + return false; + /* Weakrefs have a reason to be non-local. Be sure we do not replace them. */ while (node->transparent_alias && node->definition && !node->weakref) @@ -458,11 +458,6 @@ update_visibility_by_resolution_info (symtab_node * node) static void optimize_weakref (symtab_node *node) { -#ifdef ASM_OUTPUT_DEF - bool aliases_supported = true; -#else - bool aliases_supported = false; -#endif bool strip_weakref = false; bool static_alias = false; @@ -481,8 +476,8 @@ optimize_weakref (symtab_node *node) /* If we have definition of weakref's target and we know it binds locally, we can turn weakref to static alias. */ - if (target->definition && decl_binds_to_current_def_p (target->decl) - && aliases_supported) + if (TARGET_SUPPORTS_ALIASES + && target->definition && decl_binds_to_current_def_p (target->decl)) strip_weakref = static_alias = true; /* Otherwise we can turn weakref into transparent alias. This transformation may break asm statements which directly refers to symbol name and expect diff --git a/gcc/symtab.c b/gcc/symtab.c index 0145910023f..1affc1dce1d 100644 --- a/gcc/symtab.c +++ b/gcc/symtab.c @@ -1763,10 +1763,10 @@ symtab_node::noninterposable_alias (void) (void *)&new_node, true); if (new_node) return new_node; -#ifndef ASM_OUTPUT_DEF + /* If aliases aren't supported by the assembler, fail. */ - return NULL; -#endif + if (!TARGET_SUPPORTS_ALIASES) + return NULL; /* Otherwise create a new one. */ new_decl = copy_node (node->decl); diff --git a/gcc/varpool.c b/gcc/varpool.c index ab59c80406b..db3dcee1af8 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -786,10 +786,10 @@ varpool_node::create_extra_name_alias (tree alias, tree decl) { varpool_node *alias_node; -#ifndef ASM_OUTPUT_DEF /* If aliases aren't supported by the assembler, fail. */ - return NULL; -#endif + if (!TARGET_SUPPORTS_ALIASES) + return NULL; + alias_node = varpool_node::create_alias (alias, decl); alias_node->cpp_implicit_alias = true; -- 2.13.3