@@ -52,7 +52,7 @@ use middle::trans::foreign;
5252use middle:: trans:: glue;
5353use middle:: trans:: inline;
5454use middle:: trans:: machine;
55- use middle:: trans:: machine:: llsize_of;
55+ use middle:: trans:: machine:: { llalign_of_min , llsize_of} ;
5656use middle:: trans:: meth;
5757use middle:: trans:: monomorphize;
5858use middle:: trans:: reachable;
@@ -1442,12 +1442,7 @@ pub fn with_cond(bcx: block, val: ValueRef, f: &fn(block) -> block) -> block {
14421442 next_cx
14431443}
14441444
1445- pub fn call_memcpy ( cx : block , dst : ValueRef , src : ValueRef ,
1446- n_bytes : ValueRef ) {
1447- // FIXME (Related to #1645, I think?): Provide LLVM with better
1448- // alignment information when the alignment is statically known (it must
1449- // be nothing more than a constant int, or LLVM complains -- not even a
1450- // constant element of a tydesc works).
1445+ pub fn call_memcpy ( cx : block , dst : ValueRef , src : ValueRef , n_bytes : ValueRef , align : u32 ) {
14511446 let _icx = cx. insn_ctxt ( "call_memcpy" ) ;
14521447 let ccx = cx. ccx ( ) ;
14531448 let key = match ccx. sess . targ_cfg . arch {
@@ -1462,7 +1457,7 @@ pub fn call_memcpy(cx: block, dst: ValueRef, src: ValueRef,
14621457 let src_ptr = PointerCast ( cx, src, T_ptr ( T_i8 ( ) ) ) ;
14631458 let dst_ptr = PointerCast ( cx, dst, T_ptr ( T_i8 ( ) ) ) ;
14641459 let size = IntCast ( cx, n_bytes, ccx. int_type ) ;
1465- let align = C_i32 ( 1i32 ) ;
1460+ let align = C_i32 ( align as i32 ) ;
14661461 let volatile = C_i1 ( false ) ;
14671462 Call ( cx, memcpy, [ dst_ptr, src_ptr, size, align, volatile] ) ;
14681463}
@@ -1471,8 +1466,10 @@ pub fn memcpy_ty(bcx: block, dst: ValueRef, src: ValueRef, t: ty::t) {
14711466 let _icx = bcx. insn_ctxt ( "memcpy_ty" ) ;
14721467 let ccx = bcx. ccx ( ) ;
14731468 if ty:: type_is_structural ( t) {
1474- let llsz = llsize_of ( ccx, type_of:: type_of ( ccx, t) ) ;
1475- call_memcpy ( bcx, dst, src, llsz) ;
1469+ let llty = type_of:: type_of ( ccx, t) ;
1470+ let llsz = llsize_of ( ccx, llty) ;
1471+ let llalign = llalign_of_min ( ccx, llty) ;
1472+ call_memcpy ( bcx, dst, src, llsz, llalign as u32 ) ;
14761473 } else {
14771474 Store ( bcx, Load ( bcx, src) , dst) ;
14781475 }
0 commit comments