]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: improve name mangling hash
authorPhilip Herron <herron.philip@googlemail.com>
Sat, 12 Aug 2023 17:18:51 +0000 (18:18 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:00:31 +0000 (19:00 +0100)
We can endup with duplicate symbol names for different intrinsics with our
current hash setup. This adds in the mappings and extra info to improve
hash uniqueness.

Addresses #1895

gcc/rust/ChangeLog:

* backend/rust-compile-intrinsic.cc (check_for_cached_intrinsic):
simplify this cached intrinsic check
* backend/rust-mangle.cc (legacy_mangle_item): use new interface
* typecheck/rust-tyty.h: new managle helper

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/backend/rust-compile-intrinsic.cc
gcc/rust/backend/rust-mangle.cc
gcc/rust/typecheck/rust-tyty.h

index b73c5433cd47c1e056223b8ddfe77b5297b9d6f8..b5cb84b22a9a286670529ba0f002a964ecab387e 100644 (file)
@@ -242,17 +242,12 @@ Intrinsics::compile (TyTy::FnType *fntype)
 static bool
 check_for_cached_intrinsic (Context *ctx, TyTy::FnType *fntype, tree *lookup)
 {
+  const Resolver::CanonicalPath &canonical_path = fntype->get_ident ().path;
+  std::string asm_name = ctx->mangle_item (fntype, canonical_path);
   if (ctx->lookup_function_decl (fntype->get_ty_ref (), lookup,
-                                fntype->get_id (), fntype))
+                                fntype->get_id (), fntype, asm_name))
     {
-      // Has this been added to the list? Then it must be finished
-      if (ctx->function_completed (*lookup))
-       {
-         tree dummy = NULL_TREE;
-         if (!ctx->lookup_function_decl (fntype->get_ty_ref (), &dummy))
-           ctx->insert_function_decl (fntype, *lookup);
-         return true;
-       }
+      return true;
     }
 
   return false;
index eed9c75d96e365cb1f78140f9f9b799daf638935..62530d65382f95f7a3e41d869b3bd58f65534cc4 100644 (file)
@@ -282,7 +282,7 @@ static std::string
 legacy_mangle_item (const TyTy::BaseType *ty,
                    const Resolver::CanonicalPath &path)
 {
-  const std::string hash = legacy_hash (ty->as_string ());
+  const std::string hash = legacy_hash (ty->mangle_string ());
   const std::string hash_sig = legacy_mangle_name (hash);
 
   return kMangledSymbolPrefix + legacy_mangle_canonical_path (path) + hash_sig
index 341a0e7063fbdfb56b203cbd9232e9b5b4858533..fa2c88ccb9a504f35380672b35438c6e68d9f6c6 100644 (file)
@@ -158,6 +158,12 @@ public:
   bool has_subsititions_defined () const;
   bool needs_generic_substitutions () const;
 
+  std::string mangle_string () const
+  {
+    return TypeKindFormat::to_string (get_kind ()) + ":" + as_string () + ":"
+          + mappings_str () + ":" + bounds_as_string ();
+  }
+
   /* Returns a pointer to a clone of this. The caller is responsible for
    * releasing the memory of the returned ty. */
   virtual BaseType *clone () const = 0;