Clean up trans_build, factor repeated code into function
This commit is contained in:
parent
e17e6af4f0
commit
61392f9f82
2 changed files with 105 additions and 282 deletions
|
@ -5,74 +5,64 @@ import llvm::{ValueRef, TypeRef, BasicBlockRef, BuilderRef,
|
|||
Opcode, ModuleRef};
|
||||
import trans_common::block_ctxt;
|
||||
|
||||
fn B(cx: &@block_ctxt) -> BuilderRef {
|
||||
let b = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(b, cx.llbb);
|
||||
ret b;
|
||||
}
|
||||
|
||||
fn RetVoid(cx: &@block_ctxt) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildRetVoid(B);
|
||||
ret llvm::LLVMBuildRetVoid(B(cx));
|
||||
}
|
||||
|
||||
fn Ret(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildRet(B, V);
|
||||
ret llvm::LLVMBuildRet(B(cx), V);
|
||||
}
|
||||
|
||||
fn AggregateRet(cx: &@block_ctxt, RetVals: &[ValueRef]) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildAggregateRet(B, vec::to_ptr(RetVals),
|
||||
ret llvm::LLVMBuildAggregateRet(B(cx), vec::to_ptr(RetVals),
|
||||
vec::len(RetVals));
|
||||
}
|
||||
|
||||
fn Br(cx: &@block_ctxt, Dest: BasicBlockRef) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildBr(B, Dest);
|
||||
ret llvm::LLVMBuildBr(B(cx), Dest);
|
||||
}
|
||||
|
||||
fn CondBr(cx: &@block_ctxt, If: ValueRef, Then: BasicBlockRef,
|
||||
Else: BasicBlockRef) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildCondBr(B, If, Then, Else);
|
||||
ret llvm::LLVMBuildCondBr(B(cx), If, Then, Else);
|
||||
}
|
||||
|
||||
fn Switch(cx: &@block_ctxt, V: ValueRef, Else: BasicBlockRef,
|
||||
NumCases: uint) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildSwitch(B, V, Else, NumCases);
|
||||
ret llvm::LLVMBuildSwitch(B(cx), V, Else, NumCases);
|
||||
}
|
||||
|
||||
fn IndirectBr(cx: &@block_ctxt, Addr: ValueRef,
|
||||
NumDests: uint) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildIndirectBr(B, Addr, NumDests);
|
||||
ret llvm::LLVMBuildIndirectBr(B(cx), Addr, NumDests);
|
||||
}
|
||||
|
||||
fn Invoke(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef],
|
||||
Then: BasicBlockRef, Catch: BasicBlockRef) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildInvoke(B, Fn, vec::to_ptr(Args),
|
||||
llvm::LLVMBuildInvoke(B(cx), Fn, vec::to_ptr(Args),
|
||||
vec::len(Args), Then, Catch, buf)
|
||||
});
|
||||
}
|
||||
|
@ -80,514 +70,388 @@ fn Invoke(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef],
|
|||
fn Unreachable(cx: &@block_ctxt) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildUnreachable(B);
|
||||
ret llvm::LLVMBuildUnreachable(B(cx));
|
||||
}
|
||||
|
||||
/* Arithmetic */
|
||||
fn Add(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildAdd(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildAdd(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn NSWAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNSWAdd(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildNSWAdd(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn NUWAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNUWAdd(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildNUWAdd(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFAdd(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildFAdd(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Sub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildSub(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildSub(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn NSWSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNSWSub(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildNSWSub(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn NUWSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNUWSub(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildNUWSub(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFSub(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildFSub(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Mul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildMul(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildMul(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn NSWMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNSWMul(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildNSWMul(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn NUWMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNUWMul(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildNUWMul(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFMul(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildFMul(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn UDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildUDiv(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildUDiv(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn SDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildSDiv(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildSDiv(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn ExactSDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildExactSDiv(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildExactSDiv(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFDiv(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildFDiv(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn URem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildURem(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildURem(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn SRem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildSRem(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildSRem(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FRem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFRem(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildFRem(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Shl(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildShl(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildShl(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn LShr(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildLShr(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildLShr(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn AShr(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildAShr(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildAShr(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn And(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildAnd(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildAnd(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Or(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildOr(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildOr(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Xor(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildXor(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildXor(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn BinOp(cx: &@block_ctxt, Op: Opcode, LHS: ValueRef,
|
||||
RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildBinOp(B, Op, LHS, RHS, buf)
|
||||
llvm::LLVMBuildBinOp(B(cx), Op, LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Neg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNeg(B, V, buf)
|
||||
llvm::LLVMBuildNeg(B(cx), V, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn NSWNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNSWNeg(B, V, buf)
|
||||
llvm::LLVMBuildNSWNeg(B(cx), V, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn NUWNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNUWNeg(B, V, buf)
|
||||
llvm::LLVMBuildNUWNeg(B(cx), V, buf)
|
||||
});
|
||||
}
|
||||
fn FNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFNeg(B, V, buf)
|
||||
llvm::LLVMBuildFNeg(B(cx), V, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Not(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildNot(B, V, buf)
|
||||
llvm::LLVMBuildNot(B(cx), V, buf)
|
||||
});
|
||||
}
|
||||
|
||||
/* Memory */
|
||||
fn Malloc(cx: &@block_ctxt, Ty: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildMalloc(B, Ty, buf)
|
||||
llvm::LLVMBuildMalloc(B(cx), Ty, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn ArrayMalloc(cx: &@block_ctxt, Ty: TypeRef, Val: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildArrayMalloc(B, Ty, Val, buf)
|
||||
llvm::LLVMBuildArrayMalloc(B(cx), Ty, Val, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Alloca(cx: &@block_ctxt, Ty: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildAlloca(B, Ty, buf)
|
||||
llvm::LLVMBuildAlloca(B(cx), Ty, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn ArrayAlloca(cx: &@block_ctxt, Ty: TypeRef, Val: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildArrayAlloca(B, Ty, Val, buf)
|
||||
llvm::LLVMBuildArrayAlloca(B(cx), Ty, Val, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Free(cx: &@block_ctxt, PointerVal: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFree(B, PointerVal);
|
||||
ret llvm::LLVMBuildFree(B(cx), PointerVal);
|
||||
}
|
||||
|
||||
fn Load(cx: &@block_ctxt, PointerVal: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildLoad(B, PointerVal, buf)
|
||||
llvm::LLVMBuildLoad(B(cx), PointerVal, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Store(cx: &@block_ctxt, Val: ValueRef, Ptr: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildStore(B, Val, Ptr);
|
||||
ret llvm::LLVMBuildStore(B(cx), Val, Ptr);
|
||||
}
|
||||
|
||||
fn GEP(cx: &@block_ctxt, Pointer: ValueRef,
|
||||
Indices: &[ValueRef]) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildGEP(B, Pointer, vec::to_ptr(Indices),
|
||||
llvm::LLVMBuildGEP(B(cx), Pointer, vec::to_ptr(Indices),
|
||||
vec::len(Indices), buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn InBoundsGEP(cx: &@block_ctxt, Pointer: ValueRef,
|
||||
Indices: &[ValueRef]) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildInBoundsGEP(B, Pointer, vec::to_ptr(Indices),
|
||||
llvm::LLVMBuildInBoundsGEP(B(cx), Pointer, vec::to_ptr(Indices),
|
||||
vec::len(Indices), buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn StructGEP(cx: &@block_ctxt, Pointer: ValueRef, Idx: uint) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildStructGEP(B, Pointer, Idx, buf)
|
||||
llvm::LLVMBuildStructGEP(B(cx), Pointer, Idx, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn GlobalString(cx: &@block_ctxt, _Str: sbuf) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildGlobalString(B, _Str, buf)
|
||||
llvm::LLVMBuildGlobalString(B(cx), _Str, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn GlobalStringPtr(cx: &@block_ctxt, _Str: sbuf) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildGlobalStringPtr(B, _Str, buf)
|
||||
llvm::LLVMBuildGlobalStringPtr(B(cx), _Str, buf)
|
||||
});
|
||||
}
|
||||
|
||||
/* Casts */
|
||||
fn Trunc(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildTrunc(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildTrunc(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn ZExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildZExt(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildZExt(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn SExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildSExt(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildSExt(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FPToUI(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFPToUI(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildFPToUI(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FPToSI(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFPToSI(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildFPToSI(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn UIToFP(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildUIToFP(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildUIToFP(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn SIToFP(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildSIToFP(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildSIToFP(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FPTrunc(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFPTrunc(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildFPTrunc(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FPExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFPExt(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildFPExt(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn PtrToInt(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildPtrToInt(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildPtrToInt(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn IntToPtr(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildIntToPtr(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildIntToPtr(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn BitCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildBitCast(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildBitCast(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn ZExtOrBitCast(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildZExtOrBitCast(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildZExtOrBitCast(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn SExtOrBitCast(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildSExtOrBitCast(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildSExtOrBitCast(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn TruncOrBitCast(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildTruncOrBitCast(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildTruncOrBitCast(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Cast(cx: &@block_ctxt, Op: Opcode, Val: ValueRef,
|
||||
DestTy: TypeRef, _Name: sbuf) ->
|
||||
ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildCast(B, Op, Val, DestTy, buf)
|
||||
llvm::LLVMBuildCast(B(cx), Op, Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn PointerCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildPointerCast(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildPointerCast(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn IntCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildIntCast(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildIntCast(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FPCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFPCast(B, Val, DestTy, buf)
|
||||
llvm::LLVMBuildFPCast(B(cx), Val, DestTy, buf)
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -595,19 +459,15 @@ fn FPCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
|||
/* Comparisons */
|
||||
fn ICmp(cx: &@block_ctxt, Op: uint, LHS: ValueRef,
|
||||
RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildICmp(B, Op, LHS, RHS, buf)
|
||||
llvm::LLVMBuildICmp(B(cx), Op, LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FCmp(cx: &@block_ctxt, Op: uint, LHS: ValueRef,
|
||||
RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildFCmp(B, Op, LHS, RHS, buf)
|
||||
llvm::LLVMBuildFCmp(B(cx), Op, LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -615,10 +475,8 @@ fn FCmp(cx: &@block_ctxt, Op: uint, LHS: ValueRef,
|
|||
/* Miscellaneous instructions */
|
||||
fn Phi(cx: &@block_ctxt, Ty: TypeRef, vals: &[ValueRef],
|
||||
bbs: &[BasicBlockRef]) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
let phi = istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildPhi(B, Ty, buf)
|
||||
llvm::LLVMBuildPhi(B(cx), Ty, buf)
|
||||
});
|
||||
assert (vec::len::<ValueRef>(vals) == vec::len::<BasicBlockRef>(bbs));
|
||||
llvm::LLVMAddIncoming(phi, vec::to_ptr(vals), vec::to_ptr(bbs),
|
||||
|
@ -633,19 +491,15 @@ fn AddIncomingToPhi(phi: ValueRef, vals: &[ValueRef], bbs: &[BasicBlockRef]) {
|
|||
}
|
||||
|
||||
fn Call(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef]) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args),
|
||||
llvm::LLVMBuildCall(B(cx), Fn, vec::to_ptr(Args),
|
||||
vec::len(Args), buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn FastCall(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef]) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
let v = istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args), buf)
|
||||
llvm::LLVMBuildCall(B(cx), Fn, vec::to_ptr(Args), vec::len(Args), buf)
|
||||
});
|
||||
llvm::LLVMSetInstructionCallConv(v, lib::llvm::LLVMFastCallConv);
|
||||
ret v;
|
||||
|
@ -653,10 +507,8 @@ fn FastCall(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef]) -> ValueRef {
|
|||
|
||||
fn CallWithConv(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef],
|
||||
Conv: uint) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
let v = istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args), buf)
|
||||
llvm::LLVMBuildCall(B(cx), Fn, vec::to_ptr(Args), vec::len(Args), buf)
|
||||
});
|
||||
llvm::LLVMSetInstructionCallConv(v, Conv);
|
||||
ret v;
|
||||
|
@ -664,94 +516,73 @@ fn CallWithConv(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef],
|
|||
|
||||
fn Select(cx: &@block_ctxt, If: ValueRef, Then: ValueRef,
|
||||
Else: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildSelect(B, If, Then, Else, buf)
|
||||
llvm::LLVMBuildSelect(B(cx), If, Then, Else, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn VAArg(cx: &@block_ctxt, list: ValueRef, Ty: TypeRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildVAArg(B, list, Ty, buf)
|
||||
llvm::LLVMBuildVAArg(B(cx), list, Ty, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn ExtractElement(cx: &@block_ctxt, VecVal: ValueRef,
|
||||
Index: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildExtractElement(B, VecVal, Index, buf)
|
||||
llvm::LLVMBuildExtractElement(B(cx), VecVal, Index, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn InsertElement(cx: &@block_ctxt, VecVal: ValueRef, EltVal: ValueRef,
|
||||
Index: ValueRef) ->
|
||||
ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildInsertElement(B, VecVal, EltVal, Index, buf)
|
||||
llvm::LLVMBuildInsertElement(B(cx), VecVal, EltVal, Index, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn ShuffleVector(cx: &@block_ctxt, V1: ValueRef, V2: ValueRef,
|
||||
Mask: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildShuffleVector(B, V1, V2, Mask, buf)
|
||||
llvm::LLVMBuildShuffleVector(B(cx), V1, V2, Mask, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn ExtractValue(cx: &@block_ctxt, AggVal: ValueRef, Index: uint) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildExtractValue(B, AggVal, Index, buf)
|
||||
llvm::LLVMBuildExtractValue(B(cx), AggVal, Index, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn InsertValue(cx: &@block_ctxt, AggVal: ValueRef,
|
||||
EltVal: ValueRef, Index: uint) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildInsertValue(B, AggVal, EltVal, Index, buf)
|
||||
llvm::LLVMBuildInsertValue(B(cx), AggVal, EltVal, Index, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn IsNull(cx: &@block_ctxt, Val: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildIsNull(B, Val, buf)
|
||||
llvm::LLVMBuildIsNull(B(cx), Val, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn IsNotNull(cx: &@block_ctxt, Val: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildIsNotNull(B, Val, buf)
|
||||
llvm::LLVMBuildIsNotNull(B(cx), Val, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn PtrDiff(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildPtrDiff(B, LHS, RHS, buf)
|
||||
llvm::LLVMBuildPtrDiff(B(cx), LHS, RHS, buf)
|
||||
});
|
||||
}
|
||||
|
||||
fn Trap(cx: &@block_ctxt) -> ValueRef {
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
let BB: BasicBlockRef = llvm::LLVMGetInsertBlock(B);
|
||||
let b = B(cx);
|
||||
let BB: BasicBlockRef = llvm::LLVMGetInsertBlock(b);
|
||||
let FN: ValueRef = llvm::LLVMGetBasicBlockParent(BB);
|
||||
let M: ModuleRef = llvm::LLVMGetGlobalParent(FN);
|
||||
let T: ValueRef = istr::as_buf(~"llvm.trap", { |buf|
|
||||
|
@ -760,7 +591,7 @@ fn Trap(cx: &@block_ctxt) -> ValueRef {
|
|||
assert (T as int != 0);
|
||||
let Args: [ValueRef] = [];
|
||||
ret istr::as_buf(~"", { |buf|
|
||||
llvm::LLVMBuildCall(B, T, vec::to_ptr(Args), vec::len(Args), buf)
|
||||
llvm::LLVMBuildCall(b, T, vec::to_ptr(Args), vec::len(Args), buf)
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -397,29 +397,21 @@ type block_ctxt =
|
|||
// llvm::LLVMAppendBasicBlock(llfn, name), which adds a basic
|
||||
// block to the function pointed to by llfn. We insert
|
||||
// instructions into that block by way of this block context.
|
||||
|
||||
// The llvm::builder object serving as an interface to LLVM's
|
||||
// LLVMBuild* functions.
|
||||
|
||||
// The block pointing to this one in the function's digraph.
|
||||
|
||||
// The 'kind' of basic block this is.
|
||||
|
||||
// A list of functions that run at the end of translating this
|
||||
// block, cleaning up any variables that were introduced in the
|
||||
// block and need to go out of scope at the end of it.
|
||||
|
||||
// The source span where this block comes from, for error
|
||||
// reporting.
|
||||
|
||||
// The function context for the function to which this block is
|
||||
// attached.
|
||||
{llbb: BasicBlockRef,
|
||||
mutable terminated: bool,
|
||||
// The block pointing to this one in the function's digraph.
|
||||
parent: block_parent,
|
||||
// The 'kind' of basic block this is.
|
||||
kind: block_kind,
|
||||
// A list of functions that run at the end of translating this
|
||||
// block, cleaning up any variables that were introduced in the
|
||||
// block and need to go out of scope at the end of it.
|
||||
mutable cleanups: [cleanup],
|
||||
// The source span where this block comes from, for error
|
||||
// reporting. FIXME this is not currently reliable
|
||||
sp: span,
|
||||
// The function context for the function to which this block is
|
||||
// attached.
|
||||
fcx: @fn_ctxt};
|
||||
|
||||
fn is_terminated(cx: &@block_ctxt) -> bool {
|
||||
|
|
Loading…
Reference in a new issue