]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Fix legacy mangling to use Unicode escape
authorRaiki Tamura <tamaron1203@gmail.com>
Sat, 12 Aug 2023 07:16:53 +0000 (16:16 +0900)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:00:30 +0000 (19:00 +0100)
gcc/rust/ChangeLog:

* backend/rust-mangle.cc (legacy_mangle_name): Use Unicode escape

Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>
gcc/rust/backend/rust-mangle.cc

index 8a1a73c326489439502fdb857f9a48abc8ad2ff5..eed9c75d96e365cb1f78140f9f9b799daf638935 100644 (file)
@@ -1,6 +1,8 @@
 #include "rust-mangle.h"
 #include "fnv-hash.h"
 #include "rust-base62.h"
+#include "rust-unicode.h"
+#include "optional.h"
 
 // FIXME: Rename those to legacy_*
 static const std::string kMangledSymbolPrefix = "_ZN";
@@ -46,11 +48,15 @@ legacy_mangle_name (const std::string &name)
   // <example::Identity as example::FnLike<&T,&T>>::call
   // _ZN74_$LT$example..Identity$u20$as$u20$example..FnLike$LT$$RF$T$C$$RF$T$GT$$GT$4call17ha9ee58935895acb3E
 
+  tl::optional<Utf8String> utf8_name = Utf8String::make_utf8_string (name);
+  if (!utf8_name.has_value ())
+    rust_unreachable ();
+  std::vector<Codepoint> chars = utf8_name.value ().get_chars ();
   std::string buffer;
-  for (size_t i = 0; i < name.size (); i++)
+  for (size_t i = 0; i < chars.size (); i++)
     {
       std::string m;
-      char c = name.at (i);
+      Codepoint c = chars.at (i);
 
       if (c == ' ')
        m = kMangledSpace;
@@ -76,14 +82,21 @@ legacy_mangle_name (const std::string &name)
        m = kMangledComma;
       else if (c == ':')
        {
-         rust_assert (i + 1 < name.size ());
-         rust_assert (name.at (i + 1) == ':');
+         rust_assert (i + 1 < chars.size ());
+         rust_assert (chars.at (i + 1) == ':');
          i++;
          m = "..";
        }
+      else if (c.value < 0x80)
+       // ASCII
+       m.push_back (c.value);
       else
-       m.push_back (c);
-
+       {
+         // Non-ASCII
+         std::stringstream escaped;
+         escaped << std::hex << "$u" << c.value << "$";
+         m += escaped.str ();
+       }
       buffer += m;
     }