aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@codesourcery.com>2023-09-07 22:15:08 +0200
committerThomas Schwinge <thomas@codesourcery.com>2023-10-26 08:37:25 +0200
commit3dfe7e2d556580300b739f545c9d13213264e282 (patch)
treefa1d93edffae9e20f04f1a2387b9b2c74b476746
parent33d38b431cced81e575b1d17d36cb9e43d64b02b (diff)
downloadgcc-3dfe7e2d556580300b739f545c9d13213264e282.zip
gcc-3dfe7e2d556580300b739f545c9d13213264e282.tar.gz
gcc-3dfe7e2d556580300b739f545c9d13213264e282.tar.bz2
More '#ifdef ASM_OUTPUT_DEF' -> 'if (TARGET_SUPPORTS_ALIASES)' etc.
Per commit a8b522b483ebb8c972ecfde8779a7a6ec16aecd6 (Subversion r251048) "Introduce TARGET_SUPPORTS_ALIASES", there is the idea that a back end may or may not provide symbol aliasing support ('TARGET_SUPPORTS_ALIASES') independent of '#ifdef ASM_OUTPUT_DEF', and in particular, depending not just on static but instead on dynamic (run-time) configuration. There did remain a few instances where we currently still assume that from '#ifdef ASM_OUTPUT_DEF' follows 'TARGET_SUPPORTS_ALIASES'. Change these to 'if (TARGET_SUPPORTS_ALIASES)', similarly, or 'gcc_checking_assert (TARGET_SUPPORTS_ALIASES);'. gcc/ * ipa-icf.cc (sem_item::target_supports_symbol_aliases_p): 'gcc_checking_assert (TARGET_SUPPORTS_ALIASES);' before 'return true;'. * ipa-visibility.cc (function_and_variable_visibility): Change '#ifdef ASM_OUTPUT_DEF' to 'if (TARGET_SUPPORTS_ALIASES)'. * varasm.cc (output_constant_pool_contents) [#ifdef ASM_OUTPUT_DEF]: 'gcc_checking_assert (TARGET_SUPPORTS_ALIASES);'. (do_assemble_alias) [#ifdef ASM_OUTPUT_DEF]: 'if (!TARGET_SUPPORTS_ALIASES)', 'gcc_checking_assert (seen_error ());'. (assemble_alias): Change '#if !defined (ASM_OUTPUT_DEF)' to 'if (!TARGET_SUPPORTS_ALIASES)'. (default_asm_output_anchor): 'gcc_checking_assert (TARGET_SUPPORTS_ALIASES);'.
-rw-r--r--gcc/ipa-icf.cc1
-rw-r--r--gcc/ipa-visibility.cc54
-rw-r--r--gcc/varasm.cc13
3 files changed, 39 insertions, 29 deletions
diff --git a/gcc/ipa-icf.cc b/gcc/ipa-icf.cc
index 836d091..bbdfd44 100644
--- a/gcc/ipa-icf.cc
+++ b/gcc/ipa-icf.cc
@@ -218,6 +218,7 @@ sem_item::target_supports_symbol_aliases_p (void)
#if !defined (ASM_OUTPUT_DEF) || (!defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL))
return false;
#else
+ gcc_checking_assert (TARGET_SUPPORTS_ALIASES);
return true;
#endif
}
diff --git a/gcc/ipa-visibility.cc b/gcc/ipa-visibility.cc
index 8ec82bb..8ce5611 100644
--- a/gcc/ipa-visibility.cc
+++ b/gcc/ipa-visibility.cc
@@ -622,41 +622,43 @@ function_and_variable_visibility (bool whole_program)
/* All aliases should be processed at this point. */
gcc_checking_assert (!alias_pairs || !alias_pairs->length ());
-#ifdef ASM_OUTPUT_DEF
- FOR_EACH_DEFINED_FUNCTION (node)
+ if (TARGET_SUPPORTS_ALIASES)
{
- if (node->get_availability () != AVAIL_INTERPOSABLE
- || DECL_EXTERNAL (node->decl)
- || node->has_aliases_p ()
- || lookup_attribute ("noipa", DECL_ATTRIBUTES (node->decl)))
- continue;
-
- cgraph_node *alias = 0;
- cgraph_edge *next_edge;
- for (cgraph_edge *e = node->callees; e; e = next_edge)
+ FOR_EACH_DEFINED_FUNCTION (node)
{
- next_edge = e->next_callee;
- /* Recursive function calls usually can't be interposed. */
-
- if (!e->recursive_p ())
+ if (node->get_availability () != AVAIL_INTERPOSABLE
+ || DECL_EXTERNAL (node->decl)
+ || node->has_aliases_p ()
+ || lookup_attribute ("noipa", DECL_ATTRIBUTES (node->decl)))
continue;
- if (!alias)
+ cgraph_node *alias = 0;
+ cgraph_edge *next_edge;
+ for (cgraph_edge *e = node->callees; e; e = next_edge)
{
- alias = dyn_cast<cgraph_node *> (node->noninterposable_alias ());
- gcc_assert (alias && alias != node);
- }
+ next_edge = e->next_callee;
+ /* Recursive function calls usually can't be interposed. */
- e->redirect_callee (alias);
- if (gimple_has_body_p (e->caller->decl))
- {
- push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
- cgraph_edge::redirect_call_stmt_to_callee (e);
- pop_cfun ();
+ if (!e->recursive_p ())
+ continue;
+
+ if (!alias)
+ {
+ alias
+ = dyn_cast<cgraph_node *> (node->noninterposable_alias ());
+ gcc_assert (alias && alias != node);
+ }
+
+ e->redirect_callee (alias);
+ if (gimple_has_body_p (e->caller->decl))
+ {
+ push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
+ cgraph_edge::redirect_call_stmt_to_callee (e);
+ pop_cfun ();
+ }
}
}
}
-#endif
FOR_EACH_FUNCTION (node)
{
diff --git a/gcc/varasm.cc b/gcc/varasm.cc
index b0eff17..6ae35ed 100644
--- a/gcc/varasm.cc
+++ b/gcc/varasm.cc
@@ -4300,6 +4300,8 @@ output_constant_pool_contents (struct rtx_constant_pool *pool)
if (desc->mark < 0)
{
#ifdef ASM_OUTPUT_DEF
+ gcc_checking_assert (TARGET_SUPPORTS_ALIASES);
+
const char *name = XSTR (desc->sym, 0);
char label[256];
char buffer[256 + 32];
@@ -6280,6 +6282,10 @@ do_assemble_alias (tree decl, tree target)
IDENTIFIER_POINTER (id),
IDENTIFIER_POINTER (target));
# endif
+ /* If symbol aliases aren't actually supported... */
+ if (!TARGET_SUPPORTS_ALIASES)
+ /* ..., 'ASM_OUTPUT_DEF{,_FROM_DECLS}' better have raised an error. */
+ gcc_checking_assert (seen_error ());
#elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
{
const char *name;
@@ -6349,9 +6355,8 @@ assemble_alias (tree decl, tree target)
if (TREE_PUBLIC (decl))
error ("%qs symbol %q+D must have static linkage", "weakref", decl);
}
- else
+ else if (!TARGET_SUPPORTS_ALIASES)
{
-#if !defined (ASM_OUTPUT_DEF)
# if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL)
error_at (DECL_SOURCE_LOCATION (decl),
"alias definitions not supported in this configuration");
@@ -6372,7 +6377,7 @@ assemble_alias (tree decl, tree target)
return;
}
# endif
-#endif
+ gcc_unreachable ();
}
TREE_USED (decl) = 1;
@@ -7461,6 +7466,8 @@ default_strip_name_encoding (const char *str)
void
default_asm_output_anchor (rtx symbol)
{
+ gcc_checking_assert (TARGET_SUPPORTS_ALIASES);
+
char buffer[100];
sprintf (buffer, "*. + " HOST_WIDE_INT_PRINT_DEC,