Skip to content

Commit 0743fd7

Browse files
committed
---
yaml --- r: 966 b: refs/heads/master c: 7e01aba h: refs/heads/master v: v3
1 parent f149c3f commit 0743fd7

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 3fd3270845a7892cab2bf7ad45a8e03f24d9f9aa
2+
refs/heads/master: 7e01aba12d1177a831addd75a136cb5a5ea20047

trunk/src/comp/middle/trans.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -633,14 +633,19 @@ fn build_memcpy(@block_ctxt cx,
633633
ValueRef dst,
634634
ValueRef src,
635635
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");
638639
auto src_ptr = cx.build.PointerCast(src, T_ptr(T_i8()));
639640
auto dst_ptr = cx.build.PointerCast(dst, T_ptr(T_i8()));
640641
auto size = cx.build.IntCast(lib.llvm.llvm.LLVMSizeOf(llty),
641642
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+
644649
auto volatile = C_integral(0, T_i1());
645650
ret res(cx, cx.build.Call(memcpy,
646651
vec(dst_ptr, src_ptr,
@@ -1670,20 +1675,21 @@ fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
16701675
fn declare_intrinsics(ModuleRef llmod) -> hashmap[str,ValueRef] {
16711676

16721677
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());
16791682
auto trap = decl_cdecl_fn(llmod, "llvm.trap",
16801683
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()));
16831688

16841689
auto intrinsics = new_str_hash[ValueRef]();
16851690
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);
16871693
ret intrinsics;
16881694
}
16891695

0 commit comments

Comments
 (0)