Added C and Ocaml bindings for functions, basic blocks, and
[oota-llvm.git] / bindings / ocaml / llvm / llvm_ocaml.c
1 /*===-- llvm_ocaml.h - LLVM Ocaml Glue --------------------------*- C++ -*-===*\
2 |*                                                                            *|
3 |*                     The LLVM Compiler Infrastructure                       *|
4 |*                                                                            *|
5 |* This file was developed by Gordon Henriksen and is distributed under the   *|
6 |* University of Illinois Open Source License. See LICENSE.TXT for details.   *|
7 |*                                                                            *|
8 |*===----------------------------------------------------------------------===*|
9 |*                                                                            *|
10 |* This file glues LLVM's ocaml interface to its C interface. These functions *|
11 |* are by and large transparent wrappers to the corresponding C functions.    *|
12 |*                                                                            *|
13 |* Note that these functions intentionally take liberties with the CAMLparamX *|
14 |* macros, since most of the parameters are not GC heap objects.              *|
15 |*                                                                            *|
16 \*===----------------------------------------------------------------------===*/
17
18 #include "llvm-c/Core.h"
19 #include "caml/alloc.h"
20 #include "caml/custom.h"
21 #include "caml/mlvalues.h"
22 #include "caml/memory.h"
23 #include "llvm/Config/config.h" 
24 #include <stdio.h>
25 #include <string.h>
26
27
28 /*===-- Modules -----------------------------------------------------------===*/
29
30 /* string -> llmodule */
31 CAMLprim LLVMModuleRef llvm_create_module(value ModuleID) {
32   return LLVMModuleCreateWithName(String_val(ModuleID));
33 }
34
35 /* llmodule -> unit */
36 CAMLprim value llvm_dispose_module(LLVMModuleRef M) {
37   LLVMDisposeModule(M);
38   return Val_unit;
39 }
40
41 /* string -> lltype -> llmodule -> bool */
42 CAMLprim value llvm_add_type_name(value Name, LLVMTypeRef Ty, LLVMModuleRef M) {
43   int res = LLVMAddTypeName(M, String_val(Name), Ty);
44   return Val_bool(res == 0);
45 }
46
47 /* string -> llmodule -> unit */
48 CAMLprim value llvm_delete_type_name(value Name, LLVMModuleRef M) {
49   LLVMDeleteTypeName(M, String_val(Name));
50   return Val_unit;
51 }
52
53
54 /*===-- Types -------------------------------------------------------------===*/
55
56 /* lltype -> type_kind */
57 CAMLprim value llvm_classify_type(LLVMTypeRef Ty) {
58   return Val_int(LLVMGetTypeKind(Ty));
59 }
60
61 /* lltype -> lltype -> unit */
62 CAMLprim value llvm_refine_abstract_type(LLVMTypeRef ConcreteTy,
63                                          LLVMTypeRef AbstractTy) {
64   LLVMRefineAbstractType(AbstractTy, ConcreteTy);
65   return Val_unit;
66 }
67
68 /*--... Operations on integer types ........................................--*/
69
70 /* unit -> lltype */
71 CAMLprim LLVMTypeRef llvm_i1_type (value Unit) { return LLVMInt1Type();  }
72 CAMLprim LLVMTypeRef llvm_i8_type (value Unit) { return LLVMInt8Type();  }
73 CAMLprim LLVMTypeRef llvm_i16_type(value Unit) { return LLVMInt16Type(); }
74 CAMLprim LLVMTypeRef llvm_i32_type(value Unit) { return LLVMInt32Type(); }
75 CAMLprim LLVMTypeRef llvm_i64_type(value Unit) { return LLVMInt64Type(); }
76
77 /* int -> lltype */
78 CAMLprim LLVMTypeRef llvm_make_integer_type(value Width) {
79   return LLVMCreateIntType(Int_val(Width));
80 }
81
82 /* lltype -> int */
83 CAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) {
84   return Val_int(LLVMGetIntTypeWidth(IntegerTy));
85 }
86
87 /*--... Operations on real types ...........................................--*/
88
89 /* unit -> lltype */
90 CAMLprim LLVMTypeRef llvm_float_type(value Unit) {
91   return LLVMFloatType();
92 }
93
94 /* unit -> lltype */
95 CAMLprim LLVMTypeRef llvm_double_type(value Unit) {
96   return LLVMDoubleType();
97 }
98
99 /* unit -> lltype */
100 CAMLprim LLVMTypeRef llvm_x86fp80_type(value Unit) {
101   return LLVMX86FP80Type();
102 }
103
104 /* unit -> lltype */
105 CAMLprim LLVMTypeRef llvm_fp128_type(value Unit) {
106   return LLVMFP128Type();
107 }
108
109 /* unit -> lltype */
110 CAMLprim LLVMTypeRef llvm_ppc_fp128_type(value Unit) {
111   return LLVMPPCFP128Type();
112 }
113
114 /*--... Operations on function types .......................................--*/
115
116 /* lltype -> lltype array -> bool -> lltype */
117 CAMLprim LLVMTypeRef llvm_make_function_type(LLVMTypeRef RetTy, value ParamTys,
118                                              value IsVarArg) {
119   return LLVMCreateFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
120                                 Wosize_val(ParamTys),
121                                 Bool_val(IsVarArg));
122 }
123
124 /* lltype -> bool */
125 CAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) {
126   return Val_bool(LLVMIsFunctionVarArg(FunTy));
127 }
128
129 /* lltype -> lltype */
130 CAMLprim LLVMTypeRef llvm_return_type(LLVMTypeRef FunTy) {
131   return LLVMGetReturnType(FunTy);
132 }
133
134 /* lltype -> lltype array */
135 CAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
136   value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
137   LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
138   return Tys;
139 }
140
141 /*--... Operations on struct types .........................................--*/
142
143 /* lltype array -> bool -> lltype */
144 CAMLprim value llvm_make_struct_type(value ElementTypes, value Packed) {
145   return (value) LLVMCreateStructType((LLVMTypeRef *) ElementTypes,
146                                       Wosize_val(ElementTypes),
147                                       Bool_val(Packed));
148 }
149
150 /* lltype -> lltype array */
151 CAMLprim value llvm_element_types(LLVMTypeRef StructTy) {
152   value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
153   LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
154   return Tys;
155 }
156
157 /* lltype -> bool */
158 CAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
159   return Val_bool(LLVMIsPackedStruct(StructTy));
160 }
161
162 /*--... Operations on array, pointer, and vector types .....................--*/
163
164 /* lltype -> int -> lltype */
165 CAMLprim value llvm_make_array_type(LLVMTypeRef ElementTy, value Count) {
166   return (value) LLVMCreateArrayType(ElementTy, Int_val(Count));
167 }
168
169 /* lltype -> lltype */
170 CAMLprim LLVMTypeRef llvm_make_pointer_type(LLVMTypeRef ElementTy) {
171   return LLVMCreatePointerType(ElementTy);
172 }
173
174 /* lltype -> int -> lltype */
175 CAMLprim LLVMTypeRef llvm_make_vector_type(LLVMTypeRef ElementTy, value Count) {
176   return LLVMCreateVectorType(ElementTy, Int_val(Count));
177 }
178
179 /* lltype -> lltype */
180 CAMLprim LLVMTypeRef llvm_element_type(LLVMTypeRef Ty) {
181   return LLVMGetElementType(Ty);
182 }
183
184 /* lltype -> int */
185 CAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
186   return Val_int(LLVMGetArrayLength(ArrayTy));
187 }
188
189 /* lltype -> int */
190 CAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
191   return Val_int(LLVMGetVectorSize(VectorTy));
192 }
193
194 /*--... Operations on other types ..........................................--*/
195
196 /* unit -> lltype */
197 CAMLprim LLVMTypeRef llvm_void_type (value Unit) { return LLVMVoidType();  }
198 CAMLprim LLVMTypeRef llvm_label_type(value Unit) { return LLVMLabelType(); }
199
200 /* unit -> lltype */
201 CAMLprim LLVMTypeRef llvm_make_opaque_type(value Unit) {
202   return LLVMCreateOpaqueType();
203 }
204
205
206 /*===-- VALUES ------------------------------------------------------------===*/
207
208 /* llvalue -> lltype */
209 CAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
210   return LLVMTypeOf(Val);
211 }
212
213 /* llvalue -> string */
214 CAMLprim value llvm_value_name(LLVMValueRef Val) {
215   return copy_string(LLVMGetValueName(Val));
216 }
217
218 /* string -> llvalue -> unit */
219 CAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
220   LLVMSetValueName(Val, String_val(Name));
221   return Val_unit;
222 }
223
224 /*--... Operations on constants of (mostly) any type .......................--*/
225
226 /* llvalue -> bool */
227 CAMLprim value llvm_is_constant(LLVMValueRef Val) {
228   return Val_bool(LLVMIsConstant(Val));
229 }
230
231 /* llvalue -> bool */
232 CAMLprim value llvm_is_null(LLVMValueRef Val) {
233   return Val_bool(LLVMIsNull(Val));
234 }
235
236 /* llvalue -> bool */
237 CAMLprim value llvm_is_undef(LLVMValueRef Val) {
238   return Val_bool(LLVMIsUndef(Val));
239 }
240
241 /*--... Operations on scalar constants .....................................--*/
242
243 /* lltype -> int -> bool -> llvalue */
244 CAMLprim LLVMValueRef llvm_make_int_constant(LLVMTypeRef IntTy, value N,
245                                              value SExt) {
246   /* GCC warns if we use the ternary operator. */
247   unsigned long long N2;
248   if (Bool_val(SExt))
249     N2 = (value) Int_val(N);
250   else
251     N2 = (mlsize_t) Int_val(N);
252   
253   return LLVMGetIntConstant(IntTy, N2, Bool_val(SExt));
254 }
255
256 /* lltype -> Int64.t -> bool -> llvalue */
257 CAMLprim LLVMValueRef llvm_make_int64_constant(LLVMTypeRef IntTy, value N,
258                                                value SExt) {
259   return LLVMGetIntConstant(IntTy, Int64_val(N), Bool_val(SExt));
260 }
261
262 /* lltype -> float -> llvalue */
263 CAMLprim LLVMValueRef llvm_make_real_constant(LLVMTypeRef RealTy, value N) {
264   return LLVMGetRealConstant(RealTy, Double_val(N));
265 }
266
267 /*--... Operations on composite constants ..................................--*/
268
269 /* string -> bool -> llvalue */
270 CAMLprim LLVMValueRef llvm_make_string_constant(value Str, value NullTerminate) {
271   return LLVMGetStringConstant(String_val(Str), string_length(Str),
272                                Bool_val(NullTerminate) == 0);
273 }
274
275 /* lltype -> llvalue array -> llvalue */
276 CAMLprim LLVMValueRef llvm_make_array_constant(LLVMTypeRef ElementTy,
277                                                value ElementVals) {
278   return LLVMGetArrayConstant(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
279                               Wosize_val(ElementVals));
280 }
281
282 /* llvalue array -> bool -> llvalue */
283 CAMLprim LLVMValueRef llvm_make_struct_constant(value ElementVals,
284                                                 value Packed) {
285   return LLVMGetStructConstant((LLVMValueRef *) Op_val(ElementVals),
286                                Wosize_val(ElementVals), Bool_val(Packed));
287 }
288
289 /* llvalue array -> llvalue */
290 CAMLprim value llvm_make_vector_constant(value ElementVals) {
291   return (value) LLVMGetVectorConstant((LLVMValueRef*) Op_val(ElementVals),
292                                        Wosize_val(ElementVals));
293 }
294
295 /*--... Operations on global variables, functions, and aliases (globals) ...--*/
296
297 /* llvalue -> bool */
298 CAMLprim value llvm_is_declaration(LLVMValueRef Global) {
299   return Val_bool(LLVMIsDeclaration(Global));
300 }
301
302 /* llvalue -> linkage */
303 CAMLprim value llvm_linkage(LLVMValueRef Global) {
304   return Val_int(LLVMGetLinkage(Global));
305 }
306
307 /* linkage -> llvalue -> unit */
308 CAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
309   LLVMSetLinkage(Global, Int_val(Linkage));
310   return Val_unit;
311 }
312
313 /* llvalue -> string */
314 CAMLprim value llvm_section(LLVMValueRef Global) {
315   return copy_string(LLVMGetSection(Global));
316 }
317
318 /* string -> llvalue -> unit */
319 CAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
320   LLVMSetSection(Global, String_val(Section));
321   return Val_unit;
322 }
323
324 /* llvalue -> visibility */
325 CAMLprim value llvm_visibility(LLVMValueRef Global) {
326   return Val_int(LLVMGetVisibility(Global));
327 }
328
329 /* visibility -> llvalue -> unit */
330 CAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
331   LLVMSetVisibility(Global, Int_val(Viz));
332   return Val_unit;
333 }
334
335 /* llvalue -> int */
336 CAMLprim value llvm_alignment(LLVMValueRef Global) {
337   return Val_int(LLVMGetAlignment(Global));
338 }
339
340 /* int -> llvalue -> unit */
341 CAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
342   LLVMSetAlignment(Global, Int_val(Bytes));
343   return Val_unit;
344 }
345
346 /*--... Operations on global variables .....................................--*/
347
348 /* lltype -> string -> llmodule -> llvalue */
349 CAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
350                                           LLVMModuleRef M) {
351   return LLVMAddGlobal(M, Ty, String_val(Name));
352 }
353
354 /* string -> llvalue -> llmodule -> llvalue */
355 CAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
356                                          LLVMModuleRef M) {
357   LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
358                                          String_val(Name));
359   LLVMSetInitializer(GlobalVar, Initializer);
360   return GlobalVar;
361 }
362
363 /* llvalue -> unit */
364 CAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
365   LLVMDeleteGlobal(GlobalVar);
366   return Val_unit;
367 }
368
369 /* llvalue -> llvalue -> unit */
370 CAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
371                                     LLVMValueRef GlobalVar) {
372   LLVMSetInitializer(GlobalVar, ConstantVal);
373   return Val_unit;
374 }
375
376 /* llvalue -> unit */
377 CAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
378   LLVMSetInitializer(GlobalVar, NULL);
379   return Val_unit;
380 }
381
382 /* llvalue -> bool */
383 CAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
384   return Val_bool(LLVMIsThreadLocal(GlobalVar));
385 }
386
387 /* bool -> llvalue -> unit */
388 CAMLprim value llvm_set_thread_local(value IsThreadLocal,
389                                      LLVMValueRef GlobalVar) {
390   LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
391   return Val_unit;
392 }
393
394 /*--... Operations on functions ............................................--*/
395
396 /* string -> lltype -> llmodule -> llvalue */
397 CAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
398                                             LLVMModuleRef M) {
399   return LLVMAddFunction(M, String_val(Name), Ty);
400 }
401
402 /* string -> lltype -> llmodule -> llvalue */
403 CAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
404                                            LLVMModuleRef M) {
405   LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
406   LLVMAppendBasicBlock(Fn, "entry");
407   return Fn;
408 }
409
410 /* llvalue -> unit */
411 CAMLprim value llvm_delete_function(LLVMValueRef Fn) {
412   LLVMDeleteFunction(Fn);
413   return Val_unit;
414 }
415
416 /* llvalue -> int -> llvalue */
417 CAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
418   return LLVMGetParam(Fn, Int_val(Index));
419 }
420
421 /* llvalue -> int -> llvalue */
422 CAMLprim value llvm_params(LLVMValueRef Fn, value Index) {
423   value Params = alloc(LLVMCountParams(Fn), 0);
424   LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
425   return Params;
426 }
427
428 /* llvalue -> bool */
429 CAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
430   return Val_bool(LLVMGetIntrinsicID(Fn));
431 }
432
433 /* llvalue -> int */
434 CAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
435   return Val_int(LLVMGetFunctionCallConv(Fn));
436 }
437
438 /* int -> llvalue -> unit */
439 CAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
440   LLVMSetFunctionCallConv(Fn, Int_val(Id));
441   return Val_unit;
442 }
443
444 /*--... Operations on basic blocks .........................................--*/
445
446 /* llvalue -> llbasicblock array */
447 CAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
448   value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
449   LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
450   return MLArray;
451 }
452
453 /* llbasicblock -> unit */
454 CAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
455   LLVMDeleteBasicBlock(BB);
456   return Val_unit;
457 }
458
459 /* string -> llvalue -> llbasicblock */
460 CAMLprim LLVMBasicBlockRef llvm_append_block(value Name, LLVMValueRef Fn) {
461   return LLVMAppendBasicBlock(Fn, String_val(Name));
462 }
463
464 /* string -> llbasicblock -> llbasicblock */
465 CAMLprim LLVMBasicBlockRef llvm_insert_block(value Name, LLVMBasicBlockRef BB) {
466   return LLVMInsertBasicBlock(BB, String_val(Name));
467 }
468
469 /* llvalue -> bool */
470 CAMLprim value llvm_value_is_block(LLVMValueRef Val) {
471   return Val_bool(LLVMValueIsBasicBlock(Val));
472 }
473
474
475 /*===-- Instruction builders ----------------------------------------------===*/
476
477 #define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
478
479 void llvm_finalize_builder(value B) {
480   fprintf(stderr, "disposing builder = 0x%08x\n", (int) Builder_val(B));
481   LLVMDisposeBuilder(Builder_val(B));
482 }
483
484 static struct custom_operations builder_ops = {
485   (char *) "LLVMBuilder",
486   llvm_finalize_builder,
487   custom_compare_default,
488   custom_hash_default,
489   custom_serialize_default,
490   custom_deserialize_default
491 };
492
493 /* llvalue -> llbuilder */
494 CAMLprim value llvm_builder_before(LLVMValueRef Inst) {
495   value V;
496   LLVMBuilderRef B = LLVMCreateBuilder();
497   LLVMPositionBuilderBefore(B, Inst);
498   V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
499   Builder_val(V) = B;
500   return V;
501 }
502
503 /* llbasicblock -> llbuilder */
504 CAMLprim value llvm_builder_at_end(LLVMBasicBlockRef BB) {
505   value V;
506   LLVMBuilderRef B = LLVMCreateBuilder();
507   LLVMPositionBuilderAtEnd(B, BB);
508   fprintf(stderr, "returning builder = 0x%08x\n", (int) B);
509   V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
510   Builder_val(V) = B;
511   return V;
512 }
513
514 /* llvalue -> llbuilder -> unit */
515 CAMLprim value llvm_position_before(LLVMValueRef Inst, value B) {
516   LLVMPositionBuilderBefore(Builder_val(B), Inst);
517   return Val_unit;
518 }
519
520 /* llbasicblock -> llbuilder -> unit */
521 CAMLprim value llvm_position_at_end(LLVMBasicBlockRef BB, value B) {
522   LLVMPositionBuilderAtEnd(Builder_val(B), BB);
523   return Val_unit;
524 }
525
526 /*--... Terminators ........................................................--*/
527
528 /* llbuilder -> llvalue */
529 CAMLprim LLVMValueRef llvm_build_ret_void(value B) {
530   return LLVMBuildRetVoid(Builder_val(B));
531 }
532
533 /* llvalue -> llbuilder -> llvalue */
534 CAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
535   return LLVMBuildRet(Builder_val(B), Val);
536 }
537
538 /* llbasicblock -> llbuilder -> llvalue */
539 CAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
540   return LLVMBuildBr(Builder_val(B), BB);
541 }
542
543 /* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
544 CAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
545                                          LLVMBasicBlockRef Then,
546                                          LLVMBasicBlockRef Else,
547                                          value B) {
548   return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
549 }
550
551 /* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
552 CAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
553                                         LLVMBasicBlockRef Else,
554                                         value EstimatedCount,
555                                         value B) {
556   return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
557 }
558
559 /* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
560    llbuilder -> llvalue */
561 CAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
562                                             LLVMBasicBlockRef Then,
563                                             LLVMBasicBlockRef Catch,
564                                             value Name, value B) {
565   return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
566                          Wosize_val(Args), Then, Catch, String_val(Name));
567 }
568
569 /* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
570    llbuilder -> llvalue */
571 CAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
572   return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
573                                (LLVMBasicBlockRef) Args[2],
574                                (LLVMBasicBlockRef) Args[3],
575                                Args[4], Args[5]);
576 }
577
578 /* llbuilder -> llvalue */
579 CAMLprim LLVMValueRef llvm_build_unwind(value B) {
580   return LLVMBuildUnwind(Builder_val(B));
581 }
582
583 /* llbuilder -> llvalue */
584 CAMLprim LLVMValueRef llvm_build_unreachable(value B) {
585   return LLVMBuildUnreachable(Builder_val(B));
586 }
587
588 /*--... Arithmetic .........................................................--*/
589
590 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
591 CAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
592                                      value Name, value B) {
593   return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
594 }
595
596 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
597 CAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
598                                      value Name, value B) {
599   return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
600 }
601
602 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
603 CAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
604                                      value Name, value B) {
605   return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
606 }
607
608 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
609 CAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
610                                       value Name, value B) {
611   return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
612 }
613
614 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
615 CAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
616                                       value Name, value B) {
617   return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
618 }
619
620 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
621 CAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
622                                       value Name, value B) {
623   return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
624 }
625
626 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
627 CAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
628                                       value Name, value B) {
629   return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
630 }
631
632 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
633 CAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
634                                       value Name, value B) {
635   return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
636 }
637
638 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
639 CAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
640                                       value Name, value B) {
641   return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
642 }
643
644 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
645 CAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
646                                      value Name, value B) {
647   return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
648 }
649
650 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
651 CAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
652                                       value Name, value B) {
653   return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
654 }
655
656 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
657 CAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
658                                       value Name, value B) {
659   return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
660 }
661
662 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
663 CAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
664                                      value Name, value B) {
665   return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
666 }
667
668 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
669 CAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
670                                     value Name, value B) {
671   return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
672 }
673
674 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
675 CAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
676                                      value Name, value B) {
677   return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
678 }
679
680 /* llvalue -> string -> llbuilder -> llvalue */
681 CAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
682                                      value Name, value B) {
683   return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
684 }
685
686 /* llvalue -> string -> llbuilder -> llvalue */
687 CAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
688                                      value Name, value B) {
689   return LLVMBuildNot(Builder_val(B), X, String_val(Name));
690 }
691
692 /*--... Memory .............................................................--*/
693
694 /* lltype -> string -> llbuilder -> llvalue */
695 CAMLprim LLVMValueRef llvm_build_malloc(LLVMTypeRef Ty,
696                                         value Name, value B) {
697   return LLVMBuildMalloc(Builder_val(B), Ty, String_val(Name));
698 }
699
700 /* lltype -> llvalue -> string -> llbuilder -> llvalue */
701 CAMLprim LLVMValueRef llvm_build_array_malloc(LLVMTypeRef Ty, LLVMValueRef Size,
702                                               value Name, value B) {
703   return LLVMBuildArrayMalloc(Builder_val(B), Ty, Size, String_val(Name));
704 }
705
706 /* lltype -> string -> llbuilder -> llvalue */
707 CAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
708                                         value Name, value B) {
709   return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
710 }
711
712 /* lltype -> llvalue -> string -> llbuilder -> llvalue */
713 CAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
714                                               value Name, value B) {
715   return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
716 }
717
718 /* llvalue -> llbuilder -> llvalue */
719 CAMLprim LLVMValueRef llvm_build_free(LLVMValueRef Pointer, value B) {
720   return LLVMBuildFree(Builder_val(B), Pointer);
721 }
722
723 /* llvalue -> string -> llbuilder -> llvalue */
724 CAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
725                                       value Name, value B) {
726   return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
727 }
728
729 /* llvalue -> llvalue -> llbuilder -> llvalue */
730 CAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
731                                        value B) {
732   return LLVMBuildStore(Builder_val(B), Value, Pointer);
733 }
734
735 /* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
736 CAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
737                                      value Name, value B) {
738   return LLVMBuildGEP(Builder_val(B), Pointer,
739                       (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
740                       String_val(Name));
741 }
742
743 /*--... Casts ..............................................................--*/
744
745 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
746 CAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
747                                        value Name, value B) {
748   return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
749 }
750
751 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
752 CAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
753                                       value Name, value B) {
754   return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
755 }
756
757 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
758 CAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
759                                       value Name, value B) {
760   return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
761 }
762
763 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
764 CAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
765                                         value Name, value B) {
766   return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
767 }
768
769 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
770 CAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
771                                         value Name, value B) {
772   return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
773 }
774
775 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
776 CAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
777                                         value Name, value B) {
778   return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
779 }
780
781 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
782 CAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
783                                         value Name, value B) {
784   return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
785 }
786
787 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
788 CAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
789                                          value Name, value B) {
790   return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
791 }
792
793 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
794 CAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
795                                        value Name, value B) {
796   return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
797 }
798
799 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
800 CAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
801                                           value Name, value B) {
802   return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
803 }
804
805 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
806 CAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
807                                           value Name, value B) {
808   return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
809 }
810
811 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
812 CAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
813                                          value Name, value B) {
814   return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
815 }
816
817 /*--... Comparisons ........................................................--*/
818
819 /* int_predicate -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
820 CAMLprim LLVMValueRef llvm_build_icmp(value Pred,
821                                       LLVMValueRef LHS, LLVMValueRef RHS,
822                                       value Name, value B) {
823   return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
824                        String_val(Name));
825 }
826
827 /* real_predicate -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
828 CAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
829                                       LLVMValueRef LHS, LLVMValueRef RHS,
830                                       value Name, value B) {
831   return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
832                        String_val(Name));
833 }
834
835 /*--... Miscellaneous instructions .........................................--*/
836
837 /* lltype -> string -> llbuilder -> llvalue */
838 CAMLprim LLVMValueRef llvm_build_phi(LLVMTypeRef Ty,
839                                      value Name, value B) {
840   return LLVMBuildPhi(Builder_val(B), Ty, String_val(Name));
841 }
842
843 /* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
844 CAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
845                                       value Name, value B) {
846   return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
847                        Wosize_val(Params), String_val(Name));
848 }
849
850 /* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
851 CAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
852                                         LLVMValueRef Then, LLVMValueRef Else,
853                                         value Name, value B) {
854   return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
855 }
856
857 /* llvalue -> lltype -> string -> llbuilder -> llvalue */
858 CAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
859                                         value Name, value B) {
860   return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
861 }
862
863 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
864 CAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
865                                                 LLVMValueRef Idx,
866                                                 value Name, value B) {
867   return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
868 }
869
870 /* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
871 CAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
872                                                LLVMValueRef Element,
873                                                LLVMValueRef Idx,
874                                                value Name, value B) {
875   return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx, 
876                                 String_val(Name));
877 }
878
879 /* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
880 CAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
881                                                LLVMValueRef Mask,
882                                                value Name, value B) {
883   return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
884 }
885