aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2024-01-12 12:29:22 +0000
committerRichard Sandiford <richard.sandiford@arm.com>2024-01-12 12:29:22 +0000
commit81d309168b2a058d4c8ad5430abb56cfe1f82188 (patch)
treed1dbad05bd6040edb56c486e88af042e87ea7243 /gcc
parentd76651d9170099de4d3bc3cbc3811d499018910b (diff)
downloadgcc-81d309168b2a058d4c8ad5430abb56cfe1f82188.zip
gcc-81d309168b2a058d4c8ad5430abb56cfe1f82188.tar.gz
gcc-81d309168b2a058d4c8ad5430abb56cfe1f82188.tar.bz2
aarch64: Use a global map to detect duplicated overloads [PR112989]
As explained in the covering note to the previous patch, the fact that aarch64-sve-* is now used for multiple header files means that function_builder::add_overloaded_function now needs to use a global map to detect duplicated overload functions, instead of the member variable that it used previously. gcc/ PR target/112989 * config/aarch64/aarch64-sve-builtins.h (function_builder::m_overload_names): Replace with... * config/aarch64/aarch64-sve-builtins.cc (overload_names): ...this new global. (add_overloaded_function): Update accordingly, using get_identifier to get a GGC-friendly record of the name.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/aarch64/aarch64-sve-builtins.cc22
-rw-r--r--gcc/config/aarch64/aarch64-sve-builtins.h4
2 files changed, 14 insertions, 12 deletions
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc
index 3ad2271..c2f1486 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
@@ -938,6 +938,10 @@ static GTY(()) vec<registered_function *, va_gc> *registered_functions;
overloaded functions. */
static hash_table<registered_function_hasher> *function_table;
+/* Maps all overloaded function names that we've registered so far to
+ their associated function_instances. The map keys are IDENTIFIER_NODEs. */
+static GTY(()) hash_map<tree, registered_function *> *overload_names;
+
/* True if we've already complained about attempts to use functions
when the required extension is disabled. */
static bool reported_missing_extension_p;
@@ -1585,21 +1589,23 @@ function_builder::
add_overloaded_function (const function_instance &instance,
aarch64_feature_flags required_extensions)
{
+ if (!overload_names)
+ overload_names = hash_map<tree, registered_function *>::create_ggc ();
+
char *name = get_name (instance, true);
- if (registered_function **map_value = m_overload_names.get (name))
- {
- gcc_assert ((*map_value)->instance == instance
- && ((*map_value)->required_extensions
- & ~required_extensions) == 0);
- obstack_free (&m_string_obstack, name);
- }
+ tree id = get_identifier (name);
+ if (registered_function **map_value = overload_names->get (id))
+ gcc_assert ((*map_value)->instance == instance
+ && ((*map_value)->required_extensions
+ & ~required_extensions) == 0);
else
{
registered_function &rfn
= add_function (instance, name, m_overload_type, NULL_TREE,
required_extensions, true, m_direct_overloads);
- m_overload_names.put (name, &rfn);
+ overload_names->put (id, &rfn);
}
+ obstack_free (&m_string_obstack, name);
}
/* If we are using manual overload resolution, add one function decl
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.h b/gcc/config/aarch64/aarch64-sve-builtins.h
index 2bb893a..e66729e 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.h
+++ b/gcc/config/aarch64/aarch64-sve-builtins.h
@@ -453,10 +453,6 @@ private:
/* Used for building up function names. */
obstack m_string_obstack;
-
- /* Maps all overloaded function names that we've registered so far
- to their associated function_instances. */
- hash_map<nofree_string_hash, registered_function *> m_overload_names;
};
/* A base class for handling calls to built-in functions. */