1 /*===-- llvm_ocaml.h - LLVM Ocaml Glue --------------------------*- C++ -*-===*\
3 |* The LLVM Compiler Infrastructure *|
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. *|
8 |*===----------------------------------------------------------------------===*|
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. *|
13 |* Note that these functions intentionally take liberties with the CAMLparamX *|
14 |* macros, since most of the parameters are not GC heap objects. *|
16 \*===----------------------------------------------------------------------===*/
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"
28 /*===-- Modules -----------------------------------------------------------===*/
30 /* string -> llmodule */
31 CAMLprim LLVMModuleRef llvm_create_module(value ModuleID) {
32 return LLVMModuleCreateWithName(String_val(ModuleID));
35 /* llmodule -> unit */
36 CAMLprim value llvm_dispose_module(LLVMModuleRef M) {
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);
47 /* string -> llmodule -> unit */
48 CAMLprim value llvm_delete_type_name(value Name, LLVMModuleRef M) {
49 LLVMDeleteTypeName(M, String_val(Name));
54 /*===-- Types -------------------------------------------------------------===*/
56 /* lltype -> type_kind */
57 CAMLprim value llvm_classify_type(LLVMTypeRef Ty) {
58 return Val_int(LLVMGetTypeKind(Ty));
61 /* lltype -> lltype -> unit */
62 CAMLprim value llvm_refine_abstract_type(LLVMTypeRef ConcreteTy,
63 LLVMTypeRef AbstractTy) {
64 LLVMRefineAbstractType(AbstractTy, ConcreteTy);
68 /*--... Operations on integer types ........................................--*/
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(); }
78 CAMLprim LLVMTypeRef llvm_make_integer_type(value Width) {
79 return LLVMCreateIntType(Int_val(Width));
83 CAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) {
84 return Val_int(LLVMGetIntTypeWidth(IntegerTy));
87 /*--... Operations on real types ...........................................--*/
90 CAMLprim LLVMTypeRef llvm_float_type(value Unit) {
91 return LLVMFloatType();
95 CAMLprim LLVMTypeRef llvm_double_type(value Unit) {
96 return LLVMDoubleType();
100 CAMLprim LLVMTypeRef llvm_x86fp80_type(value Unit) {
101 return LLVMX86FP80Type();
105 CAMLprim LLVMTypeRef llvm_fp128_type(value Unit) {
106 return LLVMFP128Type();
110 CAMLprim LLVMTypeRef llvm_ppc_fp128_type(value Unit) {
111 return LLVMPPCFP128Type();
114 /*--... Operations on function types .......................................--*/
116 /* lltype -> lltype array -> bool -> lltype */
117 CAMLprim LLVMTypeRef llvm_make_function_type(LLVMTypeRef RetTy, value ParamTys,
119 return LLVMCreateFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
120 Wosize_val(ParamTys),
125 CAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) {
126 return Val_bool(LLVMIsFunctionVarArg(FunTy));
129 /* lltype -> lltype */
130 CAMLprim LLVMTypeRef llvm_return_type(LLVMTypeRef FunTy) {
131 return LLVMGetReturnType(FunTy);
134 /* lltype -> lltype array */
135 CAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
136 value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
137 LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
141 /*--... Operations on struct types .........................................--*/
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),
150 /* lltype -> lltype array */
151 CAMLprim value llvm_element_types(LLVMTypeRef StructTy) {
152 value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
153 LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
158 CAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
159 return Val_bool(LLVMIsPackedStruct(StructTy));
162 /*--... Operations on array, pointer, and vector types .....................--*/
164 /* lltype -> int -> lltype */
165 CAMLprim value llvm_make_array_type(LLVMTypeRef ElementTy, value Count) {
166 return (value) LLVMCreateArrayType(ElementTy, Int_val(Count));
169 /* lltype -> lltype */
170 CAMLprim LLVMTypeRef llvm_make_pointer_type(LLVMTypeRef ElementTy) {
171 return LLVMCreatePointerType(ElementTy);
174 /* lltype -> int -> lltype */
175 CAMLprim LLVMTypeRef llvm_make_vector_type(LLVMTypeRef ElementTy, value Count) {
176 return LLVMCreateVectorType(ElementTy, Int_val(Count));
179 /* lltype -> lltype */
180 CAMLprim LLVMTypeRef llvm_element_type(LLVMTypeRef Ty) {
181 return LLVMGetElementType(Ty);
185 CAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
186 return Val_int(LLVMGetArrayLength(ArrayTy));
190 CAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
191 return Val_int(LLVMGetVectorSize(VectorTy));
194 /*--... Operations on other types ..........................................--*/
197 CAMLprim LLVMTypeRef llvm_void_type (value Unit) { return LLVMVoidType(); }
198 CAMLprim LLVMTypeRef llvm_label_type(value Unit) { return LLVMLabelType(); }
201 CAMLprim LLVMTypeRef llvm_make_opaque_type(value Unit) {
202 return LLVMCreateOpaqueType();
206 /*===-- VALUES ------------------------------------------------------------===*/
208 /* llvalue -> lltype */
209 CAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
210 return LLVMTypeOf(Val);
213 /* llvalue -> string */
214 CAMLprim value llvm_value_name(LLVMValueRef Val) {
215 return copy_string(LLVMGetValueName(Val));
218 /* string -> llvalue -> unit */
219 CAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
220 LLVMSetValueName(Val, String_val(Name));
224 /*--... Operations on constants of (mostly) any type .......................--*/
226 /* llvalue -> bool */
227 CAMLprim value llvm_is_constant(LLVMValueRef Val) {
228 return Val_bool(LLVMIsConstant(Val));
231 /* llvalue -> bool */
232 CAMLprim value llvm_is_null(LLVMValueRef Val) {
233 return Val_bool(LLVMIsNull(Val));
236 /* llvalue -> bool */
237 CAMLprim value llvm_is_undef(LLVMValueRef Val) {
238 return Val_bool(LLVMIsUndef(Val));
241 /*--... Operations on scalar constants .....................................--*/
243 /* lltype -> int -> bool -> llvalue */
244 CAMLprim LLVMValueRef llvm_make_int_constant(LLVMTypeRef IntTy, value N,
246 /* GCC warns if we use the ternary operator. */
247 unsigned long long N2;
249 N2 = (value) Int_val(N);
251 N2 = (mlsize_t) Int_val(N);
253 return LLVMGetIntConstant(IntTy, N2, Bool_val(SExt));
256 /* lltype -> Int64.t -> bool -> llvalue */
257 CAMLprim LLVMValueRef llvm_make_int64_constant(LLVMTypeRef IntTy, value N,
259 return LLVMGetIntConstant(IntTy, Int64_val(N), Bool_val(SExt));
262 /* lltype -> float -> llvalue */
263 CAMLprim LLVMValueRef llvm_make_real_constant(LLVMTypeRef RealTy, value N) {
264 return LLVMGetRealConstant(RealTy, Double_val(N));
267 /*--... Operations on composite constants ..................................--*/
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);
275 /* lltype -> llvalue array -> llvalue */
276 CAMLprim LLVMValueRef llvm_make_array_constant(LLVMTypeRef ElementTy,
278 return LLVMGetArrayConstant(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
279 Wosize_val(ElementVals));
282 /* llvalue array -> bool -> llvalue */
283 CAMLprim LLVMValueRef llvm_make_struct_constant(value ElementVals,
285 return LLVMGetStructConstant((LLVMValueRef *) Op_val(ElementVals),
286 Wosize_val(ElementVals), Bool_val(Packed));
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));
295 /*--... Operations on global variables, functions, and aliases (globals) ...--*/
297 /* llvalue -> bool */
298 CAMLprim value llvm_is_declaration(LLVMValueRef Global) {
299 return Val_bool(LLVMIsDeclaration(Global));
302 /* llvalue -> linkage */
303 CAMLprim value llvm_linkage(LLVMValueRef Global) {
304 return Val_int(LLVMGetLinkage(Global));
307 /* linkage -> llvalue -> unit */
308 CAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
309 LLVMSetLinkage(Global, Int_val(Linkage));
313 /* llvalue -> string */
314 CAMLprim value llvm_section(LLVMValueRef Global) {
315 return copy_string(LLVMGetSection(Global));
318 /* string -> llvalue -> unit */
319 CAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
320 LLVMSetSection(Global, String_val(Section));
324 /* llvalue -> visibility */
325 CAMLprim value llvm_visibility(LLVMValueRef Global) {
326 return Val_int(LLVMGetVisibility(Global));
329 /* visibility -> llvalue -> unit */
330 CAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
331 LLVMSetVisibility(Global, Int_val(Viz));
336 CAMLprim value llvm_alignment(LLVMValueRef Global) {
337 return Val_int(LLVMGetAlignment(Global));
340 /* int -> llvalue -> unit */
341 CAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
342 LLVMSetAlignment(Global, Int_val(Bytes));
346 /*--... Operations on global variables .....................................--*/
348 /* lltype -> string -> llmodule -> llvalue */
349 CAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
351 return LLVMAddGlobal(M, Ty, String_val(Name));
354 /* string -> llvalue -> llmodule -> llvalue */
355 CAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
357 LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
359 LLVMSetInitializer(GlobalVar, Initializer);
363 /* llvalue -> unit */
364 CAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
365 LLVMDeleteGlobal(GlobalVar);
369 /* llvalue -> llvalue -> unit */
370 CAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
371 LLVMValueRef GlobalVar) {
372 LLVMSetInitializer(GlobalVar, ConstantVal);
376 /* llvalue -> unit */
377 CAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
378 LLVMSetInitializer(GlobalVar, NULL);
382 /* llvalue -> bool */
383 CAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
384 return Val_bool(LLVMIsThreadLocal(GlobalVar));
387 /* bool -> llvalue -> unit */
388 CAMLprim value llvm_set_thread_local(value IsThreadLocal,
389 LLVMValueRef GlobalVar) {
390 LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
394 /*--... Operations on functions ............................................--*/
396 /* string -> lltype -> llmodule -> llvalue */
397 CAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
399 return LLVMAddFunction(M, String_val(Name), Ty);
402 /* string -> lltype -> llmodule -> llvalue */
403 CAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
405 LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
406 LLVMAppendBasicBlock(Fn, "entry");
410 /* llvalue -> unit */
411 CAMLprim value llvm_delete_function(LLVMValueRef Fn) {
412 LLVMDeleteFunction(Fn);
416 /* llvalue -> int -> llvalue */
417 CAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
418 return LLVMGetParam(Fn, Int_val(Index));
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));
428 /* llvalue -> bool */
429 CAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
430 return Val_bool(LLVMGetIntrinsicID(Fn));
434 CAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
435 return Val_int(LLVMGetFunctionCallConv(Fn));
438 /* int -> llvalue -> unit */
439 CAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
440 LLVMSetFunctionCallConv(Fn, Int_val(Id));
444 /*--... Operations on basic blocks .........................................--*/
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));
453 /* llbasicblock -> unit */
454 CAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
455 LLVMDeleteBasicBlock(BB);
459 /* string -> llvalue -> llbasicblock */
460 CAMLprim LLVMBasicBlockRef llvm_append_block(value Name, LLVMValueRef Fn) {
461 return LLVMAppendBasicBlock(Fn, String_val(Name));
464 /* string -> llbasicblock -> llbasicblock */
465 CAMLprim LLVMBasicBlockRef llvm_insert_block(value Name, LLVMBasicBlockRef BB) {
466 return LLVMInsertBasicBlock(BB, String_val(Name));
469 /* llvalue -> bool */
470 CAMLprim value llvm_value_is_block(LLVMValueRef Val) {
471 return Val_bool(LLVMValueIsBasicBlock(Val));
475 /*===-- Instruction builders ----------------------------------------------===*/
477 #define Builder_val(v) (*(LLVMBuilderRef *)(Data_custom_val(v)))
479 void llvm_finalize_builder(value B) {
480 fprintf(stderr, "disposing builder = 0x%08x\n", (int) Builder_val(B));
481 LLVMDisposeBuilder(Builder_val(B));
484 static struct custom_operations builder_ops = {
485 (char *) "LLVMBuilder",
486 llvm_finalize_builder,
487 custom_compare_default,
489 custom_serialize_default,
490 custom_deserialize_default
493 /* llvalue -> llbuilder */
494 CAMLprim value llvm_builder_before(LLVMValueRef Inst) {
496 LLVMBuilderRef B = LLVMCreateBuilder();
497 LLVMPositionBuilderBefore(B, Inst);
498 V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
503 /* llbasicblock -> llbuilder */
504 CAMLprim value llvm_builder_at_end(LLVMBasicBlockRef BB) {
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);
514 /* llvalue -> llbuilder -> unit */
515 CAMLprim value llvm_position_before(LLVMValueRef Inst, value B) {
516 LLVMPositionBuilderBefore(Builder_val(B), Inst);
520 /* llbasicblock -> llbuilder -> unit */
521 CAMLprim value llvm_position_at_end(LLVMBasicBlockRef BB, value B) {
522 LLVMPositionBuilderAtEnd(Builder_val(B), BB);
526 /*--... Terminators ........................................................--*/
528 /* llbuilder -> llvalue */
529 CAMLprim LLVMValueRef llvm_build_ret_void(value B) {
530 return LLVMBuildRetVoid(Builder_val(B));
533 /* llvalue -> llbuilder -> llvalue */
534 CAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
535 return LLVMBuildRet(Builder_val(B), Val);
538 /* llbasicblock -> llbuilder -> llvalue */
539 CAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
540 return LLVMBuildBr(Builder_val(B), BB);
543 /* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
544 CAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
545 LLVMBasicBlockRef Then,
546 LLVMBasicBlockRef Else,
548 return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
551 /* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
552 CAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
553 LLVMBasicBlockRef Else,
554 value EstimatedCount,
556 return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
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));
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],
578 /* llbuilder -> llvalue */
579 CAMLprim LLVMValueRef llvm_build_unwind(value B) {
580 return LLVMBuildUnwind(Builder_val(B));
583 /* llbuilder -> llvalue */
584 CAMLprim LLVMValueRef llvm_build_unreachable(value B) {
585 return LLVMBuildUnreachable(Builder_val(B));
588 /*--... Arithmetic .........................................................--*/
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
692 /*--... Memory .............................................................--*/
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));
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));
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));
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));
718 /* llvalue -> llbuilder -> llvalue */
719 CAMLprim LLVMValueRef llvm_build_free(LLVMValueRef Pointer, value B) {
720 return LLVMBuildFree(Builder_val(B), Pointer);
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));
729 /* llvalue -> llvalue -> llbuilder -> llvalue */
730 CAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
732 return LLVMBuildStore(Builder_val(B), Value, Pointer);
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),
743 /*--... Casts ..............................................................--*/
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
817 /*--... Comparisons ........................................................--*/
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,
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,
835 /*--... Miscellaneous instructions .........................................--*/
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));
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));
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));
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));
863 /* llvalue -> llvalue -> string -> llbuilder -> llvalue */
864 CAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
866 value Name, value B) {
867 return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
870 /* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
871 CAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
872 LLVMValueRef Element,
874 value Name, value B) {
875 return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
879 /* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
880 CAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
882 value Name, value B) {
883 return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));