diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2014-02-05 23:05:30 -0500 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2014-02-07 20:08:35 -0500 |
| commit | 940d1ae2f3b1cba8cfd858ab3a54d6408b53b033 (patch) | |
| tree | c1060d4799cecaca94f31f6b1cae8bc9aa66a170 /src/librustc/middle/trans | |
| parent | 56565eb129018a708445afcd6ea14f5b51cf27e5 (diff) | |
| download | rust-940d1ae2f3b1cba8cfd858ab3a54d6408b53b033.tar.gz rust-940d1ae2f3b1cba8cfd858ab3a54d6408b53b033.zip | |
remove type descriptors from proc and @T
This also drops support for the managed pointer POISON_ON_FREE feature as it's not worth adding back the support for it. After a snapshot, the leftovers can be removed.
Diffstat (limited to 'src/librustc/middle/trans')
| -rw-r--r-- | src/librustc/middle/trans/base.rs | 6 | ||||
| -rw-r--r-- | src/librustc/middle/trans/debuginfo.rs | 4 | ||||
| -rw-r--r-- | src/librustc/middle/trans/glue.rs | 20 | ||||
| -rw-r--r-- | src/librustc/middle/trans/type_.rs | 2 |
4 files changed, 13 insertions, 19 deletions
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 485daf3d387..d877a468cf0 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -352,7 +352,6 @@ pub fn malloc_raw_dyn<'a>( if heap == heap_exchange { let llty_value = type_of::type_of(ccx, t); - // Allocate space: let r = callee::trans_lang_call( bcx, @@ -375,17 +374,18 @@ pub fn malloc_raw_dyn<'a>( // Grab the TypeRef type of box_ptr_ty. let box_ptr_ty = ty::mk_box(bcx.tcx(), t); let llty = type_of(ccx, box_ptr_ty); + let llalign = C_uint(ccx, llalign_of_min(ccx, llty) as uint); // Get the tydesc for the body: let static_ti = get_tydesc(ccx, t); glue::lazily_emit_tydesc_glue(ccx, abi::tydesc_field_drop_glue, static_ti); // Allocate space: - let tydesc = PointerCast(bcx, static_ti.tydesc, Type::i8p()); + let drop_glue = static_ti.drop_glue.get().unwrap(); let r = callee::trans_lang_call( bcx, langcall, - [tydesc, size], + [PointerCast(bcx, drop_glue, Type::glue_fn(Type::i8p()).ptr_to()), size, llalign], None); rslt(r.bcx, PointerCast(r.bcx, r.val, llty)) } diff --git a/src/librustc/middle/trans/debuginfo.rs b/src/librustc/middle/trans/debuginfo.rs index ed233142238..7bbbf4f9905 100644 --- a/src/librustc/middle/trans/debuginfo.rs +++ b/src/librustc/middle/trans/debuginfo.rs @@ -1779,7 +1779,7 @@ fn boxed_type_metadata(cx: &CrateContext, offset: ComputedMemberOffset, }, MemberDescription { - name: ~"tydesc", + name: ~"drop_glue", llvm_type: member_llvm_types[1], type_metadata: nil_pointer_type_metadata, offset: ComputedMemberOffset, @@ -1824,7 +1824,7 @@ fn boxed_type_metadata(cx: &CrateContext, -> bool { member_llvm_types.len() == 5 && member_llvm_types[0] == cx.int_type && - member_llvm_types[1] == cx.tydesc_type.ptr_to() && + member_llvm_types[1] == Type::generic_glue_fn(cx).ptr_to() && member_llvm_types[2] == Type::i8().ptr_to() && member_llvm_types[3] == Type::i8().ptr_to() && member_llvm_types[4] == content_llvm_type diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs index abf77b4b5fa..c1fb1fc1589 100644 --- a/src/librustc/middle/trans/glue.rs +++ b/src/librustc/middle/trans/glue.rs @@ -355,9 +355,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 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())], []); + let dtor_ptr = Load(bcx, GEPi(bcx, v0, [0, abi::trt_field_vtable])); + let dtor = Load(bcx, dtor_ptr); + Call(bcx, dtor, [PointerCast(bcx, lluniquevalue, Type::i8p())], []); bcx }) } @@ -367,18 +367,12 @@ fn make_drop_glue<'a>(bcx: &'a Block<'a>, v0: ValueRef, t: ty::t) -> &'a Block<' let env_ptr_ty = Type::at_box(ccx, Type::i8()).ptr_to(); let env = PointerCast(bcx, env, env_ptr_ty); with_cond(bcx, IsNotNull(bcx, env), |bcx| { - // Load the type descr found in the env - let lltydescty = ccx.tydesc_type.ptr_to(); - let tydescptr = GEPi(bcx, env, [0u, abi::box_field_tydesc]); - let tydesc = Load(bcx, tydescptr); - let tydesc = PointerCast(bcx, tydesc, lltydescty); - - // Drop the tuple data then free the descriptor + let dtor_ptr = GEPi(bcx, env, [0u, abi::box_field_tydesc]); + let dtor = Load(bcx, dtor_ptr); let cdata = GEPi(bcx, env, [0u, abi::box_field_body]); - call_tydesc_glue_full(bcx, cdata, tydesc, - abi::tydesc_field_drop_glue, None); + Call(bcx, dtor, [PointerCast(bcx, cdata, Type::i8p())], []); - // Free the ty descr (if necc) and the env itself + // Free the environment itself trans_exchange_free(bcx, env) }) } diff --git a/src/librustc/middle/trans/type_.rs b/src/librustc/middle/trans/type_.rs index 8eccbf8d956..804486c4159 100644 --- a/src/librustc/middle/trans/type_.rs +++ b/src/librustc/middle/trans/type_.rs @@ -238,7 +238,7 @@ impl Type { // The box pointed to by @T. pub fn at_box(ctx: &CrateContext, ty: Type) -> Type { Type::struct_([ - ctx.int_type, ctx.tydesc_type.ptr_to(), + ctx.int_type, Type::glue_fn(Type::i8p()).ptr_to(), Type::i8p(), Type::i8p(), ty ], false) } |
