rustc_codegen_llvm: fix ownership of Builder.

This commit is contained in:
Irina Popa 2018-07-17 18:33:09 +03:00
parent 265f2fa4de
commit 54c98ab0dd
2 changed files with 105 additions and 96 deletions

View file

@ -27,14 +27,14 @@ use std::ptr;
// All Builders must have an llfn associated with them
#[must_use]
pub struct Builder<'a, 'll: 'a, 'tcx: 'll> {
pub llbuilder: &'ll llvm::Builder,
pub llbuilder: &'ll mut llvm::Builder<'ll>,
pub cx: &'a CodegenCx<'ll, 'tcx>,
}
impl Drop for Builder<'a, 'll, 'tcx> {
fn drop(&mut self) {
unsafe {
llvm::LLVMDisposeBuilder(self.llbuilder);
llvm::LLVMDisposeBuilder(&mut *(self.llbuilder as *mut _));
}
}
}

View file

@ -395,7 +395,8 @@ extern { pub type Type; }
extern { pub type Value; }
extern { pub type Metadata; }
extern { pub type BasicBlock; }
extern { pub type Builder; }
#[repr(C)]
pub struct Builder<'a>(InvariantOpaque<'a>);
extern { pub type MemoryBuffer; }
#[repr(C)]
pub struct PassManager<'a>(InvariantOpaque<'a>);
@ -682,31 +683,31 @@ extern "C" {
Count: c_uint);
// Instruction builders
pub fn LLVMCreateBuilderInContext(C: &Context) -> &Builder;
pub fn LLVMPositionBuilderAtEnd(Builder: &'a Builder, Block: &'a BasicBlock);
pub fn LLVMGetInsertBlock(Builder: &Builder) -> &BasicBlock;
pub fn LLVMDisposeBuilder(Builder: &Builder);
pub fn LLVMCreateBuilderInContext(C: &'a Context) -> &'a mut Builder<'a>;
pub fn LLVMPositionBuilderAtEnd(Builder: &Builder<'a>, Block: &'a BasicBlock);
pub fn LLVMGetInsertBlock(Builder: &Builder<'a>) -> &'a BasicBlock;
pub fn LLVMDisposeBuilder(Builder: &'a mut Builder<'a>);
// Metadata
pub fn LLVMSetCurrentDebugLocation(Builder: &'a Builder, L: Option<&'a Value>);
pub fn LLVMGetCurrentDebugLocation(Builder: &Builder) -> &Value;
pub fn LLVMSetInstDebugLocation(Builder: &'a Builder, Inst: &'a Value);
pub fn LLVMSetCurrentDebugLocation(Builder: &Builder<'a>, L: Option<&'a Value>);
pub fn LLVMGetCurrentDebugLocation(Builder: &Builder<'a>) -> &'a Value;
pub fn LLVMSetInstDebugLocation(Builder: &Builder<'a>, Inst: &'a Value);
// Terminators
pub fn LLVMBuildRetVoid(B: &Builder) -> &Value;
pub fn LLVMBuildRet(B: &'a Builder, V: &'a Value) -> &'a Value;
pub fn LLVMBuildBr(B: &'a Builder, Dest: &'a BasicBlock) -> &'a Value;
pub fn LLVMBuildCondBr(B: &'a Builder,
pub fn LLVMBuildRetVoid(B: &Builder<'a>) -> &'a Value;
pub fn LLVMBuildRet(B: &Builder<'a>, V: &'a Value) -> &'a Value;
pub fn LLVMBuildBr(B: &Builder<'a>, Dest: &'a BasicBlock) -> &'a Value;
pub fn LLVMBuildCondBr(B: &Builder<'a>,
If: &'a Value,
Then: &'a BasicBlock,
Else: &'a BasicBlock)
-> &'a Value;
pub fn LLVMBuildSwitch(B: &'a Builder,
pub fn LLVMBuildSwitch(B: &Builder<'a>,
V: &'a Value,
Else: &'a BasicBlock,
NumCases: c_uint)
-> &'a Value;
pub fn LLVMRustBuildInvoke(B: &'a Builder,
pub fn LLVMRustBuildInvoke(B: &Builder<'a>,
Fn: &'a Value,
Args: *const &'a Value,
NumArgs: c_uint,
@ -715,37 +716,37 @@ extern "C" {
Bundle: Option<&OperandBundleDef<'a>>,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildLandingPad(B: &'a Builder,
pub fn LLVMBuildLandingPad(B: &Builder<'a>,
Ty: &'a Type,
PersFn: &'a Value,
NumClauses: c_uint,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildResume(B: &'a Builder, Exn: &'a Value) -> &'a Value;
pub fn LLVMBuildUnreachable(B: &Builder) -> &Value;
pub fn LLVMBuildResume(B: &Builder<'a>, Exn: &'a Value) -> &'a Value;
pub fn LLVMBuildUnreachable(B: &Builder<'a>) -> &'a Value;
pub fn LLVMRustBuildCleanupPad(B: &'a Builder,
pub fn LLVMRustBuildCleanupPad(B: &Builder<'a>,
ParentPad: Option<&'a Value>,
ArgCnt: c_uint,
Args: *const &'a Value,
Name: *const c_char)
-> Option<&'a Value>;
pub fn LLVMRustBuildCleanupRet(B: &'a Builder,
pub fn LLVMRustBuildCleanupRet(B: &Builder<'a>,
CleanupPad: &'a Value,
UnwindBB: Option<&'a BasicBlock>)
-> Option<&'a Value>;
pub fn LLVMRustBuildCatchPad(B: &'a Builder,
pub fn LLVMRustBuildCatchPad(B: &Builder<'a>,
ParentPad: &'a Value,
ArgCnt: c_uint,
Args: *const &'a Value,
Name: *const c_char)
-> Option<&'a Value>;
pub fn LLVMRustBuildCatchRet(
B: &'a Builder,
B: &Builder<'a>,
Pad: &'a Value,
BB: &'a BasicBlock,
) -> Option<&'a Value>;
pub fn LLVMRustBuildCatchSwitch(Builder: &'a Builder,
pub fn LLVMRustBuildCatchSwitch(Builder: &Builder<'a>,
ParentPad: Option<&'a Value>,
BB: Option<&'a BasicBlock>,
NumHandlers: c_uint,
@ -764,215 +765,215 @@ extern "C" {
pub fn LLVMSetCleanup(LandingPad: &Value, Val: Bool);
// Arithmetic
pub fn LLVMBuildAdd(B: &'a Builder,
pub fn LLVMBuildAdd(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFAdd(B: &'a Builder,
pub fn LLVMBuildFAdd(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildSub(B: &'a Builder,
pub fn LLVMBuildSub(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFSub(B: &'a Builder,
pub fn LLVMBuildFSub(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildMul(B: &'a Builder,
pub fn LLVMBuildMul(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFMul(B: &'a Builder,
pub fn LLVMBuildFMul(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildUDiv(B: &'a Builder,
pub fn LLVMBuildUDiv(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildExactUDiv(B: &'a Builder,
pub fn LLVMBuildExactUDiv(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildSDiv(B: &'a Builder,
pub fn LLVMBuildSDiv(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildExactSDiv(B: &'a Builder,
pub fn LLVMBuildExactSDiv(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFDiv(B: &'a Builder,
pub fn LLVMBuildFDiv(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildURem(B: &'a Builder,
pub fn LLVMBuildURem(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildSRem(B: &'a Builder,
pub fn LLVMBuildSRem(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFRem(B: &'a Builder,
pub fn LLVMBuildFRem(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildShl(B: &'a Builder,
pub fn LLVMBuildShl(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildLShr(B: &'a Builder,
pub fn LLVMBuildLShr(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildAShr(B: &'a Builder,
pub fn LLVMBuildAShr(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildAnd(B: &'a Builder,
pub fn LLVMBuildAnd(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildOr(B: &'a Builder,
pub fn LLVMBuildOr(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildXor(B: &'a Builder,
pub fn LLVMBuildXor(B: &Builder<'a>,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildNeg(B: &'a Builder, V: &'a Value, Name: *const c_char) -> &'a Value;
pub fn LLVMBuildFNeg(B: &'a Builder, V: &'a Value, Name: *const c_char) -> &'a Value;
pub fn LLVMBuildNot(B: &'a Builder, V: &'a Value, Name: *const c_char) -> &'a Value;
pub fn LLVMBuildNeg(B: &Builder<'a>, V: &'a Value, Name: *const c_char) -> &'a Value;
pub fn LLVMBuildFNeg(B: &Builder<'a>, V: &'a Value, Name: *const c_char) -> &'a Value;
pub fn LLVMBuildNot(B: &Builder<'a>, V: &'a Value, Name: *const c_char) -> &'a Value;
pub fn LLVMRustSetHasUnsafeAlgebra(Instr: &Value);
// Memory
pub fn LLVMBuildAlloca(B: &'a Builder, Ty: &'a Type, Name: *const c_char) -> &'a Value;
pub fn LLVMBuildLoad(B: &'a Builder, PointerVal: &'a Value, Name: *const c_char) -> &'a Value;
pub fn LLVMBuildAlloca(B: &Builder<'a>, Ty: &'a Type, Name: *const c_char) -> &'a Value;
pub fn LLVMBuildLoad(B: &Builder<'a>, PointerVal: &'a Value, Name: *const c_char) -> &'a Value;
pub fn LLVMBuildStore(B: &'a Builder, Val: &'a Value, Ptr: &'a Value) -> &'a Value;
pub fn LLVMBuildStore(B: &Builder<'a>, Val: &'a Value, Ptr: &'a Value) -> &'a Value;
pub fn LLVMBuildGEP(B: &'a Builder,
pub fn LLVMBuildGEP(B: &Builder<'a>,
Pointer: &'a Value,
Indices: *const &'a Value,
NumIndices: c_uint,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildInBoundsGEP(B: &'a Builder,
pub fn LLVMBuildInBoundsGEP(B: &Builder<'a>,
Pointer: &'a Value,
Indices: *const &'a Value,
NumIndices: c_uint,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildStructGEP(B: &'a Builder,
pub fn LLVMBuildStructGEP(B: &Builder<'a>,
Pointer: &'a Value,
Idx: c_uint,
Name: *const c_char)
-> &'a Value;
// Casts
pub fn LLVMBuildTrunc(B: &'a Builder,
pub fn LLVMBuildTrunc(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildZExt(B: &'a Builder,
pub fn LLVMBuildZExt(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildSExt(B: &'a Builder,
pub fn LLVMBuildSExt(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFPToUI(B: &'a Builder,
pub fn LLVMBuildFPToUI(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFPToSI(B: &'a Builder,
pub fn LLVMBuildFPToSI(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildUIToFP(B: &'a Builder,
pub fn LLVMBuildUIToFP(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildSIToFP(B: &'a Builder,
pub fn LLVMBuildSIToFP(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFPTrunc(B: &'a Builder,
pub fn LLVMBuildFPTrunc(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFPExt(B: &'a Builder,
pub fn LLVMBuildFPExt(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildPtrToInt(B: &'a Builder,
pub fn LLVMBuildPtrToInt(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildIntToPtr(B: &'a Builder,
pub fn LLVMBuildIntToPtr(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildBitCast(B: &'a Builder,
pub fn LLVMBuildBitCast(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildPointerCast(B: &'a Builder,
pub fn LLVMBuildPointerCast(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMRustBuildIntCast(B: &'a Builder,
pub fn LLVMRustBuildIntCast(B: &Builder<'a>,
Val: &'a Value,
DestTy: &'a Type,
IsSized: bool)
-> &'a Value;
// Comparisons
pub fn LLVMBuildICmp(B: &'a Builder,
pub fn LLVMBuildICmp(B: &Builder<'a>,
Op: c_uint,
LHS: &'a Value,
RHS: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildFCmp(B: &'a Builder,
pub fn LLVMBuildFCmp(B: &Builder<'a>,
Op: c_uint,
LHS: &'a Value,
RHS: &'a Value,
@ -980,111 +981,119 @@ extern "C" {
-> &'a Value;
// Miscellaneous instructions
pub fn LLVMBuildPhi(B: &'a Builder, Ty: &'a Type, Name: *const c_char) -> &'a Value;
pub fn LLVMRustBuildCall(B: &'a Builder,
pub fn LLVMBuildPhi(B: &Builder<'a>, Ty: &'a Type, Name: *const c_char) -> &'a Value;
pub fn LLVMRustBuildCall(B: &Builder<'a>,
Fn: &'a Value,
Args: *const &'a Value,
NumArgs: c_uint,
Bundle: Option<&OperandBundleDef<'a>>,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildSelect(B: &'a Builder,
pub fn LLVMBuildSelect(B: &Builder<'a>,
If: &'a Value,
Then: &'a Value,
Else: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildVAArg(B: &'a Builder,
pub fn LLVMBuildVAArg(B: &Builder<'a>,
list: &'a Value,
Ty: &'a Type,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildExtractElement(B: &'a Builder,
pub fn LLVMBuildExtractElement(B: &Builder<'a>,
VecVal: &'a Value,
Index: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildInsertElement(B: &'a Builder,
pub fn LLVMBuildInsertElement(B: &Builder<'a>,
VecVal: &'a Value,
EltVal: &'a Value,
Index: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildShuffleVector(B: &'a Builder,
pub fn LLVMBuildShuffleVector(B: &Builder<'a>,
V1: &'a Value,
V2: &'a Value,
Mask: &'a Value,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildExtractValue(B: &'a Builder,
pub fn LLVMBuildExtractValue(B: &Builder<'a>,
AggVal: &'a Value,
Index: c_uint,
Name: *const c_char)
-> &'a Value;
pub fn LLVMBuildInsertValue(B: &'a Builder,
pub fn LLVMBuildInsertValue(B: &Builder<'a>,
AggVal: &'a Value,
EltVal: &'a Value,
Index: c_uint,
Name: *const c_char)
-> &'a Value;
pub fn LLVMRustBuildVectorReduceFAdd(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceFAdd(B: &Builder<'a>,
Acc: &'a Value,
Src: &'a Value)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceFMul(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceFMul(B: &Builder<'a>,
Acc: &'a Value,
Src: &'a Value)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceAdd(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceAdd(B: &Builder<'a>,
Src: &'a Value)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceMul(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceMul(B: &Builder<'a>,
Src: &'a Value)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceAnd(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceAnd(B: &Builder<'a>,
Src: &'a Value)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceOr(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceOr(B: &Builder<'a>,
Src: &'a Value)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceXor(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceXor(B: &Builder<'a>,
Src: &'a Value)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceMin(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceMin(B: &Builder<'a>,
Src: &'a Value,
IsSigned: bool)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceMax(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceMax(B: &Builder<'a>,
Src: &'a Value,
IsSigned: bool)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceFMin(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceFMin(B: &Builder<'a>,
Src: &'a Value,
IsNaN: bool)
-> Option<&'a Value>;
pub fn LLVMRustBuildVectorReduceFMax(B: &'a Builder,
pub fn LLVMRustBuildVectorReduceFMax(B: &Builder<'a>,
Src: &'a Value,
IsNaN: bool)
-> Option<&'a Value>;
pub fn LLVMRustBuildMinNum(B: &'a Builder, LHS: &'a Value, LHS: &'a Value) -> Option<&'a Value>;
pub fn LLVMRustBuildMaxNum(B: &'a Builder, LHS: &'a Value, LHS: &'a Value) -> Option<&'a Value>;
pub fn LLVMRustBuildMinNum(
B: &Builder<'a>,
LHS: &'a Value,
LHS: &'a Value,
) -> Option<&'a Value>;
pub fn LLVMRustBuildMaxNum(
B: &Builder<'a>,
LHS: &'a Value,
LHS: &'a Value,
) -> Option<&'a Value>;
// Atomic Operations
pub fn LLVMRustBuildAtomicLoad(B: &'a Builder,
pub fn LLVMRustBuildAtomicLoad(B: &Builder<'a>,
PointerVal: &'a Value,
Name: *const c_char,
Order: AtomicOrdering)
-> &'a Value;
pub fn LLVMRustBuildAtomicStore(B: &'a Builder,
pub fn LLVMRustBuildAtomicStore(B: &Builder<'a>,
Val: &'a Value,
Ptr: &'a Value,
Order: AtomicOrdering)
-> &'a Value;
pub fn LLVMRustBuildAtomicCmpXchg(B: &'a Builder,
pub fn LLVMRustBuildAtomicCmpXchg(B: &Builder<'a>,
LHS: &'a Value,
CMP: &'a Value,
RHS: &'a Value,
@ -1093,7 +1102,7 @@ extern "C" {
Weak: Bool)
-> &'a Value;
pub fn LLVMBuildAtomicRMW(B: &'a Builder,
pub fn LLVMBuildAtomicRMW(B: &Builder<'a>,
Op: AtomicRmwBinOp,
LHS: &'a Value,
RHS: &'a Value,
@ -1564,7 +1573,7 @@ extern "C" {
-> &'a mut OperandBundleDef<'a>;
pub fn LLVMRustFreeOperandBundleDef(Bundle: &'a mut OperandBundleDef<'a>);
pub fn LLVMRustPositionBuilderAtStart(B: &'a Builder, BB: &'a BasicBlock);
pub fn LLVMRustPositionBuilderAtStart(B: &Builder<'a>, BB: &'a BasicBlock);
pub fn LLVMRustSetComdat(M: &'a Module, V: &'a Value, Name: *const c_char);
pub fn LLVMRustUnsetComdat(V: &Value);