aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend
diff options
context:
space:
mode:
authorCohenArthur <arthur.cohen@epita.fr>2021-08-24 21:57:54 +0200
committerCohenArthur <arthur.cohen@epita.fr>2021-09-05 20:52:55 +0200
commit04ea1955ee6a70390a171328c537ed121eb05078 (patch)
tree84da324a046eacdce472f647445256fc9f4a1cff /gcc/rust/backend
parent91507076503d57982218c726a712c48adc7a4e1d (diff)
downloadgcc-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.h2
-rw-r--r--gcc/rust/backend/rust-mangle.cc17
-rw-r--r--gcc/rust/backend/rust-mangle.h24
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