@@ -30,7 +30,7 @@ use tracing::{debug, instrument};
3030
3131use crate :: abi:: FnAbiLlvmExt ;
3232use crate :: common:: Funclet ;
33- use crate :: context:: { CodegenCx , SimpleCx } ;
33+ use crate :: context:: { CodegenCx , FullCx , GenericCx , SCx } ;
3434use crate :: llvm:: {
3535 self , AtomicOrdering , AtomicRmwBinOp , BasicBlock , False , GEPNoWrapFlags , Metadata , True ,
3636} ;
@@ -40,15 +40,15 @@ use crate::value::Value;
4040use crate :: { attributes, llvm_util} ;
4141
4242#[ must_use]
43- pub ( crate ) struct GenericBuilder < ' a , ' ll , CX : Borrow < SimpleCx < ' ll > > > {
43+ pub ( crate ) struct GenericBuilder < ' a , ' ll , CX : Borrow < SCx < ' ll > > > {
4444 pub llbuilder : & ' ll mut llvm:: Builder < ' ll > ,
45- pub cx : & ' a CX ,
45+ pub cx : & ' a GenericCx < ' ll , CX > ,
4646}
4747
48- pub ( crate ) type SBuilder < ' a , ' ll > = GenericBuilder < ' a , ' ll , SimpleCx < ' ll > > ;
49- pub ( crate ) type Builder < ' a , ' ll , ' tcx > = GenericBuilder < ' a , ' ll , CodegenCx < ' ll , ' tcx > > ;
48+ pub ( crate ) type SBuilder < ' a , ' ll > = GenericBuilder < ' a , ' ll , SCx < ' ll > > ;
49+ pub ( crate ) type Builder < ' a , ' ll , ' tcx > = GenericBuilder < ' a , ' ll , FullCx < ' ll , ' tcx > > ;
5050
51- impl < ' a , ' ll , CX : Borrow < SimpleCx < ' ll > > > Drop for GenericBuilder < ' a , ' ll , CX > {
51+ impl < ' a , ' ll , CX : Borrow < SCx < ' ll > > > Drop for GenericBuilder < ' a , ' ll , CX > {
5252 fn drop ( & mut self ) {
5353 unsafe {
5454 llvm:: LLVMDisposeBuilder ( & mut * ( self . llbuilder as * mut _ ) ) ;
@@ -87,14 +87,15 @@ impl<'a, 'll> SBuilder<'a, 'll> {
8787 } ;
8888 call
8989 }
90+ }
9091
91- fn with_scx ( scx : & ' a SimpleCx < ' ll > ) -> Self {
92+ impl < ' a , ' ll , CX : Borrow < SCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
93+ fn with_cx ( scx : & ' a GenericCx < ' ll , CX > ) -> Self {
9294 // Create a fresh builder from the simple context.
93- let llbuilder = unsafe { llvm:: LLVMCreateBuilderInContext ( scx. llcx ) } ;
94- SBuilder { llbuilder, cx : scx }
95+ let llbuilder = unsafe { llvm:: LLVMCreateBuilderInContext ( scx. deref ( ) . borrow ( ) . llcx ) } ;
96+ GenericBuilder { llbuilder, cx : scx }
9597 }
96- }
97- impl < ' a , ' ll , CX : Borrow < SimpleCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
98+
9899 pub ( crate ) fn bitcast ( & mut self , val : & ' ll Value , dest_ty : & ' ll Type ) -> & ' ll Value {
99100 unsafe { llvm:: LLVMBuildBitCast ( self . llbuilder , val, dest_ty, UNNAMED ) }
100101 }
@@ -108,16 +109,17 @@ impl<'a, 'll, CX: Borrow<SimpleCx<'ll>>> GenericBuilder<'a, 'll, CX> {
108109 llvm:: LLVMBuildRet ( self . llbuilder , v) ;
109110 }
110111 }
111- }
112- impl < ' a , ' ll > SBuilder < ' a , ' ll > {
113- fn build ( cx : & ' a SimpleCx < ' ll > , llbb : & ' ll BasicBlock ) -> SBuilder < ' a , ' ll > {
114- let bx = SBuilder :: with_scx ( cx) ;
112+
113+ fn build ( cx : & ' a GenericCx < ' ll , CX > , llbb : & ' ll BasicBlock ) -> Self {
114+ let bx = Self :: with_cx ( cx) ;
115115 unsafe {
116116 llvm:: LLVMPositionBuilderAtEnd ( bx. llbuilder , llbb) ;
117117 }
118118 bx
119119 }
120+ }
120121
122+ impl < ' a , ' ll > SBuilder < ' a , ' ll > {
121123 fn check_call < ' b > (
122124 & mut self ,
123125 typ : & str ,
@@ -1472,26 +1474,12 @@ impl<'ll> StaticBuilderMethods for Builder<'_, 'll, '_> {
14721474}
14731475
14741476impl < ' a , ' ll , ' tcx > Builder < ' a , ' ll , ' tcx > {
1475- fn build ( cx : & ' a CodegenCx < ' ll , ' tcx > , llbb : & ' ll BasicBlock ) -> Builder < ' a , ' ll , ' tcx > {
1476- let bx = Builder :: with_cx ( cx) ;
1477- unsafe {
1478- llvm:: LLVMPositionBuilderAtEnd ( bx. llbuilder , llbb) ;
1479- }
1480- bx
1481- }
1482-
1483- fn with_cx ( cx : & ' a CodegenCx < ' ll , ' tcx > ) -> Self {
1484- // Create a fresh builder from the crate context.
1485- let llbuilder = unsafe { llvm:: LLVMCreateBuilderInContext ( cx. llcx ) } ;
1486- Builder { llbuilder, cx }
1487- }
1488-
14891477 pub ( crate ) fn llfn ( & self ) -> & ' ll Value {
14901478 unsafe { llvm:: LLVMGetBasicBlockParent ( self . llbb ( ) ) }
14911479 }
14921480}
14931481
1494- impl < ' a , ' ll , CX : Borrow < SimpleCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
1482+ impl < ' a , ' ll , CX : Borrow < SCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
14951483 fn position_at_start ( & mut self , llbb : & ' ll BasicBlock ) {
14961484 unsafe {
14971485 llvm:: LLVMRustPositionBuilderAtStart ( self . llbuilder , llbb) ;
@@ -1521,7 +1509,7 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
15211509 }
15221510 }
15231511}
1524- impl < ' a , ' ll , CX : Borrow < SimpleCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
1512+ impl < ' a , ' ll , CX : Borrow < SCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
15251513 pub ( crate ) fn minnum ( & mut self , lhs : & ' ll Value , rhs : & ' ll Value ) -> & ' ll Value {
15261514 unsafe { llvm:: LLVMRustBuildMinNum ( self . llbuilder , lhs, rhs) }
15271515 }
@@ -1666,7 +1654,7 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
16661654 Cow :: Owned ( casted_args)
16671655 }
16681656}
1669- impl < ' a , ' ll , CX : Borrow < SimpleCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
1657+ impl < ' a , ' ll , CX : Borrow < SCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
16701658 pub ( crate ) fn va_arg ( & mut self , list : & ' ll Value , ty : & ' ll Type ) -> & ' ll Value {
16711659 unsafe { llvm:: LLVMBuildVAArg ( self . llbuilder , list, ty, UNNAMED ) }
16721660 }
@@ -1690,7 +1678,7 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
16901678 self . call_intrinsic ( intrinsic, & [ self . cx . const_u64 ( size) , ptr] ) ;
16911679 }
16921680}
1693- impl < ' a , ' ll , CX : Borrow < SimpleCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
1681+ impl < ' a , ' ll , CX : Borrow < SCx < ' ll > > > GenericBuilder < ' a , ' ll , CX > {
16941682 pub ( crate ) fn phi (
16951683 & mut self ,
16961684 ty : & ' ll Type ,
0 commit comments