Skip to content

Commit 5b40f2a

Browse files
committed
pass exchange_malloc an alignment, not a tydesc
1 parent 0d7799d commit 5b40f2a

File tree

2 files changed

+39
-26
lines changed

2 files changed

+39
-26
lines changed

src/librustc/middle/trans/base.rs

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -258,25 +258,43 @@ pub fn malloc_raw_dyn(bcx: block,
258258
}
259259
};
260260

261-
// Grab the TypeRef type of box_ptr_ty.
262-
let box_ptr_ty = mk_fn(bcx.tcx(), t);
263-
let llty = type_of(ccx, box_ptr_ty);
264-
265-
// Get the tydesc for the body:
266-
let static_ti = get_tydesc(ccx, t);
267-
glue::lazily_emit_all_tydesc_glue(ccx, static_ti);
268-
269-
// Allocate space:
270-
let tydesc = PointerCast(bcx, static_ti.tydesc, Type::i8p());
271-
let rval = alloca(bcx, Type::i8p());
272-
let bcx = callee::trans_lang_call(
273-
bcx,
274-
langcall,
275-
[tydesc, size],
276-
expr::SaveIn(rval));
277-
let r = rslt(bcx, PointerCast(bcx, Load(bcx, rval), llty));
278-
maybe_set_managed_unique_rc(r.bcx, r.val, heap);
279-
r
261+
if heap == heap_exchange {
262+
// Grab the TypeRef type of box_ptr_ty.
263+
let box_ptr_ty = mk_fn(bcx.tcx(), t);
264+
let llty = type_of(ccx, box_ptr_ty);
265+
266+
let llty_value = type_of::type_of(ccx, t);
267+
let llalign = llalign_of_min(ccx, llty_value);
268+
269+
// Allocate space:
270+
let rval = alloca(bcx, Type::i8p());
271+
let bcx = callee::trans_lang_call(
272+
bcx,
273+
langcall,
274+
[C_i32(llalign as i32), size],
275+
expr::SaveIn(rval));
276+
rslt(bcx, PointerCast(bcx, Load(bcx, rval), llty))
277+
} else {
278+
// Grab the TypeRef type of box_ptr_ty.
279+
let box_ptr_ty = mk_fn(bcx.tcx(), t);
280+
let llty = type_of(ccx, box_ptr_ty);
281+
282+
// Get the tydesc for the body:
283+
let static_ti = get_tydesc(ccx, t);
284+
glue::lazily_emit_all_tydesc_glue(ccx, static_ti);
285+
286+
// Allocate space:
287+
let tydesc = PointerCast(bcx, static_ti.tydesc, Type::i8p());
288+
let rval = alloca(bcx, Type::i8p());
289+
let bcx = callee::trans_lang_call(
290+
bcx,
291+
langcall,
292+
[tydesc, size],
293+
expr::SaveIn(rval));
294+
let r = rslt(bcx, PointerCast(bcx, Load(bcx, rval), llty));
295+
maybe_set_managed_unique_rc(r.bcx, r.val, heap);
296+
r
297+
}
280298
}
281299

282300
// malloc_raw: expects an unboxed type and returns a pointer to

src/libstd/rt/global_heap.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,8 @@ pub unsafe fn exchange_malloc(td: *c_char, size: uintptr_t) -> *c_char {
8080
#[cfg(not(stage0), not(test))]
8181
#[lang="exchange_malloc"]
8282
#[inline]
83-
pub unsafe fn exchange_malloc(td: *c_char, size: uintptr_t) -> *c_char {
84-
let td = td as *TyDesc;
85-
let size = size as uint;
86-
87-
assert!(td.is_not_null());
88-
89-
let total_size = get_box_size(size, (*td).align);
83+
pub unsafe fn exchange_malloc(align: u32, size: uintptr_t) -> *c_char {
84+
let total_size = get_box_size(size as uint, align as uint);
9085
malloc_raw(total_size as uint) as *c_char
9186
}
9287

0 commit comments

Comments
 (0)