llvm_ocaml.c revision 404a1942e43ca967700cc2608eb97b863add2677
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"
23da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/fail.h"
24da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/callback.h"
256d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen#include "llvm/Config/config.h"
262618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen#include <assert.h>
27da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include <stdlib.h>
28da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
29da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
30da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Can't use the recommended caml_named_value mechanism for backwards
31da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   compatibility reasons. This is largely equivalent. */
32da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksenstatic value llvm_ioerror_exn;
33da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
34da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_register_core_exns(value IoError) {
35da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  llvm_ioerror_exn = Field(IoError, 0);
36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  register_global_root(&llvm_ioerror_exn);
37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
38da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
39da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
40da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksenvoid llvm_raise(value Prototype, char *Message) {
41da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Prototype);
42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLlocal1(CamlMessage);
43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CamlMessage = copy_string(Message);
45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMessage(Message);
46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
47da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  raise_with_arg(Prototype, CamlMessage);
48da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLnoreturn;
49da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/
538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llmodule */
5546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMModuleRef llvm_create_module(value ModuleID) {
5646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMModuleCreateWithName(String_val(ModuleID));
578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */
6046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) {
6146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeModule(M);
628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> lltype -> llmodule -> bool */
6646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_add_type_name(value Name, LLVMTypeRef Ty, LLVMModuleRef M) {
6746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  int res = LLVMAddTypeName(M, String_val(Name), Ty);
688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_bool(res == 0);
698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llmodule -> unit */
7246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_type_name(value Name, LLVMModuleRef M) {
7346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteTypeName(M, String_val(Name));
7446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
7546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
7646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/
798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
80404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* lltype -> TypeKind.t */
8146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) {
8246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetTypeKind(Ty));
838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/
868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
8846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i1_type (value Unit) { return LLVMInt1Type();  }
8946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i8_type (value Unit) { return LLVMInt8Type();  }
9046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i16_type(value Unit) { return LLVMInt16Type(); }
9146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i32_type(value Unit) { return LLVMInt32Type(); }
9246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_i64_type(value Unit) { return LLVMInt64Type(); }
938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> lltype */
95957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_integer_type(value Width) {
9681a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMIntType(Int_val(Width));
978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
10046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) {
10146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetIntTypeWidth(IntegerTy));
1028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/
1058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
10746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_float_type(value Unit) {
10846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMFloatType();
1098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
11246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_double_type(value Unit) {
11346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMDoubleType();
1148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
11746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_x86fp80_type(value Unit) {
11846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMX86FP80Type();
1198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
12246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_fp128_type(value Unit) {
12346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMFP128Type();
1248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
12746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_ppc_fp128_type(value Unit) {
12846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMPPCFP128Type();
1298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/
1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
133957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
134957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) {
13581a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
136957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 0);
137957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
138957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
139957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
140957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy,
141957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                                                value ParamTys) {
142957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
143957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 1);
1448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */
14746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) {
14846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsFunctionVarArg(FunTy));
1498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
15246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
15346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
15446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
15546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
1568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/
1598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
160957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype array -> lltype */
161957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_struct_type(value ElementTypes) {
162957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen  return LLVMStructType((LLVMTypeRef *) ElementTypes,
163957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                        Wosize_val(ElementTypes), 0);
164957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
165957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
166957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype array -> lltype */
167957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_packed_struct_type(value ElementTypes) {
16881a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMStructType((LLVMTypeRef *) ElementTypes,
169957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                        Wosize_val(ElementTypes), 1);
1708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
17346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_element_types(LLVMTypeRef StructTy) {
17446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
17546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
17646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
1778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
17946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */
18046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
18146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsPackedStruct(StructTy));
1828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/
1858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
187957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) {
18881a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMArrayType(ElementTy, Int_val(Count));
1898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
19157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */
19257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) {
19357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, 0);
19457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
19557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
19657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */
19757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy,
19857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen                                                 value AddressSpace) {
19957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, Int_val(AddressSpace));
20057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
20157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
2028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
203957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) {
20481a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMVectorType(ElementTy, Int_val(Count));
2058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
20846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
20946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetArrayLength(ArrayTy));
2108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
21357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) {
21457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return Val_int(LLVMGetPointerAddressSpace(PtrTy));
21557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
21657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
21757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */
21846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
21946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVectorSize(VectorTy));
2208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/
2238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
22546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_void_type (value Unit) { return LLVMVoidType();  }
22646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_label_type(value Unit) { return LLVMLabelType(); }
2278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */
229957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_opaque_type(value Unit) {
23081a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMOpaqueType();
2318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2331cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen/*--... Operations on type handles .........................................--*/
2341cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2351cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen#define Typehandle_val(v)  (*(LLVMTypeHandleRef *)(Data_custom_val(v)))
2361cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2371cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksenvoid llvm_finalize_handle(value TH) {
2381cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  LLVMDisposeTypeHandle(Typehandle_val(TH));
2391cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen}
2401cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2411cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksenstatic struct custom_operations typehandle_ops = {
2421cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  (char *) "LLVMTypeHandle",
2431cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  llvm_finalize_handle,
2441cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  custom_compare_default,
2451cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  custom_hash_default,
2461cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  custom_serialize_default,
2471cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  custom_deserialize_default
2481cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen};
2491cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2501cf08fddc7413076dedad58dbb8d8d67e69a490fGordon HenriksenCAMLprim value llvm_handle_to_type(LLVMTypeRef PATy) {
2511cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  value TH = alloc_custom(&typehandle_ops, sizeof(LLVMBuilderRef), 0, 1);
2521cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  Typehandle_val(TH) = LLVMCreateTypeHandle(PATy);
2531cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  return TH;
2541cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen}
2551cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2561cf08fddc7413076dedad58dbb8d8d67e69a490fGordon HenriksenCAMLprim LLVMTypeRef llvm_type_of_handle(value TH) {
2571cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  return LLVMResolveTypeHandle(Typehandle_val(TH));
2581cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen}
2591cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2601cf08fddc7413076dedad58dbb8d8d67e69a490fGordon HenriksenCAMLprim value llvm_refine_type(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy){
2611cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  LLVMRefineAbstractType(AbstractTy, ConcreteTy);
2621cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  return Val_unit;
2631cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen}
2641cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/
2678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */
26946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
27046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMTypeOf(Val);
2718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
27446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) {
27546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetValueName(Val));
2768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
27946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
28046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetValueName(Val, String_val(Name));
2818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
2828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
28488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */
28588cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) {
28688cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  LLVMDumpValue(Val);
28788cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  return Val_unit;
28888cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen}
28988cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen
2908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
2918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
29346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
29446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
295344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
296344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
297344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
29846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
29946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
3008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
302344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
30346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
30446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
305344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
306344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
3078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
3088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
309e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */
310e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) {
311e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, (long long) Int_val(N), 1);
3128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
314344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
315e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
316e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                                          value SExt) {
317e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
318344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
319344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
3208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
321e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) {
322e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstReal(RealTy, Double_val(N));
3238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
3268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
327e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* string -> llvalue */
328e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_string(value Str, value NullTerminate) {
329e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstString(String_val(Str), string_length(Str), 1);
330e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
331e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
332e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* string -> llvalue */
333e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_stringz(value Str, value NullTerminate) {
334e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstString(String_val(Str), string_length(Str), 0);
3358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
338e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy,
33946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
340e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
341e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                        Wosize_val(ElementVals));
342e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
343e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
344e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* llvalue array -> llvalue */
345e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_struct(value ElementVals) {
346e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstStruct((LLVMValueRef *) Op_val(ElementVals),
347e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals), 0);
3488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
350e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* llvalue array -> llvalue */
351e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_packed_struct(value ElementVals) {
352e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstStruct((LLVMValueRef *) Op_val(ElementVals),
353e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals), 1);
3548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
357e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
358e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals),
359e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals));
3604647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
3614647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
3624647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/
3634647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
364404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */
3654647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred,
3664647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
3674647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
3684647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant);
3694647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
3704647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
371404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */
3724647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred,
3734647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
3744647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
3754647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant);
3764647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
3774647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
3784647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */
3794647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) {
3804647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
3814647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                      Wosize_val(Indices));
3828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
3858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
38746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
38846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
3898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
391404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */
39246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
39346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
3948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
396404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */
39746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
39846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
3998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
40346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
40446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
4058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
40846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
40946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
4108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
413404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */
41446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
41546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
4168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
418404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */
41946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
42046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
4218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
42546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
42646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
4278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
43046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
43146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
4328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
4368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
43846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
43946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
4406d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
4416d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
4426d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
44357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0));
4446d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return GlobalVar;
4456d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
44646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
4478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4496d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
4506d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
4516d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
4526d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
4536d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
45475e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
4556d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) GlobalVar;
4566d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
4576d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
4586d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
4596d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
4606d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
4618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
46246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
46346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
46446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
4658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
4668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
46746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
4688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
47146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
47246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
4738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
47746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
47846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
47946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
4808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
48446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
48546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
4868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
49046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
49146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
4928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
49546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
49646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
49746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
49846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
49946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
50046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
501c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */
502c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) {
503c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_bool(LLVMIsGlobalConstant(GlobalVar));
504c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
505c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
506c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */
507c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) {
508c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag));
509c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_unit;
510c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
511c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
51246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
51346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
51446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
51546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
51646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
5176d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
5186d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
5196d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty)
52057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0));
5216d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return Fn;
5226d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
52346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
52446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
52546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
5266d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
5276d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
5286d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
5296d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
5306d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
53175e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
5326d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) Fn;
5336d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
5346d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
5356d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
5366d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
5376d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
53846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
53946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
54046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
54146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
54246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMAppendBasicBlock(Fn, "entry");
54346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
54446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
54546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
54646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
54746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
54846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
54946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
55046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
55146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
55246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int -> llvalue */
55346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
55446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
55546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
55646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
55746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int -> llvalue */
55846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_params(LLVMValueRef Fn, value Index) {
55946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
56046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
56146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Params;
56246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
56346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
56446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
56546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
56646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
56746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
56846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
56946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
57046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
57146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
57246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
57346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
57446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
57546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
57646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
57746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
57846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
57946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
58080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */
58180a75bfae980df96f969f1c05b0c4a80ce975240Gordon HenriksenCAMLprim value llvm_collector(LLVMValueRef Fn) {
58280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  const char *Collector;
58380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLparam0();
58480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLlocal2(Name, Option);
58580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
58680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  if ((Collector = LLVMGetCollector(Fn))) {
58780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Name = copy_string(Collector);
58880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
58980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Option = alloc(1, 0);
59080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Field(Option, 0) = Name;
59180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Option);
59280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  } else {
59380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Val_int(0));
59480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  }
59580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
59680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
59780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */
59880a75bfae980df96f969f1c05b0c4a80ce975240Gordon HenriksenCAMLprim value llvm_set_collector(value GC, LLVMValueRef Fn) {
59980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  LLVMSetCollector(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
60080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  return Val_unit;
60180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
60280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
60346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
60446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
60546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
60646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
60746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
60846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
60946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
61046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
61146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
61246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
61346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
61446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
61546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
61646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
61746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
61846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
61946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMBasicBlockRef llvm_append_block(value Name, LLVMValueRef Fn) {
62046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAppendBasicBlock(Fn, String_val(Name));
62146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
62246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
62346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
62446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMBasicBlockRef llvm_insert_block(value Name, LLVMBasicBlockRef BB) {
62546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMInsertBasicBlock(BB, String_val(Name));
62646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
62746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
62846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
62946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
63046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
63146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
63246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
6332618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/
6342618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
6352618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */
6362618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
6372618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMAddIncoming(PhiNode,
6382618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMValueRef*) &Field(Incoming, 0),
6392618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMBasicBlockRef*) &Field(Incoming, 1),
6402618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  1);
6412618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return Val_unit;
6422618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
6432618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
6442618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */
6452618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
6462618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  unsigned I;
6472618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLparam0();
6482618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLlocal3(Hd, Tl, Tmp);
6492618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
6502618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  /* Build a tuple list of them. */
6512618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Tl = Val_int(0);
6522618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
6532618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Hd = alloc(2, 0);
6542618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
6552618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
6562618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
6572618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tmp = alloc(2, 0);
6582618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 0, Hd);
6592618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 1, Tl);
6602618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tl = Tmp;
6612618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
6622618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
6632618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLreturn(Tl);
6642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
6652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
66646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
66746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
66846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
66946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
67046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
67146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenvoid llvm_finalize_builder(value B) {
67246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
67346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
67446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
67546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
67646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  (char *) "LLVMBuilder",
67746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
67846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
67946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
68046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
68146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
68246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
68346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
68446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder */
68546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_builder_before(LLVMValueRef Inst) {
68646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value V;
68746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMBuilderRef B = LLVMCreateBuilder();
68846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMPositionBuilderBefore(B, Inst);
68946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
69046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  Builder_val(V) = B;
69146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return V;
69246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
69346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
69446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder */
69546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_builder_at_end(LLVMBasicBlockRef BB) {
69646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value V;
69746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMBuilderRef B = LLVMCreateBuilder();
69846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMPositionBuilderAtEnd(B, BB);
69946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
70046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  Builder_val(V) = B;
70146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return V;
70246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
70346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
70446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> unit */
70546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_position_before(LLVMValueRef Inst, value B) {
70646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMPositionBuilderBefore(Builder_val(B), Inst);
70746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
70846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
70946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
71046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> unit */
71146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_position_at_end(LLVMBasicBlockRef BB, value B) {
71246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMPositionBuilderAtEnd(Builder_val(B), BB);
7138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
71546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
71646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
71746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
71846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
71946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
72046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
72146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
72246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
72346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
72446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
72546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
72646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
72746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
72846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
72946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
73046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
73146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
73246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
73346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
73446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
73546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
73646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
73746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
73846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
73946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
74046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
74146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
74246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
74346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
74446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
74546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
74646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
74746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
74846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
74946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
75046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
75146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
75246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
75346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
75446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
75546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
75646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
75746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
75846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
75946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
76046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
76146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
76246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
76346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
76446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
76546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
76646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
76746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
76846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
76946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unwind(value B) {
77046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnwind(Builder_val(B));
77146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
77246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
77346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
77446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
77546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
77646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
77746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
77846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
77946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
78046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
78146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
78246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
78346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
78446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
78546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
78646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
78746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
78846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
78946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
79046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
79146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
79246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
79346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
79446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
79546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
79646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
79746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
79846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
79946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
80046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
80146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
80246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
80346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
80446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
80546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
80646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
80746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
80846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
80946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
81046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
81146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
81246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
81346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
81446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
81546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
81646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
81746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
81846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
81946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
82046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
82146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
82246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
82346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
82446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
82546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
82646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
82746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
82846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
82946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
83046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
83146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
83246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
83346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
83446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
83546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
83646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
83746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
83846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
83946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
84046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
84146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
84246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
84346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
84446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
84546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
84646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
84746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
84846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
84946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
85046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
85146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
85246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
85346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
85446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
85546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
85646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
85746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
85846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
85946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
86046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
86146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
86246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
86346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
86446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
86546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
86646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
86746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
86846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
86946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
87046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
87146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
87246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
87346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
87446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
87546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
87646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
87746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
87846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
87946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
88046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
88146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
88246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
88346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
88446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
88546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_malloc(LLVMTypeRef Ty,
88646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
88746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMalloc(Builder_val(B), Ty, String_val(Name));
88846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
88946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
89046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
89146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_malloc(LLVMTypeRef Ty, LLVMValueRef Size,
89246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
89346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayMalloc(Builder_val(B), Ty, Size, String_val(Name));
89446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
89546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
89646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
89746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
89846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
89946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
90046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
90146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
90246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
90346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
90446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
90546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
90646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
90746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
90846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
90946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_free(LLVMValueRef Pointer, value B) {
91046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFree(Builder_val(B), Pointer);
91146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
91246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
91346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
91446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
91546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
91646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
91746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
91846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
91946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
92046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
92146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
92246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
92346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
92446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
92546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
92646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
92746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
92846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
92946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
93046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
93146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
93246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
93346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
93446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
93546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
93646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
93746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
93846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
93946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
94046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
94146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
94246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
94346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
94446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
94546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
94646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
94746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
94846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
94946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
95046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
95146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
95246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
95346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
95446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
95546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
95646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
95746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
95846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
95946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
96046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
96146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
96246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
96346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
96446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
96546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
96646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
96746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
96846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
96946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
97046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
97146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
97246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
97346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
97446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
97546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
97646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
97746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
97846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
97946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
98046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
98146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
98246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
98346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
98446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
98546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
98646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
98746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
98846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
98946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
99046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
99146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
99246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
99346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
99446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
99546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
99646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
99746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
99846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
99946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
100046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
100146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
100246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
100346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
100446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
100546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
100646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
100746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
100846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1009404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
101046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
101146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
101246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
101346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
101446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
101546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
101646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1017404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
101846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
101946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
102046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
102146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
102246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
102346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
102446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
102546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
102646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10272618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
10282618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
10292618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  value Hd, Tl;
10302618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMValueRef FirstValue, PhiNode;
10312618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
10322618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
10332618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
10342618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Hd = Field(Incoming, 0);
10352618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  FirstValue = (LLVMValueRef) Field(Hd, 0);
10362618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
10372618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                         String_val(Name));
10382618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
10392618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
10402618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    value Hd = Field(Tl, 0);
10412618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
10422618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                    (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
10432618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
10442618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
10452618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return PhiNode;
104646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
104746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
104846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
104946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
105046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
105146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
105246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
105346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
105446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
105546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
105646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
105746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
105846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
105946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
106046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
106146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
106246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
106346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
106446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
106546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
106646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
106746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
106846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
106946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
107046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
107146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
107246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
107346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
107446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
107546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
107646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
107746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
107846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
107946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
108046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
108146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
108246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
108346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
108446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
108546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
108646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
108746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
108846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
108946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
109046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10911ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
10921ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen/*===-- Module Providers --------------------------------------------------===*/
10931ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
10941ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen/* llmoduleprovider -> unit */
10951ae6135fa37eb061499d079b9b33dc82dcc1283fGordon HenriksenCAMLprim value llvm_dispose_module_provider(LLVMModuleProviderRef MP) {
10961ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen  LLVMDisposeModuleProvider(MP);
10971ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen  return Val_unit;
10981ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen}
1099da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1100da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1101da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/
1102da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1103da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer
1104da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1105da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) {
1106da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Path);
1107da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1108da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1109da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1110da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path),
1111da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen                                               &MemBuf, &Message))
1112da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1113da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1114da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLreturn((value) MemBuf);
1115da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1116da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1117da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer
1118da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1119da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
1120da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1121da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1122da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1123da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message))
1124da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1125da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1126da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return MemBuf;
1127da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1128da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1129da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */
1130da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
1131da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMemoryBuffer(MemBuf);
1132da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
1133da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1134da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1135