summaryrefslogtreecommitdiff
path: root/src/trans/mangling.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-04 10:50:50 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-04 10:50:50 +0800
commitc4aebe5d57b98303c746e6842cb322d512d7fb82 (patch)
treefe3e22db41c4d4259a0e616943618cca9638f9d5 /src/trans/mangling.cpp
parentc94826345a033d6632efdad4f2c0fd0c4fa6c01a (diff)
downloadmrust-c4aebe5d57b98303c746e6842cb322d512d7fb82.tar.gz
Trans - Roughed C translation
Diffstat (limited to 'src/trans/mangling.cpp')
-rw-r--r--src/trans/mangling.cpp111
1 files changed, 100 insertions, 11 deletions
diff --git a/src/trans/mangling.cpp b/src/trans/mangling.cpp
index 4e47094c..fc85f532 100644
--- a/src/trans/mangling.cpp
+++ b/src/trans/mangling.cpp
@@ -9,21 +9,110 @@
#include <hir/type.hpp>
#include <hir/path.hpp>
-::std::string Trans_Mangle(const ::HIR::GenericPath& path)
+::FmtLambda Trans_Mangle(const ::HIR::GenericPath& path)
{
- ::std::stringstream ss;
- ss << "_ZN" << path.m_path.m_crate_name.size() << path.m_path.m_crate_name;
- for(const auto& comp : path.m_path.m_components)
- ss << comp.size() << comp;
-
- return ss.str();
+ return FMT_CB(ss,
+ ss << "_ZN" << path.m_path.m_crate_name.size() << path.m_path.m_crate_name;
+ for(const auto& comp : path.m_path.m_components)
+ ss << comp.size() << comp;
+ );
}
-::std::string Trans_Mangle(const ::HIR::Path& path)
+::FmtLambda Trans_Mangle(const ::HIR::Path& path)
{
- return "";
+ TU_MATCHA( (path.m_data), (pe),
+ (Generic,
+ return Trans_Mangle(pe);
+ ),
+ (UfcsUnknown,
+ BUG(Span(), "UfcsUnknown - " << path);
+ ),
+ (UfcsKnown,
+ return FMT_CB(ss, );
+ ),
+ (UfcsInherent,
+ return FMT_CB(ss, );
+ )
+ )
+ throw "";
}
-::std::string Trans_Mangle(const ::HIR::TypeRef& ty)
+::FmtLambda Trans_Mangle(const ::HIR::TypeRef& ty)
{
- return "";
+ TU_MATCHA( (ty.m_data), (te),
+ (Infer,
+ BUG(Span(), "Infer in trans");
+ ),
+ (Diverge,
+ return FMT_CB(ss, ss << "$D";);
+ ),
+ (Primitive,
+ return FMT_CB(ss, ss << te;);
+ ),
+ (Path,
+ return Trans_Mangle(te.path);
+ ),
+ (Generic,
+ BUG(Span(), "Generic in trans - " << ty);
+ ),
+ (TraitObject,
+ BUG(Span(), "Raw trait object - " << ty);
+ ),
+ (ErasedType,
+ BUG(Span(), "ErasedType in trans - " << ty);
+ ),
+ (Array,
+ return FMT_CB(ss, ss << "$A" << te.size_val << "_" << Trans_Mangle(*te.inner););
+ ),
+ (Slice,
+ return FMT_CB(ss, ss << "$A" << "_" << Trans_Mangle(*te.inner););
+ ),
+ (Tuple,
+ return FMT_CB(ss,
+ ss << "$T";
+ for(const auto& t : te)
+ ss << "_" << Trans_Mangle(t);
+ );
+ ),
+ (Borrow,
+ return FMT_CB(ss,
+ ss << "$R";
+ switch(te.type)
+ {
+ case ::HIR::BorrowType::Shared: ss << "s"; break;
+ case ::HIR::BorrowType::Unique: ss << "u"; break;
+ case ::HIR::BorrowType::Owned : ss << "o"; break;
+ }
+ ss << "_" << Trans_Mangle(*te.inner);
+ );
+ ),
+ (Pointer,
+ return FMT_CB(ss,
+ ss << "$P";
+ switch(te.type)
+ {
+ case ::HIR::BorrowType::Shared: ss << "s"; break;
+ case ::HIR::BorrowType::Unique: ss << "u"; break;
+ case ::HIR::BorrowType::Owned : ss << "o"; break;
+ }
+ ss << "_" << Trans_Mangle(*te.inner);
+ );
+ ),
+ (Function,
+ return FMT_CB(ss,
+ if(te.m_abi != "Rust")
+ ss << "extern_" << te.m_abi << "_";
+ if(te.is_unsafe)
+ ss << "unsafe_";
+ ss << "fn_" << te.m_arg_types.size();
+ for(const auto& ty : te.m_arg_types)
+ ss << "_" << Trans_Mangle(ty);
+ ss << "_" << Trans_Mangle(*te.m_rettype);
+ );
+ ),
+ (Closure,
+ BUG(Span(), "Closure during trans - " << ty);
+ )
+ )
+
+ throw "";
}