diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp index f5745fe4b86..9e736252fd6 100644 --- a/src/rt/rust_upcall.cpp +++ b/src/rt/rust_upcall.cpp @@ -156,6 +156,7 @@ exchange_malloc(rust_task *task, type_desc *td, uintptr_t size) { return (uintptr_t)header; } +// FIXME: remove after snapshot (6/13/12) struct s_exchange_malloc_args { uintptr_t retval; type_desc *td; @@ -238,6 +239,7 @@ shared_malloc(rust_task *task, type_desc *td, uintptr_t size) { return (uintptr_t)box; } +// FIXME: remove after snapshot (6/13/12) struct s_malloc_args { uintptr_t retval; type_desc *td; diff --git a/src/rustc/back/upcall.rs b/src/rustc/back/upcall.rs index c24e23d2655..3925f005de8 100644 --- a/src/rustc/back/upcall.rs +++ b/src/rustc/back/upcall.rs @@ -10,10 +10,8 @@ import lib::llvm::{type_names, ModuleRef, ValueRef, TypeRef}; type upcalls = {_fail: ValueRef, trace: ValueRef, - malloc: ValueRef, malloc_dyn: ValueRef, free: ValueRef, - exchange_malloc: ValueRef, exchange_malloc_dyn: ValueRef, exchange_free: ValueRef, validate_box: ValueRef, @@ -57,17 +55,12 @@ fn declare_upcalls(targ_cfg: @session::config, trace: dv("trace", [T_ptr(T_i8()), T_ptr(T_i8()), int_t]), - malloc: - nothrow(d("malloc", [T_ptr(tydesc_type)], malloc_dyn: nothrow(d("malloc_dyn", [T_ptr(tydesc_type), int_t], T_ptr(T_i8()))), free: nothrow(dv("free", [T_ptr(T_i8())])), - exchange_malloc: - nothrow(d("exchange_malloc", [T_ptr(tydesc_type)], - T_ptr(T_i8()))), exchange_malloc_dyn: nothrow(d("exchange_malloc_dyn", [T_ptr(tydesc_type), int_t], diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index 62128c4cf54..57e0751f319 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -348,17 +348,17 @@ fn opaque_box_body(bcx: block, PointerCast(bcx, bodyptr, T_ptr(type_of(ccx, body_t))) } -// malloc_raw: expects an unboxed type and returns a pointer to -// enough space for a box of that type. This includes a rust_opaque_box -// header. -fn malloc_raw(bcx: block, t: ty::t, heap: heap) -> ValueRef { +// malloc_raw_dyn: allocates a box to contain a given type, but with a +// potentially dynamic size. +fn malloc_raw_dyn(bcx: block, t: ty::t, heap: heap, + size: ValueRef) -> ValueRef { let _icx = bcx.insn_ctxt("malloc_raw"); let ccx = bcx.ccx(); let (mk_fn, upcall) = alt heap { - heap_shared { (ty::mk_imm_box, ccx.upcalls.malloc) } + heap_shared { (ty::mk_imm_box, ccx.upcalls.malloc_dyn) } heap_exchange { - (ty::mk_imm_uniq, ccx.upcalls.exchange_malloc ) + (ty::mk_imm_uniq, ccx.upcalls.exchange_malloc_dyn ) } }; @@ -372,52 +372,40 @@ fn malloc_raw(bcx: block, t: ty::t, heap: heap) -> ValueRef { lazily_emit_all_tydesc_glue(ccx, copy static_ti); // Allocate space: - let rval = Call(bcx, upcall, [lltydesc]); + let rval = Call(bcx, upcall, [lltydesc, size]); ret PointerCast(bcx, rval, llty); } -// malloc_general: usefully wraps malloc_raw; allocates a box, +// malloc_raw: expects an unboxed type and returns a pointer to +// enough space for a box of that type. This includes a rust_opaque_box +// header. +fn malloc_raw(bcx: block, t: ty::t, heap: heap) -> ValueRef { + malloc_raw_dyn(bcx, t, heap, llsize_of(bcx.ccx(), type_of(bcx.ccx(), t))) +} + +// malloc_general_dyn: usefully wraps malloc_raw_dyn; allocates a box, // and pulls out the body -fn malloc_general(bcx: block, t: ty::t, heap: heap) -> +fn malloc_general_dyn(bcx: block, t: ty::t, heap: heap, size: ValueRef) -> {box: ValueRef, body: ValueRef} { let _icx = bcx.insn_ctxt("malloc_general"); - let box = malloc_raw(bcx, t, heap); + let box = malloc_raw_dyn(bcx, t, heap, size); let non_gc_box = non_gc_box_cast(bcx, box); let body = GEPi(bcx, non_gc_box, [0u, abi::box_field_body]); ret {box: box, body: body}; } fn malloc_boxed(bcx: block, t: ty::t) -> {box: ValueRef, body: ValueRef} { - malloc_general(bcx, t, heap_shared) + malloc_general_dyn(bcx, t, heap_shared, + llsize_of(bcx.ccx(), type_of(bcx.ccx(), t))) } fn malloc_unique(bcx: block, t: ty::t) -> {box: ValueRef, body: ValueRef} { - malloc_general(bcx, t, heap_exchange) -} - -fn malloc_unique_dyn_raw(bcx: block, t: ty::t, size: ValueRef) -> ValueRef { - let _icx = bcx.insn_ctxt("malloc_unique_dyn_raw"); - let ccx = bcx.ccx(); - - // Grab the TypeRef type of box_ptr_ty. - let box_ptr_ty = ty::mk_imm_uniq(ccx.tcx, t); - let llty = type_of(ccx, box_ptr_ty); - - // Get the tydesc for the body: - let mut static_ti = none; - let lltydesc = get_tydesc(ccx, t, static_ti); - lazily_emit_all_tydesc_glue(ccx, static_ti); - - // Allocate space: - let rval = Call(bcx, ccx.upcalls.exchange_malloc_dyn, [lltydesc, size]); - ret PointerCast(bcx, rval, llty); + malloc_general_dyn(bcx, t, heap_exchange, + llsize_of(bcx.ccx(), type_of(bcx.ccx(), t))) } fn malloc_unique_dyn(bcx: block, t: ty::t, size: ValueRef ) -> {box: ValueRef, body: ValueRef} { - let _icx = bcx.insn_ctxt("malloc_unique_dyn"); - let box = malloc_unique_dyn_raw(bcx, t, size); - let body = GEPi(bcx, box, [0u, abi::box_field_body]); - ret {box: box, body: body}; + malloc_general_dyn(bcx, t, heap_exchange, size) } // Type descriptor and type glue stuff diff --git a/src/rustc/middle/trans/closure.rs b/src/rustc/middle/trans/closure.rs index 8d97653d182..868826d975b 100644 --- a/src/rustc/middle/trans/closure.rs +++ b/src/rustc/middle/trans/closure.rs @@ -553,8 +553,8 @@ fn make_opaque_cbox_take_glue( let sz = Add(bcx, sz, shape::llsize_of(ccx, T_box_header(ccx))); // Allocate memory, update original ptr, and copy existing data - let malloc = ccx.upcalls.exchange_malloc; - let cbox_out = Call(bcx, malloc, [tydesc]); + let malloc = ccx.upcalls.exchange_malloc_dyn; + let cbox_out = Call(bcx, malloc, [tydesc, sz]); let cbox_out = PointerCast(bcx, cbox_out, llopaquecboxty); call_memmove(bcx, cbox_out, cbox_in, sz); Store(bcx, cbox_out, cboxptr);