@@ -633,14 +633,19 @@ fn build_memcpy(@block_ctxt cx,
633
633
ValueRef dst,
634
634
ValueRef src,
635
635
TypeRef llty) -> result {
636
- check ( cx. fcx . ccx . intrinsics . contains_key ( "llvm.memcpy" ) ) ;
637
- auto memcpy = cx. fcx . ccx . intrinsics . get ( "llvm.memcpy" ) ;
636
+ // FIXME: switch to the 64-bit variant when on such a platform.
637
+ check ( cx. fcx . ccx . intrinsics . contains_key ( "llvm.memcpy.p0i8.p0i8.i32" ) ) ;
638
+ auto memcpy = cx. fcx . ccx . intrinsics . get ( "llvm.memcpy.p0i8.p0i8.i32" ) ;
638
639
auto src_ptr = cx. build . PointerCast ( src, T_ptr ( T_i8 ( ) ) ) ;
639
640
auto dst_ptr = cx. build . PointerCast ( dst, T_ptr ( T_i8 ( ) ) ) ;
640
641
auto size = cx. build . IntCast ( lib. llvm . llvm . LLVMSizeOf ( llty) ,
641
642
T_i32 ( ) ) ;
642
- auto align = cx. build . IntCast ( lib. llvm . llvm . LLVMAlignOf ( llty) ,
643
- T_i32 ( ) ) ;
643
+ auto align = cx. build . IntCast ( C_int ( 1 ) , T_i32 ( ) ) ;
644
+
645
+ // FIXME: align seems like it should be
646
+ // lib.llvm.llvm.LLVMAlignOf(llty);
647
+ // but this makes it upset because it's not a constant.
648
+
644
649
auto volatile = C_integral ( 0 , T_i1 ( ) ) ;
645
650
ret res( cx, cx. build . Call ( memcpy,
646
651
vec ( dst_ptr, src_ptr,
@@ -1670,20 +1675,21 @@ fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
1670
1675
fn declare_intrinsics ( ModuleRef llmod) -> hashmap [ str, ValueRef ] {
1671
1676
1672
1677
let vec[ TypeRef ] T_trap_args = vec ( ) ;
1673
- // FIXME: switch this to 64-bit memcpy when targeting a 64-bit system.
1674
- let vec[ TypeRef ] T_memcpy_args = vec ( T_ptr ( T_i8 ( ) ) ,
1675
- T_ptr ( T_i8 ( ) ) ,
1676
- T_i32 ( ) ,
1677
- T_i32 ( ) ,
1678
- T_i1 ( ) ) ;
1678
+ let vec[ TypeRef ] T_memcpy32_args = vec ( T_ptr ( T_i8 ( ) ) , T_ptr ( T_i8 ( ) ) ,
1679
+ T_i32 ( ) , T_i32 ( ) , T_i1 ( ) ) ;
1680
+ let vec[ TypeRef ] T_memcpy64_args = vec ( T_ptr ( T_i8 ( ) ) , T_ptr ( T_i8 ( ) ) ,
1681
+ T_i32 ( ) , T_i32 ( ) , T_i1 ( ) ) ;
1679
1682
auto trap = decl_cdecl_fn ( llmod, "llvm.trap" ,
1680
1683
T_fn ( T_trap_args , T_void ( ) ) ) ;
1681
- auto memcpy = decl_cdecl_fn ( llmod, "llvm.memcpy" ,
1682
- T_fn ( T_memcpy_args , T_void ( ) ) ) ;
1684
+ auto memcpy32 = decl_cdecl_fn ( llmod, "llvm.memcpy.p0i8.p0i8.i32" ,
1685
+ T_fn ( T_memcpy32_args , T_void ( ) ) ) ;
1686
+ auto memcpy64 = decl_cdecl_fn ( llmod, "llvm.memcpy.p0i8.p0i8.i64" ,
1687
+ T_fn ( T_memcpy64_args , T_void ( ) ) ) ;
1683
1688
1684
1689
auto intrinsics = new_str_hash[ ValueRef ] ( ) ;
1685
1690
intrinsics. insert ( "llvm.trap" , trap) ;
1686
- intrinsics. insert ( "llvm.memcpy" , memcpy) ;
1691
+ intrinsics. insert ( "llvm.memcpy.p0i8.p0i8.i32" , memcpy32) ;
1692
+ intrinsics. insert ( "llvm.memcpy.p0i8.p0i8.i64" , memcpy64) ;
1687
1693
ret intrinsics;
1688
1694
}
1689
1695
0 commit comments