diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-04 10:50:50 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-04 10:50:50 +0800 |
commit | c4aebe5d57b98303c746e6842cb322d512d7fb82 (patch) | |
tree | fe3e22db41c4d4259a0e616943618cca9638f9d5 /src/trans/mangling.cpp | |
parent | c94826345a033d6632efdad4f2c0fd0c4fa6c01a (diff) | |
download | mrust-c4aebe5d57b98303c746e6842cb322d512d7fb82.tar.gz |
Trans - Roughed C translation
Diffstat (limited to 'src/trans/mangling.cpp')
-rw-r--r-- | src/trans/mangling.cpp | 111 |
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 ""; } |