Skip to content

Commit

Permalink
Omit lifetime intrinsics for zero-sized types
Browse files Browse the repository at this point in the history
These aren't super common, but happen for e.g. closures that have an
empty environment, and for for-loops that return ().
  • Loading branch information
dotdash committed Aug 23, 2015
1 parent 2375743 commit 64fcf3b
Showing 1 changed file with 12 additions and 4 deletions.
16 changes: 12 additions & 4 deletions src/librustc_trans/trans/base.rs
Expand Up @@ -917,10 +917,14 @@ pub fn call_lifetime_start(cx: Block, ptr: ValueRef) {
let _icx = push_ctxt("lifetime_start");
let ccx = cx.ccx();

let llsize = C_u64(ccx, machine::llsize_of_alloc(ccx, val_ty(ptr).element_type()));
let size = machine::llsize_of_alloc(ccx, val_ty(ptr).element_type());
if size == 0 {
return;
}

let ptr = PointerCast(cx, ptr, Type::i8p(ccx));
let lifetime_start = ccx.get_intrinsic(&"llvm.lifetime.start");
Call(cx, lifetime_start, &[llsize, ptr], None, DebugLoc::None);
Call(cx, lifetime_start, &[C_u64(ccx, size), ptr], None, DebugLoc::None);
}

pub fn call_lifetime_end(cx: Block, ptr: ValueRef) {
Expand All @@ -931,10 +935,14 @@ pub fn call_lifetime_end(cx: Block, ptr: ValueRef) {
let _icx = push_ctxt("lifetime_end");
let ccx = cx.ccx();

let llsize = C_u64(ccx, machine::llsize_of_alloc(ccx, val_ty(ptr).element_type()));
let size = machine::llsize_of_alloc(ccx, val_ty(ptr).element_type());
if size == 0 {
return;
}

let ptr = PointerCast(cx, ptr, Type::i8p(ccx));
let lifetime_end = ccx.get_intrinsic(&"llvm.lifetime.end");
Call(cx, lifetime_end, &[llsize, ptr], None, DebugLoc::None);
Call(cx, lifetime_end, &[C_u64(ccx, size), ptr], None, DebugLoc::None);
}

pub fn call_memcpy(cx: Block, dst: ValueRef, src: ValueRef, n_bytes: ValueRef, align: u32) {
Expand Down

0 comments on commit 64fcf3b

Please sign in to comment.