diff options
author | John Hodge <tpg@mutabah.net> | 2019-11-03 15:05:36 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2019-11-03 15:05:36 +0800 |
commit | d984c0c5daa960b99d591319e602d110d79540c1 (patch) | |
tree | e5def8264a2bc3ce538526f2092bcc371ef6b6f5 /src | |
parent | f72ed4069e579f7625183fbb9e8a7921ec3e15ec (diff) | |
download | mrust-d984c0c5daa960b99d591319e602d110d79540c1.tar.gz |
Trans Mangling - Emit symbols longer than 128 bytes as hashes (to allow building larger crates on MSVC)
Diffstat (limited to 'src')
-rw-r--r-- | src/trans/mangling_v2.cpp | 34 |
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) |