diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-18 16:00:06 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-18 16:00:06 +0800 |
commit | ef4bae520a1d6c28685966c83c3836ab17caf49a (patch) | |
tree | 405a15926ad8366f6cbba15b188586a8896c69a2 | |
parent | fb66335b52fdc38ea9af5e3e1626618acf6d11b4 (diff) | |
download | mrust-ef4bae520a1d6c28685966c83c3836ab17caf49a.tar.gz |
Trans C - Extra intrinsics and destructor fix
-rw-r--r-- | src/trans/codegen_c.cpp | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index ba3c568c..8f57f785 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -190,7 +190,7 @@ namespace { // - Drop Glue if( item.m_markings.has_drop_impl ) { - m_of << "void " << Trans_Mangle( ::HIR::Path(struct_ty.clone(), m_resolve.m_lang_Drop, "drop") ) << "(struct s_" << Trans_Mangle(p) << "*rv);\n"; + m_of << "tUNIT " << Trans_Mangle( ::HIR::Path(struct_ty.clone(), m_resolve.m_lang_Drop, "drop") ) << "(struct s_" << Trans_Mangle(p) << "*rv);\n"; } m_of << "void " << Trans_Mangle(drop_glue_path) << "(struct s_" << Trans_Mangle(p) << "* rv) {\n"; @@ -947,6 +947,37 @@ namespace { //emit_lvalue(e.ret_val); m_of << " = alignof("; emit_ctype(params.m_types.at(0)); m_of << ")"; emit_lvalue(e.ret_val); m_of << " = __alignof__("; emit_ctype(params.m_types.at(0)); m_of << ")"; } + else if( name == "size_of_val" ) { + emit_lvalue(e.ret_val); m_of << " = "; + const auto& ty = params.m_types.at(0); + switch( metadata_type(ty) ) + { + case MetadataType::None: + m_of << "sizeof("; emit_ctype(ty); m_of << ")"; + break; + case MetadataType::Slice: + MIR_TODO(mir_res, "size_of_val - " << ty); + break; + case MetadataType::TraitObject: + MIR_TODO(mir_res, "size_of_val - " << ty); + break; + } + } + else if( name == "min_align_of_val" ) { + const auto& ty = params.m_types.at(0); + switch( metadata_type(ty) ) + { + case MetadataType::None: + m_of << "__alignof__("; emit_ctype(ty); m_of << ")"; + break; + case MetadataType::Slice: + MIR_TODO(mir_res, "min_align_of_val - " << ty); + break; + case MetadataType::TraitObject: + MIR_TODO(mir_res, "min_align_of_val - " << ty); + break; + } + } else if( name == "type_id" ) { emit_lvalue(e.ret_val); m_of << " = (uintptr_t)&__typeid_" << Trans_Mangle(params.m_types.at(0)); } @@ -969,6 +1000,9 @@ namespace { else if( name == "forget" ) { // Nothing needs to be done, this just stops the destructor from running. } + else if( name == "drop_in_place" ) { + emit_destructor_call( ::MIR::LValue::make_Deref({ box$(e.args.at(0).clone()) }), params.m_types.at(0), true ); + } else if( name == "uninit" ) { // Do nothing, leaves the destination undefined } @@ -1066,7 +1100,14 @@ namespace { else if( name == "atomic_cxchg" || name.compare(0, 7+6, "atomic_cxchg_") == 0 ) { auto ordering = H::get_atomic_ordering(mir_res, name, 7+6); emit_atomic_cxchg(e, ordering, ordering); - + } + else if( name == "atomic_xchg" || name.compare(0, 7+5, "atomic_xchg_") == 0 ) { + auto ordering = H::get_atomic_ordering(mir_res, name, 7+5); + emit_lvalue(e.ret_val); m_of << " = atomic_exchange_explicit("; emit_lvalue(e.args.at(0)); m_of << ", "; emit_lvalue(e.args.at(1)); m_of << ", " << ordering << ")"; + } + else if( name == "atomic_fence" || name.compare(0, 7+6, "atomic_fence_") == 0 ) { + auto ordering = H::get_atomic_ordering(mir_res, name, 7+6); + m_of << "atomic_thread_fence(" << ordering << ")"; } else { MIR_BUG(mir_res, "Unknown intrinsic '" << name << "'"); |