diff options
author | CohenArthur <arthur.cohen@epita.fr> | 2021-08-24 21:57:54 +0200 |
---|---|---|
committer | CohenArthur <arthur.cohen@epita.fr> | 2021-09-05 20:52:55 +0200 |
commit | 04ea1955ee6a70390a171328c537ed121eb05078 (patch) | |
tree | 84da324a046eacdce472f647445256fc9f4a1cff /gcc/rust/backend | |
parent | 91507076503d57982218c726a712c48adc7a4e1d (diff) | |
download | gcc-04ea1955ee6a70390a171328c537ed121eb05078.zip gcc-04ea1955ee6a70390a171328c537ed121eb05078.tar.gz gcc-04ea1955ee6a70390a171328c537ed121eb05078.tar.bz2 |
mangling: Add option to choose mangling version
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r-- | gcc/rust/backend/rust-compile-context.h | 2 | ||||
-rw-r--r-- | gcc/rust/backend/rust-mangle.cc | 17 | ||||
-rw-r--r-- | gcc/rust/backend/rust-mangle.h | 24 |
3 files changed, 28 insertions, 15 deletions
diff --git a/gcc/rust/backend/rust-compile-context.h b/gcc/rust/backend/rust-compile-context.h index 126d058..05c15e3 100644 --- a/gcc/rust/backend/rust-compile-context.h +++ b/gcc/rust/backend/rust-compile-context.h @@ -46,7 +46,7 @@ public: : backend (backend), resolver (Resolver::Resolver::get ()), tyctx (Resolver::TypeCheckContext::get ()), mappings (Analysis::Mappings::get ()), - const_ctx (ConstFold::Context::get ()), mangler (Mangler (Mangler::MangleVersion::LEGACY)) + const_ctx (ConstFold::Context::get ()), mangler (Mangler ()) { // insert the builtins auto builtins = resolver->get_builtin_types (); diff --git a/gcc/rust/backend/rust-mangle.cc b/gcc/rust/backend/rust-mangle.cc index f2e6e15..40822b4 100644 --- a/gcc/rust/backend/rust-mangle.cc +++ b/gcc/rust/backend/rust-mangle.cc @@ -11,6 +11,8 @@ static const std::string kMangledSubstEnd = "$GT$"; namespace Rust { namespace Compile { +Mangler::MangleVersion Mangler::version = MangleVersion::LEGACY; + static std::string legacy_mangle_name (const std::string &name) { @@ -78,8 +80,9 @@ legacy_mangle_self (const TyTy::BaseType *self) } static std::string -legacy_mangle_item (const TyTy::BaseType *ty, const Resolver::CanonicalPath &path, - const std::string &crate_name) +legacy_mangle_item (const TyTy::BaseType *ty, + const Resolver::CanonicalPath &path, + const std::string &crate_name) { const std::string hash = legacy_hash (ty->as_string ()); const std::string hash_sig = legacy_mangle_name (hash); @@ -90,10 +93,8 @@ legacy_mangle_item (const TyTy::BaseType *ty, const Resolver::CanonicalPath &pat // FIXME this is a wee bit broken static std::string -legacy_mangle_impl_item (const TyTy::BaseType *self, - const TyTy::BaseType *ty, - const std::string &name, - const std::string &crate_name) +legacy_mangle_impl_item (const TyTy::BaseType *self, const TyTy::BaseType *ty, + const std::string &name, const std::string &crate_name) { const std::string hash = legacy_hash (ty->as_string ()); const std::string hash_sig = legacy_mangle_name (hash); @@ -116,7 +117,8 @@ legacy_mangle_impl_item (const TyTy::BaseType *self, // {} std::string -Mangler::mangle_item (const TyTy::BaseType *ty, const Resolver::CanonicalPath &path, +Mangler::mangle_item (const TyTy::BaseType *ty, + const Resolver::CanonicalPath &path, const std::string &crate_name) const { switch (version) @@ -145,5 +147,6 @@ Mangler::mangle_impl_item (const TyTy::BaseType *self, const TyTy::BaseType *ty, gcc_unreachable (); } } + } // namespace Compile } // namespace Rust diff --git a/gcc/rust/backend/rust-mangle.h b/gcc/rust/backend/rust-mangle.h index 8ed5ab6..1087446 100644 --- a/gcc/rust/backend/rust-mangle.h +++ b/gcc/rust/backend/rust-mangle.h @@ -26,23 +26,33 @@ class Mangler public: enum MangleVersion { - LEGACY, + LEGACY = 0, V0, }; - Mangler (MangleVersion version) : version (version) {} - // this needs to support Legacy and V0 see github #429 or #305 - std::string mangle_item (const TyTy::BaseType *ty, const Resolver::CanonicalPath &path, + std::string mangle_item (const TyTy::BaseType *ty, + const Resolver::CanonicalPath &path, const std::string &crate_name) const; std::string mangle_impl_item (const TyTy::BaseType *self, const TyTy::BaseType *ty, const std::string &name, - const std::string &crate_name) const; + const std::string &crate_name) const; + + static bool choose_mangling (std::string arg) + { + if (arg == "legacy") + version = MangleVersion::LEGACY; + else if (arg == "v0") + version = MangleVersion::V0; + else + return false; + + return true; + } -private: - enum MangleVersion version; + static enum MangleVersion version; }; } // namespace Compile } // namespace Rust |