From 50bee30459974d4ac9b5be085d8b797c6d0e4995 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 29 Jan 2014 10:41:39 -0500 Subject: [PATCH 1/2] stop making visit glue for closures and traits --- src/librustc/middle/trans/base.rs | 2 +- src/librustc/middle/trans/glue.rs | 2 +- src/librustc/middle/trans/meth.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 87667d3ff48..a12e3eb8285 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -376,7 +376,7 @@ pub fn malloc_raw_dyn<'a>( // Get the tydesc for the body: let static_ti = get_tydesc(ccx, t); - glue::lazily_emit_all_tydesc_glue(ccx, static_ti); + glue::lazily_emit_tydesc_glue(ccx, abi::tydesc_field_drop_glue, static_ti); // Allocate space: let tydesc = PointerCast(bcx, static_ti.tydesc, Type::i8p()); diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs index ea5e6e8d386..45f95907481 100644 --- a/src/librustc/middle/trans/glue.rs +++ b/src/librustc/middle/trans/glue.rs @@ -131,7 +131,7 @@ fn simplified_glue_type(tcx: ty::ctxt, field: uint, t: ty::t) -> ty::t { t } -fn lazily_emit_tydesc_glue(ccx: @CrateContext, field: uint, ti: @tydesc_info) { +pub fn lazily_emit_tydesc_glue(ccx: @CrateContext, field: uint, ti: @tydesc_info) { let _icx = push_ctxt("lazily_emit_tydesc_glue"); let simpl = simplified_glue_type(ccx.tcx, field, ti.ty); diff --git a/src/librustc/middle/trans/meth.rs b/src/librustc/middle/trans/meth.rs index 0301bbf5979..4a8ebafc0b4 100644 --- a/src/librustc/middle/trans/meth.rs +++ b/src/librustc/middle/trans/meth.rs @@ -481,7 +481,7 @@ pub fn get_vtable(bcx: &Block, // Generate a type descriptor for the vtable. let tydesc = get_tydesc(ccx, self_ty); - glue::lazily_emit_all_tydesc_glue(ccx, tydesc); + glue::lazily_emit_tydesc_glue(ccx, abi::tydesc_field_drop_glue, tydesc); let vtable = make_vtable(ccx, tydesc, methods); From 383e3fd13b99827b5dbb107da7433bd0a70dea80 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 29 Jan 2014 10:59:47 -0500 Subject: [PATCH 2/2] use a more efficient vtable representation [TyDesc, ... methods] -> [destructor, ... methods] --- src/librustc/middle/trans/glue.rs | 14 +++----------- src/librustc/middle/trans/meth.rs | 2 +- src/librustc/middle/trans/type_.rs | 6 +++--- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs index 45f95907481..ab77d105e5f 100644 --- a/src/librustc/middle/trans/glue.rs +++ b/src/librustc/middle/trans/glue.rs @@ -367,17 +367,9 @@ fn make_drop_glue<'a>(bcx: &'a Block<'a>, v0: ValueRef, t: ty::t) -> &'a Block<' let lluniquevalue = GEPi(bcx, v0, [0, abi::trt_field_box]); // Only drop the value when it is non-null with_cond(bcx, IsNotNull(bcx, Load(bcx, lluniquevalue)), |bcx| { - let llvtable = Load(bcx, GEPi(bcx, v0, [0, abi::trt_field_vtable])); - - // Cast the vtable to a pointer to a pointer to a tydesc. - let llvtable = PointerCast(bcx, llvtable, - ccx.tydesc_type.ptr_to().ptr_to()); - let lltydesc = Load(bcx, llvtable); - call_tydesc_glue_full(bcx, - lluniquevalue, - lltydesc, - abi::tydesc_field_drop_glue, - None); + let lldtor_ptr = Load(bcx, GEPi(bcx, v0, [0, abi::trt_field_vtable])); + let lldtor = Load(bcx, lldtor_ptr); + Call(bcx, lldtor, [PointerCast(bcx, lluniquevalue, Type::i8p())], []); bcx }) } diff --git a/src/librustc/middle/trans/meth.rs b/src/librustc/middle/trans/meth.rs index 4a8ebafc0b4..09bfa36ddc1 100644 --- a/src/librustc/middle/trans/meth.rs +++ b/src/librustc/middle/trans/meth.rs @@ -498,7 +498,7 @@ pub fn make_vtable(ccx: &CrateContext, unsafe { let _icx = push_ctxt("meth::make_vtable"); - let mut components = ~[ tydesc.tydesc ]; + let mut components = ~[tydesc.drop_glue.get().unwrap()]; for &ptr in ptrs.iter() { components.push(ptr) } diff --git a/src/librustc/middle/trans/type_.rs b/src/librustc/middle/trans/type_.rs index e685849cbd8..39a99ef9950 100644 --- a/src/librustc/middle/trans/type_.rs +++ b/src/librustc/middle/trans/type_.rs @@ -180,7 +180,7 @@ impl Type { } pub fn vtable() -> Type { - Type::array(&Type::i8().ptr_to(), 1) + Type::array(&Type::i8p().ptr_to(), 1) } pub fn generic_glue_fn(cx: &CrateContext) -> Type { @@ -246,13 +246,13 @@ impl Type { } pub fn opaque_trait(ctx: &CrateContext, store: ty::TraitStore) -> Type { - let tydesc_ptr = ctx.tydesc_type.ptr_to(); + let vtable = Type::glue_fn(Type::i8p()).ptr_to().ptr_to(); let box_ty = match store { ty::BoxTraitStore => Type::at_box(ctx, Type::i8()), ty::UniqTraitStore => Type::i8(), ty::RegionTraitStore(..) => Type::i8() }; - Type::struct_([tydesc_ptr, box_ty.ptr_to()], false) + Type::struct_([vtable, box_ty.ptr_to()], false) } pub fn kind(&self) -> TypeKind {