@@ -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
0 commit comments