diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-01-17 11:20:21 -0800 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-01-17 20:21:09 -0800 |
| commit | 7bc2930cfaa1f4f5bf883b4df23b09cbb6fe6e27 (patch) | |
| tree | af4ad0b3269f24f54d5a320bfd8aa20a41ded3e6 /src/comp | |
| parent | 6e27b27cf8a9ece270f2556c3362524854d06de4 (diff) | |
| download | rust-7bc2930cfaa1f4f5bf883b4df23b09cbb6fe6e27.tar.gz rust-7bc2930cfaa1f4f5bf883b4df23b09cbb6fe6e27.zip | |
roll back commit 1c7a62
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/back/upcall.rs | 2 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 32 |
2 files changed, 16 insertions, 18 deletions
diff --git a/src/comp/back/upcall.rs b/src/comp/back/upcall.rs index 115cd53276d..a6bf286a2a8 100644 --- a/src/comp/back/upcall.rs +++ b/src/comp/back/upcall.rs @@ -16,7 +16,6 @@ type upcalls = free: ValueRef, shared_malloc: ValueRef, shared_free: ValueRef, - memset: ValueRef, mark: ValueRef, create_shared_type_desc: ValueRef, free_shared_type_desc: ValueRef, @@ -65,7 +64,6 @@ fn declare_upcalls(targ_cfg: @session::config, T_ptr(T_i8())), shared_free: dv("shared_free", [T_ptr(T_i8())]), - memset: dv("memset", [T_ptr(T_i8()), T_i8(), T_i32(), T_i32()]), mark: d("mark", [T_ptr(T_i8())], int_t), create_shared_type_desc: diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 314385a9f25..c9591340d9f 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -1945,21 +1945,21 @@ fn call_memmove(cx: @block_ctxt, dst: ValueRef, src: ValueRef, } fn call_bzero(cx: @block_ctxt, dst: ValueRef, n_bytes: ValueRef, - align_bytes: ValueRef) -> @block_ctxt { + align_bytes: ValueRef) -> result { // FIXME: switch to the 64-bit variant when on such a platform. - let ccx = bcx_ccx(cx), dst = dst; + let ccx = bcx_ccx(cx); + let i = ccx.intrinsics; + assert (i.contains_key("llvm.memset.p0i8.i32")); + let memset = i.get("llvm.memset.p0i8.i32"); let dst_ptr = PointerCast(cx, dst, T_ptr(T_i8())); let size = IntCast(cx, n_bytes, T_i32()); - let align = IntCast(cx, align_bytes, T_i32()); - if lib::llvm::llvm::LLVMIsConstant(align_bytes) != True { - // Use our own upcall (see issue 843), since the LLVM intrinsic can - // only handle constant alignments. - Call(cx, ccx.upcalls.memset, [dst_ptr, C_u8(0u), size, align]); - } else { - let memset = ccx.intrinsics.get("llvm.memset.p0i8.i32"); - Call(cx, memset, [dst_ptr, C_u8(0u), size, align, C_bool(false)]); - } - cx + let align = + if lib::llvm::llvm::LLVMIsConstant(align_bytes) == True { + IntCast(cx, align_bytes, T_i32()) + } else { IntCast(cx, C_int(ccx, 0), T_i32()) }; + let volatile = C_bool(false); + ret rslt(cx, + Call(cx, memset, [dst_ptr, C_u8(0u), size, align, volatile])); } fn memmove_ty(bcx: @block_ctxt, dst: ValueRef, src: ValueRef, t: ty::t) -> @@ -3984,13 +3984,13 @@ fn zero_alloca(cx: @block_ctxt, llptr: ValueRef, t: ty::t) let sp = cx.sp; let llty = type_of(ccx, sp, t); Store(bcx, C_null(llty), llptr); - bcx } else { - let {bcx, val: llsz} = size_of(bcx, t); + let llsz = size_of(bcx, t); // FIXME passing in the align here is correct, but causes issue #843 - let {bcx, val: align} = align_of(bcx, t); - call_bzero(bcx, llptr, llsz, align) + // let llalign = align_of(llsz.bcx, t); + bcx = call_bzero(llsz.bcx, llptr, llsz.val, C_int(ccx, 0)).bcx; } + ret bcx; } fn trans_stmt(cx: @block_ctxt, s: ast::stmt) -> @block_ctxt { |
