llvm_sys_wrapper/
builder.rs

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); // set tail call opt
732            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}