1#![allow(dead_code)]
2
3extern crate llvm_sys;
4
5use self::llvm_sys::core::*;
6use self::llvm_sys::prelude::*;
7use self::llvm_sys::LLVMIntPredicate::*;
8use self::llvm_sys::LLVMRealPredicate::*;
9use phi::Phi;
10use cstring_manager::CStringManager;
11
12#[derive(Debug)]
13pub struct Builder {
14 llvm_builder: LLVMBuilderRef
15}
16
17impl Builder {
18 pub fn new() -> Builder {
19 let builder = unsafe { LLVMCreateBuilder() };
20 Builder {
21 llvm_builder: builder
22 }
23 }
24
25 pub fn new_in_context(context: LLVMContextRef) -> Builder {
26 let builder = unsafe { LLVMCreateBuilderInContext(context) };
27 Builder {
28 llvm_builder: builder
29 }
30 }
31
32 pub fn as_ref(&self) -> LLVMBuilderRef {
33 self.llvm_builder
34 }
35
36 #[inline]
37 pub fn position_at_end(&self, entry_block: LLVMBasicBlockRef){
38 unsafe { LLVMPositionBuilderAtEnd(self.llvm_builder, entry_block); }
39 }
40
41 #[inline]
42 pub fn build_alloca(&self, typ: LLVMTypeRef) -> LLVMValueRef {
43 self.build_alloca_with_name(typ, "")
44 }
45
46 #[inline]
47 pub fn build_alloca_with_name(&self, typ: LLVMTypeRef, name: &str) -> LLVMValueRef {
48 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
49 unsafe { LLVMBuildAlloca(self.llvm_builder, typ, val_name_ptr) }
50 }
51
52 #[inline]
53 pub fn build_array_alloca(&self, typ: LLVMTypeRef, size: LLVMValueRef) -> LLVMValueRef {
54 self.build_array_alloca_with_name(typ, size, "")
55 }
56
57 #[inline]
58 pub fn build_array_alloca_with_name(&self, typ: LLVMTypeRef, size: LLVMValueRef, name: &str) -> LLVMValueRef {
59 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
60 unsafe { LLVMBuildArrayAlloca(self.llvm_builder, typ, size, val_name_ptr) }
61 }
62
63 #[inline]
64 pub fn build_array_malloc(&self, typ: LLVMTypeRef, size: LLVMValueRef) -> LLVMValueRef {
65 self.build_array_malloc_with_name(typ, size, "")
66 }
67
68 #[inline]
69 pub fn build_array_malloc_with_name(&self, typ: LLVMTypeRef, size: LLVMValueRef, name: &str) -> LLVMValueRef {
70 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
71 unsafe { LLVMBuildArrayMalloc(self.llvm_builder, typ, size, val_name_ptr) }
72 }
73
74 #[inline]
75 pub fn build_free(&self, pointer: LLVMValueRef) -> LLVMValueRef {
76 unsafe { LLVMBuildFree(self.llvm_builder, pointer) }
77 }
78
79 #[inline]
80 pub fn build_struct_gep(&self, ptr: LLVMValueRef, index: u32) -> LLVMValueRef {
81 self.build_struct_gep_with_name(ptr, index, "")
82 }
83
84 #[inline]
85 pub fn build_struct_gep_with_name(&self, ptr: LLVMValueRef, index: u32, name: &str) -> LLVMValueRef {
86 unsafe { LLVMBuildStructGEP(self.llvm_builder, ptr, index, name.as_ptr() as *const i8) }
87 }
88
89 #[inline]
90 pub fn build_store(&self, val: LLVMValueRef, ptr: LLVMValueRef) -> LLVMValueRef {
91 unsafe { LLVMBuildStore(self.llvm_builder, val, ptr) }
92 }
93
94 #[inline]
95 pub fn build_load(&self, pointer_val: LLVMValueRef) -> LLVMValueRef {
96 self.build_load_with_name(pointer_val, "")
97 }
98
99 #[inline]
100 pub fn build_load_with_name(&self, pointer_val: LLVMValueRef, name: &str) -> LLVMValueRef {
101 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
102 unsafe { LLVMBuildLoad(self.llvm_builder, pointer_val, val_name_ptr) }
103 }
104
105 #[inline]
106 pub fn build_select(&self, cond: LLVMValueRef, then_val: LLVMValueRef, else_val: LLVMValueRef) -> LLVMValueRef {
107 self.build_select_with_name(cond, then_val, else_val, "")
108 }
109
110 #[inline]
111 pub fn build_select_with_name(&self, cond: LLVMValueRef, then_val: LLVMValueRef, else_val: LLVMValueRef, name: &str) -> LLVMValueRef {
112 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
113 unsafe { LLVMBuildSelect(self.llvm_builder, cond, then_val, else_val, val_name_ptr) }
114 }
115
116 #[inline]
117 pub fn build_int_to_ptr(&self, val: LLVMValueRef, to_type: LLVMTypeRef) -> LLVMValueRef {
118 self.build_int_to_ptr_with_name(val, to_type, "")
119 }
120
121 #[inline]
122 pub fn build_int_to_ptr_with_name(&self, val: LLVMValueRef, to_type: LLVMTypeRef, name: &str) -> LLVMValueRef {
123 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
124 unsafe { LLVMBuildIntToPtr(self.llvm_builder, val, to_type, val_name_ptr) }
125 }
126
127 #[inline]
128 pub fn build_ptr_to_int(&self, val: LLVMValueRef, to_type: LLVMTypeRef) -> LLVMValueRef {
129 self.build_ptr_to_int_with_name(val, to_type, "")
130 }
131
132 #[inline]
133 pub fn build_ptr_to_int_with_name(&self, val: LLVMValueRef, to_type: LLVMTypeRef, name: &str) -> LLVMValueRef {
134 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
135 unsafe { LLVMBuildPtrToInt(self.llvm_builder, val, to_type, val_name_ptr) }
136 }
137
138 #[inline]
139 pub fn build_bitcast(&self, value: LLVMValueRef, to_type: LLVMTypeRef) -> LLVMValueRef {
140 self.build_bitcast_with_name(value, to_type, "")
141 }
142
143 #[inline]
144 pub fn build_bitcast_with_name(&self, value: LLVMValueRef, to_type: LLVMTypeRef, name: &str) -> LLVMValueRef {
145 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
146 unsafe { LLVMBuildBitCast(self.llvm_builder, value, to_type, val_name_ptr) }
147 }
148
149 #[inline]
150 pub fn build_zext(&self, val: LLVMValueRef, to_type: LLVMTypeRef) -> LLVMValueRef {
151 self.build_zext_with_name(val, to_type, "")
152 }
153
154 #[inline]
155 pub fn build_zext_with_name(&self, val: LLVMValueRef, to_type: LLVMTypeRef, name: &str) -> LLVMValueRef {
156 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
157 unsafe { LLVMBuildZExt(self.llvm_builder, val, to_type, val_name_ptr) }
158 }
159
160 #[inline]
161 pub fn build_trunc(&self, val: LLVMValueRef, to_type: LLVMTypeRef) -> LLVMValueRef {
162 self.build_trunc_with_name(val, to_type, "")
163 }
164
165 #[inline]
166 pub fn build_trunc_with_name(&self, val: LLVMValueRef, to_type: LLVMTypeRef, name: &str) -> LLVMValueRef {
167 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
168 unsafe { LLVMBuildTrunc(self.llvm_builder, val, to_type, val_name_ptr) }
169 }
170
171 #[inline]
172 pub fn build_fp_trunc(&self, val: LLVMValueRef, to_type: LLVMTypeRef) -> LLVMValueRef {
173 self.build_fp_trunc_with_name(val, to_type, "")
174 }
175
176 #[inline]
177 pub fn build_fp_trunc_with_name(&self, val: LLVMValueRef, to_type: LLVMTypeRef, name: &str) -> LLVMValueRef {
178 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
179 unsafe { LLVMBuildFPTrunc(self.llvm_builder, val, to_type, val_name_ptr) }
180 }
181
182 #[inline]
183 pub fn build_trunc_or_bitcast(&self, val: LLVMValueRef, to_type: LLVMTypeRef) -> LLVMValueRef {
184 self.build_trunc_or_bitcast_with_name(val, to_type, "")
185 }
186
187 #[inline]
188 pub fn build_trunc_or_bitcast_with_name(&self, val: LLVMValueRef, to_type: LLVMTypeRef, name: &str) -> LLVMValueRef {
189 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
190 unsafe { LLVMBuildTruncOrBitCast(self.llvm_builder, val, to_type, val_name_ptr) }
191 }
192
193 #[inline]
194 pub fn build_insert_value(&self, agg_val: LLVMValueRef, elt_val: LLVMValueRef, index: u32) -> LLVMValueRef {
195 self.build_insert_value_with_name(agg_val, elt_val, index, "")
196 }
197
198 #[inline]
199 pub fn build_insert_value_with_name(&self, agg_val: LLVMValueRef, elt_val: LLVMValueRef, index: u32, name: &str) -> LLVMValueRef {
200 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
201 unsafe { LLVMBuildInsertValue(self.llvm_builder, agg_val, elt_val, index, val_name_ptr)}
202 }
203
204 #[inline]
205 pub fn build_extract_value(&self, agg_val: LLVMValueRef, index: u32) -> LLVMValueRef {
206 self.build_extract_value_with_name(agg_val, index, "")
207 }
208
209 #[inline]
210 pub fn build_extract_value_with_name(&self, agg_val: LLVMValueRef, index: u32, name: &str) -> LLVMValueRef {
211 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
212 unsafe { LLVMBuildExtractValue(self.llvm_builder, agg_val, index, val_name_ptr)}
213 }
214
215 #[inline]
216 pub fn build_add(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
217 self.build_add_with_name(lhs, rhs, "")
218 }
219
220 #[inline]
221 pub fn build_add_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
222 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
223 unsafe { LLVMBuildAdd(self.llvm_builder, lhs, rhs, val_name_ptr) }
224 }
225
226 #[inline]
227 pub fn build_sub(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
228 self.build_sub_with_name(lhs, rhs, "")
229 }
230
231 #[inline]
232 pub fn build_sub_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
233 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
234 unsafe { LLVMBuildSub(self.llvm_builder, lhs, rhs, val_name_ptr) }
235 }
236
237 #[inline]
238 pub fn build_mul(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
239 self.build_mul_with_name(lhs, rhs, "")
240 }
241
242 #[inline]
243 pub fn build_mul_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
244 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
245 unsafe { LLVMBuildMul(self.llvm_builder, lhs, rhs, val_name_ptr) }
246 }
247
248 #[inline]
249 pub fn build_sdiv(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
250 self.build_sdiv_with_name(lhs, rhs, "")
251 }
252
253 #[inline]
254 pub fn build_sdiv_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
255 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
256 unsafe { LLVMBuildSDiv(self.llvm_builder, lhs, rhs, val_name_ptr) }
257 }
258
259 #[inline]
260 pub fn build_udiv(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
261 self.build_udiv_with_name(lhs, rhs, "")
262 }
263
264 #[inline]
265 pub fn build_udiv_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
266 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
267 unsafe { LLVMBuildUDiv(self.llvm_builder, lhs, rhs, val_name_ptr) }
268 }
269
270 #[inline]
271 pub fn build_srem(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
272 self.build_srem_with_name(lhs, rhs, "")
273 }
274
275 #[inline]
276 pub fn build_srem_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
277 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
278 unsafe { LLVMBuildSRem(self.llvm_builder, lhs, rhs, val_name_ptr) }
279 }
280
281 #[inline]
282 pub fn build_urem(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
283 self.build_urem_with_name(lhs, rhs, "")
284 }
285
286 #[inline]
287 pub fn build_urem_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
288 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
289 unsafe { LLVMBuildURem(self.llvm_builder, lhs, rhs, val_name_ptr) }
290 }
291
292 #[inline]
293 pub fn build_ret(&self, value: LLVMValueRef) -> LLVMValueRef {
294 unsafe { LLVMBuildRet(self.llvm_builder, value) }
295 }
296
297 #[inline]
298 pub fn build_ret_void(&self) -> LLVMValueRef {
299 unsafe { LLVMBuildRetVoid(self.llvm_builder) }
300 }
301
302 #[inline]
303 pub fn build_and(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
304 self.build_add_with_name(lhs, rhs, "")
305 }
306
307 #[inline]
308 pub fn build_and_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
309 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
310 unsafe { LLVMBuildAnd(self.llvm_builder, lhs, rhs, val_name_ptr) }
311 }
312
313 #[inline]
314 pub fn build_or(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
315 self.build_or_with_name(lhs, rhs, "")
316 }
317
318 #[inline]
319 pub fn build_or_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
320 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
321 unsafe { LLVMBuildOr(self.llvm_builder, lhs, rhs, val_name_ptr) }
322 }
323
324 #[inline]
325 pub fn build_xor(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
326 self.build_xor_with_name(lhs, rhs, "")
327 }
328
329 #[inline]
330 pub fn build_xor_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
331 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
332 unsafe { LLVMBuildXor(self.llvm_builder, lhs, rhs, val_name_ptr) }
333 }
334
335 #[inline]
336 pub fn build_neg(&self, value: LLVMValueRef) -> LLVMValueRef {
337 self.build_neg_with_name(value, "")
338 }
339
340 #[inline]
341 pub fn build_neg_with_name(&self, value: LLVMValueRef, name: &str) -> LLVMValueRef {
342 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
343 unsafe { LLVMBuildNeg(self.llvm_builder, value, val_name_ptr) }
344 }
345
346 #[inline]
347 pub fn build_fneg(&self, value: LLVMValueRef) -> LLVMValueRef {
348 self.build_fneg_with_name(value, "")
349 }
350
351 #[inline]
352 pub fn build_fneg_with_name(&self, value: LLVMValueRef, name: &str) -> LLVMValueRef {
353 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
354 unsafe { LLVMBuildFNeg(self.llvm_builder, value, val_name_ptr) }
355 }
356
357 #[inline]
358 pub fn build_shl(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
359 self.build_shl_with_name(lhs, rhs, "")
360 }
361
362 #[inline]
363 pub fn build_shl_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
364 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
365 unsafe { LLVMBuildShl(self.llvm_builder, lhs, rhs, val_name_ptr) }
366 }
367
368 #[inline]
369 pub fn build_ashr(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
370 self.build_ashr_with_name(lhs, rhs, "")
371 }
372
373 #[inline]
374 pub fn build_ashr_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
375 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
376 unsafe { LLVMBuildAShr(self.llvm_builder, lhs, rhs, val_name_ptr) }
377 }
378
379 #[inline]
380 pub fn build_lshr(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
381 self.build_lshr_with_name(lhs, rhs, "")
382 }
383
384 #[inline]
385 pub fn build_lshr_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
386 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
387 unsafe { LLVMBuildLShr(self.llvm_builder, lhs, rhs, val_name_ptr) }
388 }
389
390 #[inline]
391 pub fn build_not(&self, value: LLVMValueRef) -> LLVMValueRef {
392 self.build_not_with_name(value, "")
393 }
394
395 #[inline]
396 pub fn build_not_with_name(&self, value: LLVMValueRef, name: &str) -> LLVMValueRef {
397 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
398 unsafe { LLVMBuildNot(self.llvm_builder, value, val_name_ptr) }
399 }
400
401 #[inline]
402 pub fn build_is_not_null(&self, value: LLVMValueRef) -> LLVMValueRef {
403 self.build_is_not_null_with_name(value, "")
404 }
405
406 #[inline]
407 pub fn build_is_not_null_with_name(&self, value: LLVMValueRef, name: &str) -> LLVMValueRef {
408 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
409 unsafe { LLVMBuildIsNotNull(self.llvm_builder, value, val_name_ptr) }
410 }
411
412 #[inline]
413 pub fn build_icmp_eq(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
414 self.build_icmp_eq_with_name(lhs, rhs, "")
415 }
416
417 #[inline]
418 pub fn build_icmp_eq_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
419 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
420 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntEQ, lhs, rhs, val_name_ptr) }
421 }
422
423 #[inline]
424 pub fn build_icmp_ne(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
425 self.build_icmp_ne_with_name(lhs, rhs, "")
426 }
427
428 #[inline]
429 pub fn build_icmp_ne_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
430 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
431 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntNE, lhs, rhs, val_name_ptr) }
432 }
433
434 #[inline]
435 pub fn build_icmp_ugt(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
436 self.build_icmp_ugt_with_name(lhs, rhs, "")
437 }
438
439 #[inline]
440 pub fn build_icmp_ugt_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
441 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
442 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntUGT, lhs, rhs, val_name_ptr) }
443 }
444
445 #[inline]
446 pub fn build_icmp_uge(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
447 self.build_icmp_uge_with_name(lhs, rhs, "")
448 }
449
450 #[inline]
451 pub fn build_icmp_uge_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
452 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
453 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntUGE, lhs, rhs, val_name_ptr) }
454 }
455
456 #[inline]
457 pub fn build_icmp_ult(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
458 self.build_icmp_ult_with_name(lhs, rhs, "")
459 }
460
461 #[inline]
462 pub fn build_icmp_ult_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
463 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
464 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntULT, lhs, rhs, val_name_ptr) }
465 }
466
467 #[inline]
468 pub fn build_icmp_ule(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
469 self.build_icmp_ule_with_name(lhs, rhs, "")
470 }
471
472 #[inline]
473 pub fn build_icmp_ule_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
474 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
475 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntULE, lhs, rhs, val_name_ptr) }
476 }
477
478 #[inline]
479 pub fn build_icmp_sgt(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
480 self.build_icmp_sgt_with_name(lhs, rhs, "")
481 }
482
483 #[inline]
484 pub fn build_icmp_sgt_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
485 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
486 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntSGT, lhs, rhs, val_name_ptr) }
487 }
488
489 #[inline]
490 pub fn build_icmp_sge(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
491 self.build_icmp_sge_with_name(lhs, rhs, "")
492 }
493
494 #[inline]
495 pub fn build_icmp_sge_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
496 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
497 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntSGE, lhs, rhs, val_name_ptr) }
498 }
499
500 #[inline]
501 pub fn build_icmp_slt(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
502 self.build_icmp_slt_with_name(lhs, rhs, "")
503 }
504
505 #[inline]
506 pub fn build_icmp_slt_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
507 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
508 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntSLT, lhs, rhs, val_name_ptr) }
509 }
510
511 #[inline]
512 pub fn build_icmp_sle(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
513 self.build_icmp_sle_with_name(lhs, rhs, "")
514 }
515
516 #[inline]
517 pub fn build_icmp_sle_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
518 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
519 unsafe { LLVMBuildICmp(self.llvm_builder, LLVMIntSLE, lhs, rhs, val_name_ptr) }
520 }
521
522 #[inline]
523 pub fn build_fcmp_predicate_false(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
524 self.build_fcmp_predicate_false_with_name(lhs, rhs, "")
525 }
526
527 #[inline]
528 pub fn build_fcmp_predicate_false_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
529 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
530 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealPredicateFalse, lhs, rhs, val_name_ptr) }
531 }
532
533 #[inline]
534 pub fn build_fcmp_predicate_true(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
535 self.build_fcmp_predicate_true_with_name(lhs, rhs, "")
536 }
537
538 #[inline]
539 pub fn build_fcmp_predicate_true_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
540 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
541 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealPredicateTrue, lhs, rhs, val_name_ptr) }
542 }
543
544 #[inline]
545 pub fn build_fcmp_ord(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
546 self.build_fcmp_ord_with_name(lhs, rhs, "")
547 }
548
549 #[inline]
550 pub fn build_fcmp_ord_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
551 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
552 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealORD, lhs, rhs, val_name_ptr) }
553 }
554
555 #[inline]
556 pub fn build_fcmp_oeq(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
557 self.build_fcmp_oeq_with_name(lhs, rhs, "")
558 }
559
560 #[inline]
561 pub fn build_fcmp_oeq_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
562 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
563 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealOEQ, lhs, rhs, val_name_ptr) }
564 }
565
566 #[inline]
567 pub fn build_fcmp_one(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
568 self.build_fcmp_one_with_name(lhs, rhs, "")
569 }
570
571 #[inline]
572 pub fn build_fcmp_one_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
573 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
574 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealONE, lhs, rhs, val_name_ptr) }
575 }
576
577 #[inline]
578 pub fn build_fcmp_ogt(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
579 self.build_fcmp_ogt_with_name(lhs, rhs, "")
580 }
581
582 #[inline]
583 pub fn build_fcmp_ogt_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
584 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
585 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealOGT, lhs, rhs, val_name_ptr) }
586 }
587
588 #[inline]
589 pub fn build_fcmp_oge(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
590 self.build_fcmp_oge_with_name(lhs, rhs, "")
591 }
592
593 #[inline]
594 pub fn build_fcmp_oge_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
595 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
596 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealOGE, lhs, rhs, val_name_ptr) }
597 }
598
599 #[inline]
600 pub fn build_fcmp_olt(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
601 self.build_fcmp_olt_with_name(lhs, rhs, "")
602 }
603
604 #[inline]
605 pub fn build_fcmp_olt_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
606 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
607 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealOLT, lhs, rhs, val_name_ptr) }
608 }
609
610 #[inline]
611 pub fn build_fcmp_ole(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
612 self.build_fcmp_ole_with_name(lhs, rhs, "")
613 }
614
615 #[inline]
616 pub fn build_fcmp_ole_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
617 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
618 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealOLE, lhs, rhs, val_name_ptr) }
619 }
620
621 #[inline]
622 pub fn build_fcmp_uno(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
623 self.build_fcmp_uno_with_name(lhs, rhs, "")
624 }
625
626 #[inline]
627 pub fn build_fcmp_uno_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
628 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
629 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealUNO, lhs, rhs, val_name_ptr) }
630 }
631
632 #[inline]
633 pub fn build_fcmp_ueq(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
634 self.build_fcmp_ueq_with_name(lhs, rhs, "")
635 }
636
637 #[inline]
638 pub fn build_fcmp_ueq_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
639 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
640 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealUEQ, lhs, rhs, val_name_ptr) }
641 }
642
643 #[inline]
644 pub fn build_fcmp_une(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
645 self.build_fcmp_une_with_name(lhs, rhs, "")
646 }
647
648 #[inline]
649 pub fn build_fcmp_une_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
650 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
651 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealUNE, lhs, rhs, val_name_ptr) }
652 }
653
654 #[inline]
655 pub fn build_fcmp_ugt(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
656 self.build_fcmp_ugt_with_name(lhs, rhs, "")
657 }
658
659 #[inline]
660 pub fn build_fcmp_ugt_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
661 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
662 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealUGT, lhs, rhs, val_name_ptr) }
663 }
664
665 #[inline]
666 pub fn build_fcmp_uge(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
667 self.build_fcmp_uge_with_name(lhs, rhs, "")
668 }
669
670 #[inline]
671 pub fn build_fcmp_uge_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
672 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
673 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealUGE, lhs, rhs, val_name_ptr) }
674 }
675
676 #[inline]
677 pub fn build_fcmp_ult(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
678 self.build_fcmp_ult_with_name(lhs, rhs, "")
679 }
680
681 #[inline]
682 pub fn build_fcmp_ult_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
683 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
684 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealULT, lhs, rhs, val_name_ptr) }
685 }
686
687 #[inline]
688 pub fn build_fcmp_ule(&self, lhs: LLVMValueRef, rhs: LLVMValueRef) -> LLVMValueRef {
689 self.build_fcmp_ule_with_name(lhs, rhs, "")
690 }
691
692 #[inline]
693 pub fn build_fcmp_ule_with_name(&self, lhs: LLVMValueRef, rhs: LLVMValueRef, name: &str) -> LLVMValueRef {
694 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
695 unsafe { LLVMBuildFCmp(self.llvm_builder, LLVMRealULE, lhs, rhs, val_name_ptr) }
696 }
697
698 #[inline]
699 pub fn build_global_string_ptr(&self, string: &str) -> LLVMValueRef {
700 self.build_global_string_ptr_with_name(string, "")
701 }
702
703 #[inline]
704 pub fn build_global_string_ptr_with_name(&self, string: &str, name: &str) -> LLVMValueRef {
705 let val_str_ptr = CStringManager::new_cstring_as_ptr(string);
706 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
707 unsafe { LLVMBuildGlobalStringPtr(self.llvm_builder, val_str_ptr, val_name_ptr) }
708 }
709
710 #[inline]
711 pub fn build_call(&self, func: LLVMValueRef, params: &mut [LLVMValueRef]) -> LLVMValueRef {
712 self.build_call_with_name(func, params, "")
713 }
714
715 #[inline]
716 pub fn build_call_with_name(&self, func: LLVMValueRef, params: &mut [LLVMValueRef], name: &str) -> LLVMValueRef {
717 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
718 unsafe { LLVMBuildCall(self.llvm_builder, func, params.as_mut_ptr(), params.len() as u32, val_name_ptr) }
719 }
720
721 #[inline]
722 pub fn build_tail_call(&self, func: LLVMValueRef, params: &mut [LLVMValueRef]) -> LLVMValueRef {
723 self.build_tail_call_with_name(func, params, "")
724 }
725
726 #[inline]
727 pub fn build_tail_call_with_name(&self, func: LLVMValueRef, params: &mut [LLVMValueRef], name: &str) -> LLVMValueRef {
728 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
729 unsafe {
730 let call = LLVMBuildCall(self.llvm_builder, func, params.as_mut_ptr(), params.len() as u32, val_name_ptr);
731 LLVMSetTailCall(call, 1); call
733 }
734 }
735
736 #[inline]
737 pub fn build_br(&self, dest_block: LLVMBasicBlockRef) -> LLVMValueRef {
738 unsafe { LLVMBuildBr(self.llvm_builder, dest_block) }
739 }
740
741 #[inline]
742 pub fn build_cond_br(&self, condition: LLVMValueRef, then_block: LLVMBasicBlockRef, else_block: LLVMBasicBlockRef) -> LLVMValueRef {
743 unsafe { LLVMBuildCondBr(self.llvm_builder, condition, then_block, else_block) }
744 }
745
746 #[inline]
747 pub fn build_switch(&self, value: LLVMValueRef, default: LLVMBasicBlockRef, cases: &[(LLVMValueRef, LLVMBasicBlockRef)]) -> LLVMValueRef {
748 unsafe {
749 let switch = LLVMBuildSwitch(self.llvm_builder, value, default, cases.len() as u32);
750 for case in cases {
751 LLVMAddCase(switch, case.0, case.1);
752 }
753 switch
754 }
755 }
756
757 #[inline]
758 pub fn build_sext(&self, value: LLVMValueRef, dest_type: LLVMTypeRef) -> LLVMValueRef {
759 self.build_sext_with_name(value, dest_type, "")
760 }
761
762 #[inline]
763 pub fn build_sext_with_name(&self, value: LLVMValueRef, dest_type: LLVMTypeRef, name: &str) -> LLVMValueRef {
764 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
765 unsafe { LLVMBuildSExt(self.llvm_builder, value, dest_type, val_name_ptr) }
766 }
767
768 #[inline]
769 pub fn build_inbounds_gep(&self, target: LLVMValueRef, indices: &mut [LLVMValueRef]) -> LLVMValueRef {
770 self.build_inbounds_gep_with_name(target, indices, "")
771 }
772
773 #[inline]
774 pub fn build_inbounds_gep_with_name(&self, target: LLVMValueRef, indices: &mut [LLVMValueRef], name: &str) -> LLVMValueRef {
775 let val_name_ptr = CStringManager::new_cstring_as_ptr(name);
776 unsafe { LLVMBuildInBoundsGEP(self.llvm_builder, target, indices.as_mut_ptr(), indices.len() as u32, val_name_ptr) }
777 }
778
779 #[inline]
780 pub fn build_phi(&self, typ: LLVMTypeRef) -> Phi {
781 Phi::new(self.llvm_builder, typ, "")
782 }
783
784 #[inline]
785 pub fn build_phi_with_name(&self, typ: LLVMTypeRef, name: &str) -> Phi {
786 Phi::new(self.llvm_builder, typ, name)
787 }
788}
789
790impl Drop for Builder {
791 #[inline]
792 fn drop(&mut self) {
793 unsafe { LLVMDisposeBuilder(self.llvm_builder) }
794 }
795}