summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-08-05 22:28:33 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-08-05 22:28:33 +0800
commit8eed5deb106023aa4b396b11668d80174a3de37e (patch)
tree0891f31281d0df14bfe52f44625dcfd621dcda1b
parentd9f71c09eb6f35ee5692147479a318e701106379 (diff)
downloadmrust-8eed5deb106023aa4b396b11668d80174a3de37e.tar.gz
Codegen MMIR - Selective drop glue
-rw-r--r--src/trans/codegen_c.cpp1
-rw-r--r--src/trans/codegen_mmir.cpp12
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 ++ )
{