summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2019-11-03 15:05:36 +0800
committerJohn Hodge <tpg@mutabah.net>2019-11-03 15:05:36 +0800
commitd984c0c5daa960b99d591319e602d110d79540c1 (patch)
treee5def8264a2bc3ce538526f2092bcc371ef6b6f5
parentf72ed4069e579f7625183fbb9e8a7921ec3e15ec (diff)
downloadmrust-d984c0c5daa960b99d591319e602d110d79540c1.tar.gz
Trans Mangling - Emit symbols longer than 128 bytes as hashes (to allow building larger crates on MSVC)
-rw-r--r--src/trans/mangling_v2.cpp34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/trans/mangling_v2.cpp b/src/trans/mangling_v2.cpp
index f907a6e3..67308295 100644
--- a/src/trans/mangling_v2.cpp
+++ b/src/trans/mangling_v2.cpp
@@ -281,12 +281,36 @@ public:
{
return FMT_CB(os, os << "ZRG"; Mangler(os).fmt_generic_path(p));
}
-::FmtLambda Trans_MangleType(const ::HIR::TypeRef& p)
+::FmtLambda Trans_MangleTypeRef(const ::HIR::TypeRef& p)
{
return FMT_CB(os, os << "ZRT"; Mangler(os).fmt_type(p));
}
-::FmtLambda Trans_Mangle(const ::HIR::SimplePath& path) { return Trans_MangleSimplePath(path); }
-::FmtLambda Trans_Mangle(const ::HIR::GenericPath& path) { return Trans_MangleGenericPath(path); }
-::FmtLambda Trans_Mangle(const ::HIR::Path& path) { return Trans_ManglePath(path); }
-::FmtLambda Trans_Mangle(const ::HIR::TypeRef& ty) { return Trans_MangleType(ty); }
+namespace {
+ ::FmtLambda max_len(::FmtLambda v) {
+ std::stringstream ss;
+ ss << v;
+ auto s = ss.str();
+ static const size_t MAX_LEN = 128;
+ if( s.size() > 128 ) {
+ size_t hash = ::std::hash<std::string>()(s);
+ ss.str("");
+ ss << s.substr(0, MAX_LEN-9) << "$" << ::std::hex << hash;
+ DEBUG("Over-long symbol '" << s << "' -> '" << ss.str() << "'");
+ s = ss.str();
+ }
+ else {
+ }
+ return ::FmtLambda([=](::std::ostream& os){
+ os << s;
+ });
+ }
+}
+// TODO: If the mangled name exceeds a limit, stop emitting the real name and start hashing the rest.
+#define DO_MANGLE(ty) ::FmtLambda Trans_Mangle(const ::HIR::ty& v) { \
+ return max_len(Trans_Mangle##ty(v)); \
+}
+DO_MANGLE(SimplePath)
+DO_MANGLE(GenericPath)
+DO_MANGLE(Path)
+DO_MANGLE(TypeRef)