pass exchange_malloc an alignment, not a tydesc
This commit is contained in:
parent
0d7799d304
commit
5b40f2ae5b
2 changed files with 37 additions and 24 deletions
|
|
@ -258,25 +258,43 @@ pub fn malloc_raw_dyn(bcx: block,
|
|||
}
|
||||
};
|
||||
|
||||
// Grab the TypeRef type of box_ptr_ty.
|
||||
let box_ptr_ty = mk_fn(bcx.tcx(), t);
|
||||
let llty = type_of(ccx, box_ptr_ty);
|
||||
if heap == heap_exchange {
|
||||
// Grab the TypeRef type of box_ptr_ty.
|
||||
let box_ptr_ty = mk_fn(bcx.tcx(), t);
|
||||
let llty = type_of(ccx, box_ptr_ty);
|
||||
|
||||
// Get the tydesc for the body:
|
||||
let static_ti = get_tydesc(ccx, t);
|
||||
glue::lazily_emit_all_tydesc_glue(ccx, static_ti);
|
||||
let llty_value = type_of::type_of(ccx, t);
|
||||
let llalign = llalign_of_min(ccx, llty_value);
|
||||
|
||||
// Allocate space:
|
||||
let tydesc = PointerCast(bcx, static_ti.tydesc, Type::i8p());
|
||||
let rval = alloca(bcx, Type::i8p());
|
||||
let bcx = callee::trans_lang_call(
|
||||
bcx,
|
||||
langcall,
|
||||
[tydesc, size],
|
||||
expr::SaveIn(rval));
|
||||
let r = rslt(bcx, PointerCast(bcx, Load(bcx, rval), llty));
|
||||
maybe_set_managed_unique_rc(r.bcx, r.val, heap);
|
||||
r
|
||||
// Allocate space:
|
||||
let rval = alloca(bcx, Type::i8p());
|
||||
let bcx = callee::trans_lang_call(
|
||||
bcx,
|
||||
langcall,
|
||||
[C_i32(llalign as i32), size],
|
||||
expr::SaveIn(rval));
|
||||
rslt(bcx, PointerCast(bcx, Load(bcx, rval), llty))
|
||||
} else {
|
||||
// Grab the TypeRef type of box_ptr_ty.
|
||||
let box_ptr_ty = mk_fn(bcx.tcx(), t);
|
||||
let llty = type_of(ccx, box_ptr_ty);
|
||||
|
||||
// Get the tydesc for the body:
|
||||
let static_ti = get_tydesc(ccx, t);
|
||||
glue::lazily_emit_all_tydesc_glue(ccx, static_ti);
|
||||
|
||||
// Allocate space:
|
||||
let tydesc = PointerCast(bcx, static_ti.tydesc, Type::i8p());
|
||||
let rval = alloca(bcx, Type::i8p());
|
||||
let bcx = callee::trans_lang_call(
|
||||
bcx,
|
||||
langcall,
|
||||
[tydesc, size],
|
||||
expr::SaveIn(rval));
|
||||
let r = rslt(bcx, PointerCast(bcx, Load(bcx, rval), llty));
|
||||
maybe_set_managed_unique_rc(r.bcx, r.val, heap);
|
||||
r
|
||||
}
|
||||
}
|
||||
|
||||
// malloc_raw: expects an unboxed type and returns a pointer to
|
||||
|
|
|
|||
|
|
@ -80,13 +80,8 @@ pub unsafe fn exchange_malloc(td: *c_char, size: uintptr_t) -> *c_char {
|
|||
#[cfg(not(stage0), not(test))]
|
||||
#[lang="exchange_malloc"]
|
||||
#[inline]
|
||||
pub unsafe fn exchange_malloc(td: *c_char, size: uintptr_t) -> *c_char {
|
||||
let td = td as *TyDesc;
|
||||
let size = size as uint;
|
||||
|
||||
assert!(td.is_not_null());
|
||||
|
||||
let total_size = get_box_size(size, (*td).align);
|
||||
pub unsafe fn exchange_malloc(align: u32, size: uintptr_t) -> *c_char {
|
||||
let total_size = get_box_size(size as uint, align as uint);
|
||||
malloc_raw(total_size as uint) as *c_char
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue