llvm_ocaml.c revision 46abf91f7378fb7bb118d66fe6d69b5d3af1e9d5
18ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- llvm_ocaml.h - LLVM Ocaml Glue --------------------------*- C++ -*-===*\
28ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
38ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                     The LLVM Compiler Infrastructure                       *|
48ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
58ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* This file was developed by Gordon Henriksen and is distributed under the   *|
68ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* University of Illinois Open Source License. See LICENSE.TXT for details.   *|
78ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
88ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*===----------------------------------------------------------------------===*|
98ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* This file glues LLVM's ocaml interface to its C interface. These functions *|
118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* are by and large transparent wrappers to the corresponding C functions.    *|
128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* Note that these functions intentionally take liberties with the CAMLparamX *|
148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* macros, since most of the parameters are not GC heap objects.              *|
158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen\*===----------------------------------------------------------------------===*/
178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "llvm-c/Core.h"
198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/alloc.h"
2046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#include "caml/custom.h"
218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/mlvalues.h"
228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/memory.h"
239dbf8ed140666d7e26a586a91f3c5c16339151aaGabor Greif#include "llvm/Config/config.h"
249dbf8ed140666d7e26a586a91f3c5c16339151aaGabor Greif#include <stdio.h>
2546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#include <string.h>
268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/
298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llmodule */
3146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMModuleRef llvm_create_module(value ModuleID) {
3246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMModuleCreateWithName(String_val(ModuleID));
338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */
3646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) {
3746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeModule(M);
388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> lltype -> llmodule -> bool */
4246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_add_type_name(value Name, LLVMTypeRef Ty, LLVMModuleRef M) {
4346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  int res = LLVMAddTypeName(M, String_val(Name), Ty);
448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_bool(res == 0);
458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llmodule -> unit */
4846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_type_name(value Name, LLVMModuleRef M) {
4946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteTypeName(M, String_val(Name));
5046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
5146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
5246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/
558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> type_kind */
5746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) {
5846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetTypeKind(Ty));
598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype -> unit */
6246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_refine_abstract_type(LLVMTypeRef ConcreteTy,
6346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMTypeRef AbstractTy) {
6446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMRefineAbstractType(AbstractTy, ConcreteTy);
6546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/
698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
7146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i1_type (value Unit) { return LLVMInt1Type();  }
7246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i8_type (value Unit) { return LLVMInt8Type();  }
7346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i16_type(value Unit) { return LLVMInt16Type(); }
7446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i32_type(value Unit) { return LLVMInt32Type(); }
7546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i64_type(value Unit) { return LLVMInt64Type(); }
768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> lltype */
7846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_make_integer_type(value Width) {
7946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMCreateIntType(Int_val(Width));
808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
8346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) {
8446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetIntTypeWidth(IntegerTy));
858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/
888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
9046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_float_type(value Unit) {
9146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMFloatType();
928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
9546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_double_type(value Unit) {
9646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMDoubleType();
978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
10046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_x86fp80_type(value Unit) {
10146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMX86FP80Type();
1028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
10546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_fp128_type(value Unit) {
10646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMFP128Type();
1078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
11046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_ppc_fp128_type(value Unit) {
11146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMPPCFP128Type();
1128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/
1158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array -> bool -> lltype */
11746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_make_function_type(LLVMTypeRef RetTy, value ParamTys,
11846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                             value IsVarArg) {
11946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMCreateFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
12046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                Wosize_val(ParamTys),
12146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                Bool_val(IsVarArg));
1228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */
12546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) {
12646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsFunctionVarArg(FunTy));
1278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype */
13046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_return_type(LLVMTypeRef FunTy) {
13146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetReturnType(FunTy);
1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
13546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
13646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
13746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
13846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
1398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/
1428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype array -> bool -> lltype */
1448ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_struct_type(value ElementTypes, value Packed) {
1458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return (value) LLVMCreateStructType((LLVMTypeRef *) ElementTypes,
1468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                      Wosize_val(ElementTypes),
1478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                      Bool_val(Packed));
1488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
15146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_element_types(LLVMTypeRef StructTy) {
15246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
15346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
15446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
1558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
15746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */
15846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
15946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsPackedStruct(StructTy));
1608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/
1638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
16546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_make_array_type(LLVMTypeRef ElementTy, value Count) {
16646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return (value) LLVMCreateArrayType(ElementTy, Int_val(Count));
1678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype */
17046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_make_pointer_type(LLVMTypeRef ElementTy) {
17146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMCreatePointerType(ElementTy);
1728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
17546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_make_vector_type(LLVMTypeRef ElementTy, value Count) {
17646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMCreateVectorType(ElementTy, Int_val(Count));
1778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype */
18046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_element_type(LLVMTypeRef Ty) {
18146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetElementType(Ty);
1828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
18546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
18646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetArrayLength(ArrayTy));
1878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
19046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
19146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVectorSize(VectorTy));
1928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/
1958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
19746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_void_type (value Unit) { return LLVMVoidType();  }
19846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_label_type(value Unit) { return LLVMLabelType(); }
1998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
20146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_make_opaque_type(value Unit) {
20246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMCreateOpaqueType();
2038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/
2078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */
20946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
21046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMTypeOf(Val);
2118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
21446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) {
21546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetValueName(Val));
2168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
21946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
22046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetValueName(Val, String_val(Name));
2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
2258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
22746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
22846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
229344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
230344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
231344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
23246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
23346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
2348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
236344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
23746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
23846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
239344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
240344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
2418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
2428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> bool -> llvalue */
24446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_make_int_constant(LLVMTypeRef IntTy, value N,
24546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                             value SExt) {
2468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  /* GCC warns if we use the ternary operator. */
2478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  unsigned long long N2;
2488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  if (Bool_val(SExt))
249ab8588bf3cef0bd79f6a83608447cb007af8900bGabor Greif    N2 = (value) Int_val(N);
2508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  else
251ab8588bf3cef0bd79f6a83608447cb007af8900bGabor Greif    N2 = (mlsize_t) Int_val(N);
2528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
25346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetIntConstant(IntTy, N2, Bool_val(SExt));
2548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
256344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
25746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_make_int64_constant(LLVMTypeRef IntTy, value N,
25846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value SExt) {
25946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetIntConstant(IntTy, Int64_val(N), Bool_val(SExt));
260344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
261344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
2628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
26346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_make_real_constant(LLVMTypeRef RealTy, value N) {
26446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetRealConstant(RealTy, Double_val(N));
2658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
2688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> bool -> llvalue */
27046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_make_string_constant(value Str, value NullTerminate) {
27146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetStringConstant(String_val(Str), string_length(Str),
27246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Bool_val(NullTerminate) == 0);
2738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
27646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_make_array_constant(LLVMTypeRef ElementTy,
27746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
27846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetArrayConstant(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
27946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                              Wosize_val(ElementVals));
2808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> bool -> llvalue */
28346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_make_struct_constant(value ElementVals,
28446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Packed) {
28546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetStructConstant((LLVMValueRef *) Op_val(ElementVals),
28646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Wosize_val(ElementVals), Bool_val(Packed));
2878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
2908ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_vector_constant(value ElementVals) {
2918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return (value) LLVMGetVectorConstant((LLVMValueRef*) Op_val(ElementVals),
2928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                       Wosize_val(ElementVals));
2938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
2968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
29846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
29946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
3008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> linkage */
30346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
30446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
3058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* linkage -> llvalue -> unit */
30846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
30946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
3108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
3118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
31446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
31546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
3168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
31946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
32046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
3218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
3228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> visibility */
32546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
32646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
3278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* visibility -> llvalue -> unit */
33046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
33146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
3328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
3338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
33646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
33746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
3388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
34146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
34246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
3438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
3448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
3478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
34946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
35046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
35146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
3528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
35546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
35646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
35746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
3588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
3598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
36046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
3618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
36446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
36546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
3668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
3678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
37046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
37146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
37246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
3738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
3748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
37746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
37846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
3798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
3808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
38346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
38446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
3858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
38846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
38946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
39046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
39146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
39246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
39346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
39446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
39546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
39646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
39746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
39846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
39946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
40046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
40146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
40246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
40346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
40446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
40546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
40646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMAppendBasicBlock(Fn, "entry");
40746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
40846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
40946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
41046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
41146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
41246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
41346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
41446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
41546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
41646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int -> llvalue */
41746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
41846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
41946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
42046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
42146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int -> llvalue */
42246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_params(LLVMValueRef Fn, value Index) {
42346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
42446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
42546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Params;
42646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
42746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
42846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
42946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
43046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
43146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
43246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
43346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
43446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
43546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
43646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
43746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
43846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
43946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
44046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
44146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
44246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
44346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
44446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
44546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
44646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
44746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
44846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
44946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
45046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
45146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
45246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
45346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
45446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
45546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
45646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
45746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
45846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
45946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
46046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMBasicBlockRef llvm_append_block(value Name, LLVMValueRef Fn) {
46146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAppendBasicBlock(Fn, String_val(Name));
46246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
46346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
46446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
46546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMBasicBlockRef llvm_insert_block(value Name, LLVMBasicBlockRef BB) {
46646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMInsertBasicBlock(BB, String_val(Name));
46746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
46846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
46946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
47046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
47146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
47246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
47346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
47446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
47546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
47646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
47746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
47846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
47946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenvoid llvm_finalize_builder(value B) {
48046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  fprintf(stderr, "disposing builder = 0x%08x\n", (int) Builder_val(B));
48146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
48246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
48346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
48446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
48546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  (char *) "LLVMBuilder",
48646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
48746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
48846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
48946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
49046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
49146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
49246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
49346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder */
49446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_builder_before(LLVMValueRef Inst) {
49546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value V;
49646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMBuilderRef B = LLVMCreateBuilder();
49746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMPositionBuilderBefore(B, Inst);
49846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
49946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  Builder_val(V) = B;
50046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return V;
50146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
50246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
50346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder */
50446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_builder_at_end(LLVMBasicBlockRef BB) {
50546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value V;
50646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMBuilderRef B = LLVMCreateBuilder();
50746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMPositionBuilderAtEnd(B, BB);
50846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  fprintf(stderr, "returning builder = 0x%08x\n", (int) B);
50946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
51046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  Builder_val(V) = B;
51146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return V;
51246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
51346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
51446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> unit */
51546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_position_before(LLVMValueRef Inst, value B) {
51646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMPositionBuilderBefore(Builder_val(B), Inst);
51746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
51846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
51946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
52046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> unit */
52146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_position_at_end(LLVMBasicBlockRef BB, value B) {
52246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMPositionBuilderAtEnd(Builder_val(B), BB);
5238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
5248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
52546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
52646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
52746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
52846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
52946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
53046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
53146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
53246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
53346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
53446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
53546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
53646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
53746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
53846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
53946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
54046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
54146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
54246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
54346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
54446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
54546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
54646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
54746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
54846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
54946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
55046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
55146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
55246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
55346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
55446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
55546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
55646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
55746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
55846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
55946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
56046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
56146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
56246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
56346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
56446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
56546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
56646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
56746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
56846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
56946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
57046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
57146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
57246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
57346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
57446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
57546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
57646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
57746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
57846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
57946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unwind(value B) {
58046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnwind(Builder_val(B));
58146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
58246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
58346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
58446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
58546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
58646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
58746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
58846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
58946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
59046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
59146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
59246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
59346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
59446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
59546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
59646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
59746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
59846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
59946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
60046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
60146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
60246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
60346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
60446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
60546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
60646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
60746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
60846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
60946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
61046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
61146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
61246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
61346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
61446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
61546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
61646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
61746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
61846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
61946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
62046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
62146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
62246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
62346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
62446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
62546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
62646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
62746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
62846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
62946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
63046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
63146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
63246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
63346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
63446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
63546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
63646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
63746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
63846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
63946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
64046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
64146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
64246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
64346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
64446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
64546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
64646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
64746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
64846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
64946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
65046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
65146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
65246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
65346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
65446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
65546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
65646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
65746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
65846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
65946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
66046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
66146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
66246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
66346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
66446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
66546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
66646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
66746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
66846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
66946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
67046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
67146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
67246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
67346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
67446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
67546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
67646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
67746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
67846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
67946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
68046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
68146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
68246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
68346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
68446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
68546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
68646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
68746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
68846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
68946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
69046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
69146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
69246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
69346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
69446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
69546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_malloc(LLVMTypeRef Ty,
69646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
69746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMalloc(Builder_val(B), Ty, String_val(Name));
69846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
69946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
70046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
70146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_malloc(LLVMTypeRef Ty, LLVMValueRef Size,
70246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
70346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayMalloc(Builder_val(B), Ty, Size, String_val(Name));
70446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
70546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
70646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
70746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
70846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
70946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
71046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
71146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
71246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
71346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
71446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
71546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
71646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
71746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
71846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
71946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_free(LLVMValueRef Pointer, value B) {
72046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFree(Builder_val(B), Pointer);
72146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
72246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
72346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
72446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
72546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
72646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
72746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
72846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
72946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
73046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
73146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
73246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
73346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
73446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
73546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
73646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
73746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
73846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
73946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
74046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
74146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
74246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
74346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
74446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
74546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
74646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
74746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
74846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
74946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
75046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
75146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
75246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
75346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
75446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
75546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
75646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
75746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
75846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
75946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
76046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
76146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
76246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
76346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
76446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
76546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
76646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
76746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
76846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
76946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
77046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
77146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
77246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
77346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
77446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
77546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
77646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
77746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
77846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
77946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
78046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
78146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
78246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
78346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
78446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
78546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
78646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
78746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
78846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
78946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
79046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
79146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
79246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
79346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
79446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
79546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
79646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
79746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
79846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
79946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
80046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
80146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
80246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
80346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
80446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
80546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
80646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
80746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
80846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
80946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
81046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
81146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
81246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
81346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
81446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
81546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
81646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
81746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
81846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
81946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int_predicate -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
82046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
82146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
82246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
82346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
82446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
82546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
82646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
82746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* real_predicate -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
82846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
82946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
83046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
83146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
83246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
83346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
83446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
83546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
83646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
83746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
83846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(LLVMTypeRef Ty,
83946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
84046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPhi(Builder_val(B), Ty, String_val(Name));
84146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
84246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
84346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
84446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
84546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
84646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
84746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
84846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
84946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
85046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
85146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
85246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
85346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
85446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
85546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
85646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
85746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
85846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
85946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
86046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
86146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
86246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
86346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
86446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
86546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
86646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
86746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
86846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
86946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
87046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
87146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
87246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
87346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
87446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
87546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
87646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
87746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
87846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
87946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
88046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
88146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
88246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
88346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
88446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
88546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
886