about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2010-11-26 13:02:48 -0800
committerGraydon Hoare <graydon@mozilla.com>2010-11-26 13:02:48 -0800
commit7e01aba12d1177a831addd75a136cb5a5ea20047 (patch)
tree4955a47e990bb167d2b00959a2ca514a0f448f13 /src/comp
parent3fd3270845a7892cab2bf7ad45a8e03f24d9f9aa (diff)
downloadrust-7e01aba12d1177a831addd75a136cb5a5ea20047.tar.gz
rust-7e01aba12d1177a831addd75a136cb5a5ea20047.zip
Declare the memcpy intrinsics properly.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 73db9e05d54..8aaeba5c734 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -633,14 +633,19 @@ fn build_memcpy(@block_ctxt cx,
                 ValueRef dst,
                 ValueRef src,
                 TypeRef llty) -> result {
-    check (cx.fcx.ccx.intrinsics.contains_key("llvm.memcpy"));
-    auto memcpy = cx.fcx.ccx.intrinsics.get("llvm.memcpy");
+    // FIXME: switch to the 64-bit variant when on such a platform.
+    check (cx.fcx.ccx.intrinsics.contains_key("llvm.memcpy.p0i8.p0i8.i32"));
+    auto memcpy = cx.fcx.ccx.intrinsics.get("llvm.memcpy.p0i8.p0i8.i32");
     auto src_ptr = cx.build.PointerCast(src, T_ptr(T_i8()));
     auto dst_ptr = cx.build.PointerCast(dst, T_ptr(T_i8()));
     auto size = cx.build.IntCast(lib.llvm.llvm.LLVMSizeOf(llty),
                                  T_i32());
-    auto align = cx.build.IntCast(lib.llvm.llvm.LLVMAlignOf(llty),
-                                  T_i32());
+    auto align = cx.build.IntCast(C_int(1), T_i32());
+
+    // FIXME: align seems like it should be
+    //   lib.llvm.llvm.LLVMAlignOf(llty);
+    // but this makes it upset because it's not a constant.
+
     auto volatile = C_integral(0, T_i1());
     ret res(cx, cx.build.Call(memcpy,
                               vec(dst_ptr, src_ptr,
@@ -1670,20 +1675,21 @@ fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
 fn declare_intrinsics(ModuleRef llmod) -> hashmap[str,ValueRef] {
 
     let vec[TypeRef] T_trap_args = vec();
-    // FIXME: switch this to 64-bit memcpy when targeting a 64-bit system.
-    let vec[TypeRef] T_memcpy_args = vec(T_ptr(T_i8()),
-                                         T_ptr(T_i8()),
-                                         T_i32(),
-                                         T_i32(),
-                                         T_i1());
+    let vec[TypeRef] T_memcpy32_args = vec(T_ptr(T_i8()), T_ptr(T_i8()),
+                                           T_i32(), T_i32(), T_i1());
+    let vec[TypeRef] T_memcpy64_args = vec(T_ptr(T_i8()), T_ptr(T_i8()),
+                                           T_i32(), T_i32(), T_i1());
     auto trap = decl_cdecl_fn(llmod, "llvm.trap",
                               T_fn(T_trap_args, T_void()));
-    auto memcpy = decl_cdecl_fn(llmod, "llvm.memcpy",
-                                T_fn(T_memcpy_args, T_void()));
+    auto memcpy32 = decl_cdecl_fn(llmod, "llvm.memcpy.p0i8.p0i8.i32",
+                                  T_fn(T_memcpy32_args, T_void()));
+    auto memcpy64 = decl_cdecl_fn(llmod, "llvm.memcpy.p0i8.p0i8.i64",
+                                  T_fn(T_memcpy64_args, T_void()));
 
     auto intrinsics = new_str_hash[ValueRef]();
     intrinsics.insert("llvm.trap", trap);
-    intrinsics.insert("llvm.memcpy", memcpy);
+    intrinsics.insert("llvm.memcpy.p0i8.p0i8.i32", memcpy32);
+    intrinsics.insert("llvm.memcpy.p0i8.p0i8.i64", memcpy64);
     ret intrinsics;
 }