summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-18 16:00:06 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-18 16:00:06 +0800
commitef4bae520a1d6c28685966c83c3836ab17caf49a (patch)
tree405a15926ad8366f6cbba15b188586a8896c69a2 /src
parentfb66335b52fdc38ea9af5e3e1626618acf6d11b4 (diff)
downloadmrust-ef4bae520a1d6c28685966c83c3836ab17caf49a.tar.gz
Trans C - Extra intrinsics and destructor fix
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp45
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 << "'");