diff options
author | Raiki Tamura <tamaron1203@gmail.com> | 2023-08-12 16:16:53 +0900 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-08-12 17:15:17 +0000 |
commit | 56680955c4a6f7e5ff195942edbdea3768b47e66 (patch) | |
tree | efedfd919f909086c75779c2322de2af4b36689f /gcc | |
parent | 9ae3c203f76a28332af456e23fc6a7e701577783 (diff) | |
download | gcc-56680955c4a6f7e5ff195942edbdea3768b47e66.zip gcc-56680955c4a6f7e5ff195942edbdea3768b47e66.tar.gz gcc-56680955c4a6f7e5ff195942edbdea3768b47e66.tar.bz2 |
gccrs: Fix legacy mangling to use Unicode escape
gcc/rust/ChangeLog:
* backend/rust-mangle.cc (legacy_mangle_name): Use Unicode escape
Signed-off-by: Raiki Tamura <tamaron1203@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/backend/rust-mangle.cc | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/gcc/rust/backend/rust-mangle.cc b/gcc/rust/backend/rust-mangle.cc index 8a1a73c..eed9c75 100644 --- a/gcc/rust/backend/rust-mangle.cc +++ b/gcc/rust/backend/rust-mangle.cc @@ -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; } |