Use a single builder object throughout
This seems to be faster than creating separate ones for each block context.
This commit is contained in:
parent
b9112525ba
commit
15b540ded4
@ -4889,7 +4889,6 @@ fn new_block_ctxt(cx: &@fn_ctxt, parent: &block_parent, kind: block_kind,
|
||||
let llbb: BasicBlockRef = llvm::LLVMAppendBasicBlock(cx.llfn, s);
|
||||
ret @{llbb: llbb,
|
||||
mutable terminated: false,
|
||||
build: bld::BuilderRef_res(bld::mk_builder(llbb)),
|
||||
parent: parent,
|
||||
kind: kind,
|
||||
mutable cleanups: [],
|
||||
@ -4925,7 +4924,6 @@ fn new_sub_block_ctxt(bcx: &@block_ctxt, n: &str) -> @block_ctxt {
|
||||
fn new_raw_block_ctxt(fcx: &@fn_ctxt, llbb: BasicBlockRef) -> @block_ctxt {
|
||||
ret @{llbb: llbb,
|
||||
mutable terminated: false,
|
||||
build: bld::BuilderRef_res(bld::mk_builder(llbb)),
|
||||
parent: parent_none,
|
||||
kind: NON_SCOPE_BLOCK,
|
||||
mutable cleanups: [],
|
||||
@ -4992,7 +4990,6 @@ iter block_locals(b: &ast::blk) -> @ast::local {
|
||||
fn llstaticallocas_block_ctxt(fcx: &@fn_ctxt) -> @block_ctxt {
|
||||
ret @{llbb: fcx.llstaticallocas,
|
||||
mutable terminated: false,
|
||||
build: bld::BuilderRef_res(bld::mk_builder(fcx.llstaticallocas)),
|
||||
parent: parent_none,
|
||||
kind: SCOPE_BLOCK,
|
||||
mutable cleanups: [],
|
||||
@ -5003,7 +5000,6 @@ fn llstaticallocas_block_ctxt(fcx: &@fn_ctxt) -> @block_ctxt {
|
||||
fn llderivedtydescs_block_ctxt(fcx: &@fn_ctxt) -> @block_ctxt {
|
||||
ret @{llbb: fcx.llderivedtydescs,
|
||||
mutable terminated: false,
|
||||
build: bld::BuilderRef_res(bld::mk_builder(fcx.llderivedtydescs)),
|
||||
parent: parent_none,
|
||||
kind: SCOPE_BLOCK,
|
||||
mutable cleanups: [],
|
||||
@ -6210,15 +6206,6 @@ fn decl_no_op_type_glue(llmod: ModuleRef, taskptr_type: TypeRef) -> ValueRef {
|
||||
ret decl_fastcall_fn(llmod, abi::no_op_type_glue_name(), ty);
|
||||
}
|
||||
|
||||
fn make_no_op_type_glue(fun: ValueRef) {
|
||||
let bb_name = str::buf("_rust_no_op_type_glue_bb");
|
||||
let llbb = llvm::LLVMAppendBasicBlock(fun, bb_name);
|
||||
let llbuild = llvm::LLVMCreateBuilder();
|
||||
llvm::LLVMPositionBuilderAtEnd(llbuild, llbb);
|
||||
llvm::LLVMBuildRetVoid(llbuild);
|
||||
llvm::LLVMDisposeBuilder(llbuild);
|
||||
}
|
||||
|
||||
fn vec_fill(bcx: &@block_ctxt, v: ValueRef) -> ValueRef {
|
||||
ret bld::Load(bcx, bld::GEP(bcx, v,
|
||||
[C_int(0), C_int(abi::vec_elt_fill)]));
|
||||
@ -6397,6 +6384,7 @@ fn trans_crate(sess: &session::session, crate: &@ast::crate, tcx: &ty::ctxt,
|
||||
rust_object_type: T_rust_object(),
|
||||
tydesc_type: tydesc_type,
|
||||
task_type: task_type,
|
||||
builder: BuilderRef_res(llvm::LLVMCreateBuilder()),
|
||||
shape_cx: shape::mk_ctxt(llmod),
|
||||
gc_cx: gc::mk_ctxt()};
|
||||
let cx = new_local_ctxt(ccx);
|
||||
|
@ -5,354 +5,492 @@ import llvm::{ValueRef, TypeRef, BasicBlockRef, BuilderRef,
|
||||
Opcode, ModuleRef};
|
||||
import trans_common::block_ctxt;
|
||||
|
||||
resource BuilderRef_res(B: llvm::BuilderRef) {
|
||||
llvm::LLVMDisposeBuilder(B);
|
||||
}
|
||||
|
||||
fn mk_builder(llbb: BasicBlockRef) -> BuilderRef {
|
||||
let B = llvm::LLVMCreateBuilder();
|
||||
llvm::LLVMPositionBuilderAtEnd(B, llbb);
|
||||
ret B;
|
||||
}
|
||||
|
||||
fn RetVoid(cx: &@block_ctxt) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
ret llvm::LLVMBuildRetVoid(*cx.build);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildRetVoid(B);
|
||||
}
|
||||
|
||||
fn Ret(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
ret llvm::LLVMBuildRet(*cx.build, V);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildRet(B, V);
|
||||
}
|
||||
|
||||
fn AggregateRet(cx: &@block_ctxt, RetVals: &[ValueRef]) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
ret llvm::LLVMBuildAggregateRet(*cx.build, vec::to_ptr(RetVals),
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildAggregateRet(B, vec::to_ptr(RetVals),
|
||||
vec::len(RetVals));
|
||||
}
|
||||
|
||||
fn Br(cx: &@block_ctxt, Dest: BasicBlockRef) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
ret llvm::LLVMBuildBr(*cx.build, Dest);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildBr(B, Dest);
|
||||
}
|
||||
|
||||
fn CondBr(cx: &@block_ctxt, If: ValueRef, Then: BasicBlockRef,
|
||||
Else: BasicBlockRef) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
ret llvm::LLVMBuildCondBr(*cx.build, If, Then, Else);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildCondBr(B, If, Then, Else);
|
||||
}
|
||||
|
||||
fn Switch(cx: &@block_ctxt, V: ValueRef, Else: BasicBlockRef,
|
||||
NumCases: uint) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
ret llvm::LLVMBuildSwitch(*cx.build, V, Else, NumCases);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildSwitch(B, V, Else, NumCases);
|
||||
}
|
||||
|
||||
fn IndirectBr(cx: &@block_ctxt, Addr: ValueRef,
|
||||
NumDests: uint) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
ret llvm::LLVMBuildIndirectBr(*cx.build, Addr, NumDests);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildIndirectBr(B, Addr, NumDests);
|
||||
}
|
||||
|
||||
fn Invoke(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef],
|
||||
Then: BasicBlockRef, Catch: BasicBlockRef) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
ret llvm::LLVMBuildInvoke(*cx.build, Fn, vec::to_ptr(Args),
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildInvoke(B, Fn, vec::to_ptr(Args),
|
||||
vec::len(Args), Then, Catch, str::buf(""));
|
||||
}
|
||||
|
||||
fn Unreachable(cx: &@block_ctxt) -> ValueRef {
|
||||
assert (!cx.terminated);;
|
||||
cx.terminated = true;
|
||||
ret llvm::LLVMBuildUnreachable(*cx.build);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildUnreachable(B);
|
||||
}
|
||||
|
||||
/* Arithmetic */
|
||||
fn Add(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildAdd(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildAdd(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn NSWAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNSWAdd(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNSWAdd(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn NUWAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNUWAdd(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNUWAdd(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn FAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFAdd(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFAdd(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn Sub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildSub(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildSub(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn NSWSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNSWSub(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNSWSub(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn NUWSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNUWSub(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNUWSub(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn FSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFSub(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFSub(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn Mul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildMul(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildMul(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn NSWMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNSWMul(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNSWMul(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn NUWMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNUWMul(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNUWMul(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn FMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFMul(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFMul(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn UDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildUDiv(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildUDiv(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn SDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildSDiv(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildSDiv(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn ExactSDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildExactSDiv(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildExactSDiv(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn FDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFDiv(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFDiv(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn URem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildURem(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildURem(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn SRem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildSRem(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildSRem(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn FRem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFRem(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFRem(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn Shl(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildShl(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildShl(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn LShr(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildLShr(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildLShr(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn AShr(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildAShr(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildAShr(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn And(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildAnd(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildAnd(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn Or(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildOr(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildOr(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn Xor(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildXor(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildXor(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn BinOp(cx: &@block_ctxt, Op: Opcode, LHS: ValueRef,
|
||||
RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildBinOp(*cx.build, Op, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildBinOp(B, Op, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn Neg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNeg(*cx.build, V, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNeg(B, V, str::buf(""));
|
||||
}
|
||||
|
||||
fn NSWNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNSWNeg(*cx.build, V, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNSWNeg(B, V, str::buf(""));
|
||||
}
|
||||
|
||||
fn NUWNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNUWNeg(*cx.build, V, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNUWNeg(B, V, str::buf(""));
|
||||
}
|
||||
fn FNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFNeg(*cx.build, V, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFNeg(B, V, str::buf(""));
|
||||
}
|
||||
fn Not(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildNot(*cx.build, V, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildNot(B, V, str::buf(""));
|
||||
}
|
||||
|
||||
/* Memory */
|
||||
fn Malloc(cx: &@block_ctxt, Ty: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildMalloc(*cx.build, Ty, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildMalloc(B, Ty, str::buf(""));
|
||||
}
|
||||
|
||||
fn ArrayMalloc(cx: &@block_ctxt, Ty: TypeRef, Val: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildArrayMalloc(*cx.build, Ty, Val, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildArrayMalloc(B, Ty, Val, str::buf(""));
|
||||
}
|
||||
|
||||
fn Alloca(cx: &@block_ctxt, Ty: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildAlloca(*cx.build, Ty, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildAlloca(B, Ty, str::buf(""));
|
||||
}
|
||||
|
||||
fn ArrayAlloca(cx: &@block_ctxt, Ty: TypeRef, Val: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildArrayAlloca(*cx.build, Ty, Val, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildArrayAlloca(B, Ty, Val, str::buf(""));
|
||||
}
|
||||
|
||||
fn Free(cx: &@block_ctxt, PointerVal: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFree(*cx.build, PointerVal);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFree(B, PointerVal);
|
||||
}
|
||||
|
||||
fn Load(cx: &@block_ctxt, PointerVal: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildLoad(*cx.build, PointerVal, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildLoad(B, PointerVal, str::buf(""));
|
||||
}
|
||||
|
||||
fn Store(cx: &@block_ctxt, Val: ValueRef, Ptr: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildStore(*cx.build, Val, Ptr);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildStore(B, Val, Ptr);
|
||||
}
|
||||
|
||||
fn GEP(cx: &@block_ctxt, Pointer: ValueRef,
|
||||
Indices: &[ValueRef]) -> ValueRef {
|
||||
ret llvm::LLVMBuildGEP(*cx.build, Pointer, vec::to_ptr(Indices),
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildGEP(B, Pointer, vec::to_ptr(Indices),
|
||||
vec::len(Indices), str::buf(""));
|
||||
}
|
||||
|
||||
fn InBoundsGEP(cx: &@block_ctxt, Pointer: ValueRef,
|
||||
Indices: &[ValueRef]) -> ValueRef {
|
||||
ret llvm::LLVMBuildInBoundsGEP(*cx.build, Pointer, vec::to_ptr(Indices),
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildInBoundsGEP(B, Pointer, vec::to_ptr(Indices),
|
||||
vec::len(Indices), str::buf(""));
|
||||
}
|
||||
|
||||
fn StructGEP(cx: &@block_ctxt, Pointer: ValueRef, Idx: uint) -> ValueRef {
|
||||
ret llvm::LLVMBuildStructGEP(*cx.build, Pointer, Idx, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildStructGEP(B, Pointer, Idx, str::buf(""));
|
||||
}
|
||||
|
||||
fn GlobalString(cx: &@block_ctxt, _Str: sbuf) -> ValueRef {
|
||||
ret llvm::LLVMBuildGlobalString(*cx.build, _Str, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildGlobalString(B, _Str, str::buf(""));
|
||||
}
|
||||
|
||||
fn GlobalStringPtr(cx: &@block_ctxt, _Str: sbuf) -> ValueRef {
|
||||
ret llvm::LLVMBuildGlobalStringPtr(*cx.build, _Str, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildGlobalStringPtr(B, _Str, str::buf(""));
|
||||
}
|
||||
|
||||
/* Casts */
|
||||
fn Trunc(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildTrunc(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildTrunc(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn ZExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildZExt(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildZExt(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn SExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildSExt(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildSExt(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn FPToUI(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFPToUI(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFPToUI(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn FPToSI(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFPToSI(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFPToSI(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn UIToFP(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildUIToFP(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildUIToFP(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn SIToFP(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildSIToFP(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildSIToFP(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn FPTrunc(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFPTrunc(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFPTrunc(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn FPExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFPExt(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFPExt(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn PtrToInt(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildPtrToInt(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildPtrToInt(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn IntToPtr(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildIntToPtr(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildIntToPtr(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn BitCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildBitCast(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildBitCast(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn ZExtOrBitCast(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildZExtOrBitCast(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildZExtOrBitCast(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn SExtOrBitCast(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildSExtOrBitCast(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildSExtOrBitCast(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn TruncOrBitCast(cx: &@block_ctxt, Val: ValueRef,
|
||||
DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildTruncOrBitCast(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildTruncOrBitCast(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn Cast(cx: &@block_ctxt, Op: Opcode, Val: ValueRef,
|
||||
DestTy: TypeRef, _Name: sbuf) ->
|
||||
ValueRef {
|
||||
ret llvm::LLVMBuildCast(*cx.build, Op, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildCast(B, Op, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn PointerCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildPointerCast(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildPointerCast(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn IntCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildIntCast(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildIntCast(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
fn FPCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFPCast(*cx.build, Val, DestTy, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFPCast(B, Val, DestTy, str::buf(""));
|
||||
}
|
||||
|
||||
|
||||
/* Comparisons */
|
||||
fn ICmp(cx: &@block_ctxt, Op: uint, LHS: ValueRef,
|
||||
RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildICmp(*cx.build, Op, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildICmp(B, Op, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn FCmp(cx: &@block_ctxt, Op: uint, LHS: ValueRef,
|
||||
RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildFCmp(*cx.build, Op, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildFCmp(B, Op, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
|
||||
/* Miscellaneous instructions */
|
||||
fn Phi(cx: &@block_ctxt, Ty: TypeRef, vals: &[ValueRef],
|
||||
bbs: &[BasicBlockRef]) -> ValueRef {
|
||||
let phi = llvm::LLVMBuildPhi(*cx.build, Ty, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
let phi = llvm::LLVMBuildPhi(B, Ty, str::buf(""));
|
||||
assert (vec::len::<ValueRef>(vals) == vec::len::<BasicBlockRef>(bbs));
|
||||
llvm::LLVMAddIncoming(phi, vec::to_ptr(vals), vec::to_ptr(bbs),
|
||||
vec::len(vals));
|
||||
@ -366,13 +504,17 @@ fn AddIncomingToPhi(phi: ValueRef, vals: &[ValueRef], bbs: &[BasicBlockRef]) {
|
||||
}
|
||||
|
||||
fn Call(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef]) -> ValueRef {
|
||||
ret llvm::LLVMBuildCall(*cx.build, Fn, vec::to_ptr(Args), vec::len(Args),
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args),
|
||||
str::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 =
|
||||
llvm::LLVMBuildCall(*cx.build, Fn, vec::to_ptr(Args), vec::len(Args),
|
||||
llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args),
|
||||
str::buf(""));
|
||||
llvm::LLVMSetInstructionCallConv(v, lib::llvm::LLVMFastCallConv);
|
||||
ret v;
|
||||
@ -380,8 +522,10 @@ 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 =
|
||||
llvm::LLVMBuildCall(*cx.build, Fn, vec::to_ptr(Args), vec::len(Args),
|
||||
llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args),
|
||||
str::buf(""));
|
||||
llvm::LLVMSetInstructionCallConv(v, Conv);
|
||||
ret v;
|
||||
@ -389,61 +533,83 @@ fn CallWithConv(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef],
|
||||
|
||||
fn Select(cx: &@block_ctxt, If: ValueRef, Then: ValueRef,
|
||||
Else: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildSelect(*cx.build, If, Then, Else, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildSelect(B, If, Then, Else, str::buf(""));
|
||||
}
|
||||
|
||||
fn VAArg(cx: &@block_ctxt, list: ValueRef, Ty: TypeRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildVAArg(*cx.build, list, Ty, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildVAArg(B, list, Ty, str::buf(""));
|
||||
}
|
||||
|
||||
fn ExtractElement(cx: &@block_ctxt, VecVal: ValueRef,
|
||||
Index: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildExtractElement(*cx.build, VecVal, Index, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildExtractElement(B, VecVal, Index, str::buf(""));
|
||||
}
|
||||
|
||||
fn InsertElement(cx: &@block_ctxt, VecVal: ValueRef, EltVal: ValueRef,
|
||||
Index: ValueRef) ->
|
||||
ValueRef {
|
||||
ret llvm::LLVMBuildInsertElement(*cx.build, VecVal, EltVal, Index,
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildInsertElement(B, VecVal, EltVal, Index,
|
||||
str::buf(""));
|
||||
}
|
||||
|
||||
fn ShuffleVector(cx: &@block_ctxt, V1: ValueRef, V2: ValueRef,
|
||||
Mask: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildShuffleVector(*cx.build, V1, V2, Mask, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildShuffleVector(B, V1, V2, Mask, str::buf(""));
|
||||
}
|
||||
|
||||
fn ExtractValue(cx: &@block_ctxt, AggVal: ValueRef, Index: uint) -> ValueRef {
|
||||
ret llvm::LLVMBuildExtractValue(*cx.build, AggVal, Index, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildExtractValue(B, AggVal, Index, str::buf(""));
|
||||
}
|
||||
|
||||
fn InsertValue(cx: &@block_ctxt, AggVal: ValueRef,
|
||||
EltVal: ValueRef, Index: uint) -> ValueRef {
|
||||
ret llvm::LLVMBuildInsertValue(*cx.build, AggVal, EltVal, Index,
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildInsertValue(B, AggVal, EltVal, Index,
|
||||
str::buf(""));
|
||||
}
|
||||
|
||||
fn IsNull(cx: &@block_ctxt, Val: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildIsNull(*cx.build, Val, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildIsNull(B, Val, str::buf(""));
|
||||
}
|
||||
|
||||
fn IsNotNull(cx: &@block_ctxt, Val: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildIsNotNull(*cx.build, Val, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildIsNotNull(B, Val, str::buf(""));
|
||||
}
|
||||
|
||||
fn PtrDiff(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
|
||||
ret llvm::LLVMBuildPtrDiff(*cx.build, LHS, RHS, str::buf(""));
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
ret llvm::LLVMBuildPtrDiff(B, LHS, RHS, str::buf(""));
|
||||
}
|
||||
|
||||
fn Trap(cx: &@block_ctxt) -> ValueRef {
|
||||
let BB: BasicBlockRef = llvm::LLVMGetInsertBlock(*cx.build);
|
||||
let B = *cx.fcx.lcx.ccx.builder;
|
||||
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
|
||||
let BB: BasicBlockRef = llvm::LLVMGetInsertBlock(B);
|
||||
let FN: ValueRef = llvm::LLVMGetBasicBlockParent(BB);
|
||||
let M: ModuleRef = llvm::LLVMGetGlobalParent(FN);
|
||||
let T: ValueRef =
|
||||
llvm::LLVMGetNamedFunction(M, str::buf("llvm.trap"));
|
||||
assert (T as int != 0);
|
||||
let Args: [ValueRef] = [];
|
||||
ret llvm::LLVMBuildCall(*cx.build, T, vec::to_ptr(Args), vec::len(Args),
|
||||
ret llvm::LLVMBuildCall(B, T, vec::to_ptr(Args), vec::len(Args),
|
||||
str::buf(""));
|
||||
}
|
||||
|
||||
|
@ -111,6 +111,10 @@ type stats =
|
||||
mutable n_real_glues: uint,
|
||||
fn_times: @mutable [{ident: str, time: int}]};
|
||||
|
||||
resource BuilderRef_res(B: llvm::BuilderRef) {
|
||||
llvm::LLVMDisposeBuilder(B);
|
||||
}
|
||||
|
||||
// Crate context. Every crate we compile has one of these.
|
||||
type crate_ctxt =
|
||||
// A mapping from the def_id of each item in this crate to the address
|
||||
@ -149,6 +153,7 @@ type crate_ctxt =
|
||||
rust_object_type: TypeRef,
|
||||
tydesc_type: TypeRef,
|
||||
task_type: TypeRef,
|
||||
builder: BuilderRef_res,
|
||||
shape_cx: shape::ctxt,
|
||||
gc_cx: gc::ctxt};
|
||||
|
||||
@ -401,7 +406,6 @@ type block_ctxt =
|
||||
// attached.
|
||||
{llbb: BasicBlockRef,
|
||||
mutable terminated: bool,
|
||||
build: bld::BuilderRef_res,
|
||||
parent: block_parent,
|
||||
kind: block_kind,
|
||||
mutable cleanups: [cleanup],
|
||||
|
Loading…
x
Reference in New Issue
Block a user