From 61392f9f8295bc770487389d3240caed13bfd3d0 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Tue, 30 Aug 2011 14:02:20 +0200 Subject: [PATCH] Clean up trans_build, factor repeated code into function --- src/comp/middle/trans_build.rs | 361 +++++++++----------------------- src/comp/middle/trans_common.rs | 26 +-- 2 files changed, 105 insertions(+), 282 deletions(-) diff --git a/src/comp/middle/trans_build.rs b/src/comp/middle/trans_build.rs index 604fd20f5286..97904e9cbf57 100644 --- a/src/comp/middle/trans_build.rs +++ b/src/comp/middle/trans_build.rs @@ -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::(vals) == vec::len::(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) }); } diff --git a/src/comp/middle/trans_common.rs b/src/comp/middle/trans_common.rs index 87dd8f6c97d7..fc211b1dfaa1 100644 --- a/src/comp/middle/trans_common.rs +++ b/src/comp/middle/trans_common.rs @@ -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 {