@@ -87,6 +87,110 @@ impl HasCodegen<'tcx> for Builder<'_, 'll, 'tcx> {
8787 type CodegenCx = CodegenCx < ' ll , ' tcx > ;
8888}
8989
90+ impl ControlFlowBuilderMethods < ' a , ' tcx > for Builder < ' a , ' ll , ' tcx > {
91+ fn new_block < ' b > (
92+ cx : & ' a CodegenCx < ' ll , ' tcx > ,
93+ llfn : & ' ll Value ,
94+ name : & ' b str
95+ ) -> Self {
96+ let mut bx = Builder :: with_cx ( cx) ;
97+ let llbb = unsafe {
98+ let name = SmallCStr :: new ( name) ;
99+ llvm:: LLVMAppendBasicBlockInContext (
100+ cx. llcx ,
101+ llfn,
102+ name. as_ptr ( )
103+ )
104+ } ;
105+ bx. position_at_end ( llbb) ;
106+ bx
107+ }
108+
109+ fn with_cx ( cx : & ' a CodegenCx < ' ll , ' tcx > ) -> Self {
110+ // Create a fresh builder from the crate context.
111+ let llbuilder = unsafe {
112+ llvm:: LLVMCreateBuilderInContext ( cx. llcx )
113+ } ;
114+ Builder {
115+ llbuilder,
116+ cx,
117+ }
118+ }
119+
120+ fn build_sibling_block < ' b > ( & self , name : & ' b str ) -> Self {
121+ Builder :: new_block ( self . cx , self . llfn ( ) , name)
122+ }
123+
124+ fn llbb ( & self ) -> & ' ll BasicBlock {
125+ unsafe {
126+ llvm:: LLVMGetInsertBlock ( self . llbuilder )
127+ }
128+ }
129+
130+ fn position_at_end ( & mut self , llbb : & ' ll BasicBlock ) {
131+ unsafe {
132+ llvm:: LLVMPositionBuilderAtEnd ( self . llbuilder , llbb) ;
133+ }
134+ }
135+
136+ fn ret_void ( & mut self ) {
137+ self . count_insn ( "retvoid" ) ;
138+ unsafe {
139+ llvm:: LLVMBuildRetVoid ( self . llbuilder ) ;
140+ }
141+ }
142+
143+ fn ret ( & mut self , v : & ' ll Value ) {
144+ self . count_insn ( "ret" ) ;
145+ unsafe {
146+ llvm:: LLVMBuildRet ( self . llbuilder , v) ;
147+ }
148+ }
149+
150+ fn br ( & mut self , dest : & ' ll BasicBlock ) {
151+ self . count_insn ( "br" ) ;
152+ unsafe {
153+ llvm:: LLVMBuildBr ( self . llbuilder , dest) ;
154+ }
155+ }
156+
157+ fn cond_br (
158+ & mut self ,
159+ cond : & ' ll Value ,
160+ then_llbb : & ' ll BasicBlock ,
161+ else_llbb : & ' ll BasicBlock ,
162+ ) {
163+ self . count_insn ( "condbr" ) ;
164+ unsafe {
165+ llvm:: LLVMBuildCondBr ( self . llbuilder , cond, then_llbb, else_llbb) ;
166+ }
167+ }
168+
169+ fn switch (
170+ & mut self ,
171+ v : & ' ll Value ,
172+ else_llbb : & ' ll BasicBlock ,
173+ num_cases : usize ,
174+ ) -> & ' ll Value {
175+ unsafe {
176+ llvm:: LLVMBuildSwitch ( self . llbuilder , v, else_llbb, num_cases as c_uint )
177+ }
178+ }
179+
180+ fn add_case ( & mut self , s : & ' ll Value , on_val : & ' ll Value , dest : & ' ll BasicBlock ) {
181+ unsafe {
182+ llvm:: LLVMAddCase ( s, on_val, dest)
183+ }
184+ }
185+
186+ fn unreachable ( & mut self ) {
187+ self . count_insn ( "unreachable" ) ;
188+ unsafe {
189+ llvm:: LLVMBuildUnreachable ( self . llbuilder ) ;
190+ }
191+ }
192+ }
193+
90194impl MemoryBuilderMethods < ' tcx > for Builder < ' a , ' ll , ' tcx > {
91195 fn alloca ( & mut self , ty : & ' ll Type , name : & str , align : Align ) -> & ' ll Value {
92196 let mut bx = Builder :: with_cx ( self . cx ) ;
@@ -1021,102 +1125,6 @@ impl UnwindBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
10211125}
10221126
10231127impl BuilderMethods < ' a , ' tcx > for Builder < ' a , ' ll , ' tcx > {
1024- fn new_block < ' b > (
1025- cx : & ' a CodegenCx < ' ll , ' tcx > ,
1026- llfn : & ' ll Value ,
1027- name : & ' b str
1028- ) -> Self {
1029- let mut bx = Builder :: with_cx ( cx) ;
1030- let llbb = unsafe {
1031- let name = SmallCStr :: new ( name) ;
1032- llvm:: LLVMAppendBasicBlockInContext (
1033- cx. llcx ,
1034- llfn,
1035- name. as_ptr ( )
1036- )
1037- } ;
1038- bx. position_at_end ( llbb) ;
1039- bx
1040- }
1041-
1042- fn with_cx ( cx : & ' a CodegenCx < ' ll , ' tcx > ) -> Self {
1043- // Create a fresh builder from the crate context.
1044- let llbuilder = unsafe {
1045- llvm:: LLVMCreateBuilderInContext ( cx. llcx )
1046- } ;
1047- Builder {
1048- llbuilder,
1049- cx,
1050- }
1051- }
1052-
1053- fn build_sibling_block < ' b > ( & self , name : & ' b str ) -> Self {
1054- Builder :: new_block ( self . cx , self . llfn ( ) , name)
1055- }
1056-
1057- fn llbb ( & self ) -> & ' ll BasicBlock {
1058- unsafe {
1059- llvm:: LLVMGetInsertBlock ( self . llbuilder )
1060- }
1061- }
1062-
1063- fn position_at_end ( & mut self , llbb : & ' ll BasicBlock ) {
1064- unsafe {
1065- llvm:: LLVMPositionBuilderAtEnd ( self . llbuilder , llbb) ;
1066- }
1067- }
1068-
1069- fn ret_void ( & mut self ) {
1070- self . count_insn ( "retvoid" ) ;
1071- unsafe {
1072- llvm:: LLVMBuildRetVoid ( self . llbuilder ) ;
1073- }
1074- }
1075-
1076- fn ret ( & mut self , v : & ' ll Value ) {
1077- self . count_insn ( "ret" ) ;
1078- unsafe {
1079- llvm:: LLVMBuildRet ( self . llbuilder , v) ;
1080- }
1081- }
1082-
1083- fn br ( & mut self , dest : & ' ll BasicBlock ) {
1084- self . count_insn ( "br" ) ;
1085- unsafe {
1086- llvm:: LLVMBuildBr ( self . llbuilder , dest) ;
1087- }
1088- }
1089-
1090- fn cond_br (
1091- & mut self ,
1092- cond : & ' ll Value ,
1093- then_llbb : & ' ll BasicBlock ,
1094- else_llbb : & ' ll BasicBlock ,
1095- ) {
1096- self . count_insn ( "condbr" ) ;
1097- unsafe {
1098- llvm:: LLVMBuildCondBr ( self . llbuilder , cond, then_llbb, else_llbb) ;
1099- }
1100- }
1101-
1102- fn switch (
1103- & mut self ,
1104- v : & ' ll Value ,
1105- else_llbb : & ' ll BasicBlock ,
1106- num_cases : usize ,
1107- ) -> & ' ll Value {
1108- unsafe {
1109- llvm:: LLVMBuildSwitch ( self . llbuilder , v, else_llbb, num_cases as c_uint )
1110- }
1111- }
1112-
1113- fn unreachable ( & mut self ) {
1114- self . count_insn ( "unreachable" ) ;
1115- unsafe {
1116- llvm:: LLVMBuildUnreachable ( self . llbuilder ) ;
1117- }
1118- }
1119-
11201128 /* Miscellaneous instructions */
11211129 fn inline_asm_call ( & mut self , asm : & CStr , cons : & CStr ,
11221130 inputs : & [ & ' ll Value ] , output : & ' ll Type ,
@@ -1211,12 +1219,6 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
12111219 }
12121220 }
12131221
1214- fn add_case ( & mut self , s : & ' ll Value , on_val : & ' ll Value , dest : & ' ll BasicBlock ) {
1215- unsafe {
1216- llvm:: LLVMAddCase ( s, on_val, dest)
1217- }
1218- }
1219-
12201222 fn set_invariant_load ( & mut self , load : & ' ll Value ) {
12211223 unsafe {
12221224 llvm:: LLVMSetMetadata ( load, llvm:: MD_invariant_load as c_uint ,
0 commit comments