diff options
author | John Hodge <tpg@ucc.asn.au> | 2019-08-05 22:28:33 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2019-08-05 22:28:33 +0800 |
commit | 8eed5deb106023aa4b396b11668d80174a3de37e (patch) | |
tree | 0891f31281d0df14bfe52f44625dcfd621dcda1b | |
parent | d9f71c09eb6f35ee5692147479a318e701106379 (diff) | |
download | mrust-8eed5deb106023aa4b396b11668d80174a3de37e.tar.gz |
Codegen MMIR - Selective drop glue
-rw-r--r-- | src/trans/codegen_c.cpp | 1 | ||||
-rw-r--r-- | src/trans/codegen_mmir.cpp | 12 |
2 files changed, 9 insertions, 4 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index da9d5167..803577c4 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -4518,6 +4518,7 @@ namespace { m_of << ", "; emit_param(e.args.at(2)); m_of << " * sizeof("; emit_ctype(params.m_types.at(0)); m_of << ")"; m_of << ")"; } + // NOTE: This is generic, and fills count*sizeof(T) (unlike memset) else if( name == "write_bytes" ) { if( this->type_is_bad_zst(params.m_types.at(0)) ) { m_of << "/* zst */"; diff --git a/src/trans/codegen_mmir.cpp b/src/trans/codegen_mmir.cpp index c88915c6..2f6a2f2e 100644 --- a/src/trans/codegen_mmir.cpp +++ b/src/trans/codegen_mmir.cpp @@ -341,7 +341,7 @@ namespace else if( t.m_data.is_Slice() ) { return ::HIR::CoreType::Usize; } - else if( t.m_data.is_TraitObject() ) { + else if( t.m_data.is_TraitObject() ) { const auto& te = t.m_data.as_TraitObject(); //auto vtp = t.m_data.as_TraitObject().m_trait.m_path; @@ -1007,6 +1007,7 @@ namespace const size_t ptr_size = Target_GetCurSpec().m_arch.m_pointer_bits / 8; const auto& trait_path = p.m_data.as_UfcsKnown().trait; const auto& type = *p.m_data.as_UfcsKnown().type; + bool has_drop_glue = m_resolve.type_needs_drop_glue(sp, type); ::HIR::TypeRef vtable_ty; { @@ -1016,6 +1017,7 @@ namespace auto aty = ::HIR::TypeRef( ::HIR::Path( type.clone(), trait_path.clone(), ty.first ) ); m_resolve.expand_associated_types(sp, aty); vtable_params.m_types.push_back( mv$(aty) ); + //vtable_params.m_types.at(ty.second) = ::std::move(aty); } const auto& vtable_ref = m_crate.get_struct_by_path(sp, vtable_sp); vtable_ty = ::HIR::TypeRef( ::HIR::GenericPath(mv$(vtable_sp), mv$(vtable_params)), &vtable_ref ); @@ -1026,7 +1028,7 @@ namespace m_of << "static " << p << ": " << vtable_ty << " = \""; // - Data // Drop - emit_str_usize(PTR_BASE); + emit_str_usize(has_drop_glue ? PTR_BASE : 0); // Align emit_str_usize(align); // Size @@ -1041,8 +1043,10 @@ namespace // - Relocations auto monomorph_cb_trait = monomorphise_type_get_cb(sp, &type, &trait_path.m_params, nullptr); // Drop - // - TODO: Some types don't have drop glue - m_of << "@0+" << ptr_size << " = " << ::HIR::Path(type.clone(), "drop_glue#") << ", "; + if( has_drop_glue ) + { + m_of << "@0+" << ptr_size << " = " << ::HIR::Path(type.clone(), "drop_glue#") << ", "; + } // Methods for(unsigned int i = 0; i < trait.m_value_indexes.size(); i ++ ) { |