llvm_ocaml.c revision 3dd16741864302af14b31b7f75375c09d8544a35
1bbf1c514bd832bf1306fe3e87221fd78bbc306efGordon Henriksen/*===-- llvm_ocaml.c - LLVM Ocaml Glue --------------------------*- C++ -*-===*\
28ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
38ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                     The LLVM Compiler Infrastructure                       *|
48ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
5234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* This file is distributed under the University of Illinois Open Source      *|
6234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* 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/memory.h"
22da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/fail.h"
23da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/callback.h"
246d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen#include "llvm/Config/config.h"
252618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen#include <assert.h>
26da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include <stdlib.h>
274f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin#include <string.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
402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void 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);
482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  abort(); /* NOTREACHED */
49a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#ifdef CAMLnoreturn
50a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen  CAMLnoreturn; /* Silences warnings, but is missing in some versions. */
51a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#endif
52da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
544733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksenstatic value alloc_variant(int tag, void *Value) {
554733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Iter = alloc_small(1, tag);
564733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  Field(Iter, 0) = Val_op(Value);
574733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Iter;
584733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
594733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
604733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* Macro to convert the C first/next/last/prev idiom to the Ocaml llpos/
614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen   llrev_pos idiom. */
624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen#define DEFINE_ITERATORS(camlname, cname, pty, cty, pfun) \
634733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llpos */                        \
644733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_begin(pty Mom) {       \
654733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty First = LLVMGetFirst##cname(Mom);                 \
664733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (First)                                            \
674733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, First);                     \
684733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
704733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
714733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llpos */                         \
724733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_succ(cty Kid) {        \
734733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Next = LLVMGetNext##cname(Kid);                   \
744733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Next)                                             \
754733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Next);                      \
76f440691a20eff24cf59ac14e10057234ae182dbeGordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
774733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
784733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
794733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llrev_pos */                    \
804733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_end(pty Mom) {         \
814733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Last = LLVMGetLast##cname(Mom);                   \
824733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Last)                                             \
834733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Last);                      \
844733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
854733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
874733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llrev_pos */                     \
884733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_pred(cty Kid) {        \
894733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Prev = LLVMGetPrevious##cname(Kid);               \
904733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Prev)                                             \
914733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Prev);                      \
924733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }
944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
965371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/*===-- Contexts ----------------------------------------------------------===*/
975371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
985371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
995371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_create_context(value Unit) {
1005371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMContextCreate();
1015371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1025371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1035371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> unit */
1045371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_dispose_context(LLVMContextRef C) {
1055371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  LLVMContextDispose(C);
1065371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return Val_unit;
1075371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1085371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1095371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
1105371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_global_context(value Unit) {
1115371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetGlobalContext();
1125371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1135371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
11446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> int */
11546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_mdkind_id(LLVMContextRef C, value Name) {
11646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  unsigned MDKindID = LLVMGetMDKindIDInContext(C, String_val(Name),
11746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                               caml_string_length(Name));
11846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_int(MDKindID);
11946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
12046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
1218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/
1228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
123263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar/* llcontext -> string -> llmodule */
124263d989a719c1864862fc91f59193a6c2b55ca48Erick TryzelaarCAMLprim LLVMModuleRef llvm_create_module(LLVMContextRef C, value ModuleID) {
125263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar  return LLVMModuleCreateWithNameInContext(String_val(ModuleID), C);
1268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */
12946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) {
13046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeModule(M);
1318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
134a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
135a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_target_triple(LLVMModuleRef M) {
136a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetTarget(M));
137a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
138a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
139a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
140a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_target_triple(value Trip, LLVMModuleRef M) {
141a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetTarget(M, String_val(Trip));
142a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
143a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
144a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
145a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
146a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_data_layout(LLVMModuleRef M) {
147a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetDataLayout(M));
148a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
149a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
150a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
151a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_data_layout(value Layout, LLVMModuleRef M) {
152a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetDataLayout(M, String_val(Layout));
153a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
154a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
155a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
156af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen/* llmodule -> unit */
157af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon HenriksenCAMLprim value llvm_dump_module(LLVMModuleRef M) {
158af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  LLVMDumpModule(M);
159af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  return Val_unit;
160af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen}
161af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen
1620941534c712d77243d9dda5e8c1d927563b4edffChris Lattner/* llmodule -> string -> unit */
1630941534c712d77243d9dda5e8c1d927563b4edffChris LattnerCAMLprim value llvm_set_module_inline_asm(LLVMModuleRef M, value Asm) {
1640941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMSetModuleInlineAsm(M, String_val(Asm));
1650941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  return Val_unit;
1660941534c712d77243d9dda5e8c1d927563b4edffChris Lattner}
1678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/
1698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
170404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* lltype -> TypeKind.t */
17146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) {
17246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetTypeKind(Ty));
1738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
175ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok EdwinCAMLprim value llvm_type_is_sized(LLVMTypeRef Ty) {
176ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin    return Val_bool(LLVMTypeIsSized(Ty));
177ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin}
178ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin
1795371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* lltype -> llcontext */
1805371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_type_context(LLVMTypeRef Ty) {
1815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetTypeContext(Ty);
1825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/
1858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
186b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
187b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i1_type (LLVMContextRef Context) {
188b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt1TypeInContext(Context);
189b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
190b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
191b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
192b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i8_type (LLVMContextRef Context) {
193b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt8TypeInContext(Context);
194b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
195b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
196b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
197b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i16_type (LLVMContextRef Context) {
198b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt16TypeInContext(Context);
199b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
200b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
201b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
202b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i32_type (LLVMContextRef Context) {
203b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt32TypeInContext(Context);
204b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
205b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
206b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
207b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i64_type (LLVMContextRef Context) {
208b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt64TypeInContext(Context);
209b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
2108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
211b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> int -> lltype */
212b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_integer_type(LLVMContextRef Context, value Width) {
213b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMIntTypeInContext(Context, Int_val(Width));
2148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
21746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) {
21846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetIntTypeWidth(IntegerTy));
2198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/
2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
223b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
224b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_float_type(LLVMContextRef Context) {
225b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFloatTypeInContext(Context);
2268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
228b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
229b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_double_type(LLVMContextRef Context) {
230b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMDoubleTypeInContext(Context);
2318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
233b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
234b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_x86fp80_type(LLVMContextRef Context) {
235b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMX86FP80TypeInContext(Context);
2368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
238b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
239b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_fp128_type(LLVMContextRef Context) {
240b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFP128TypeInContext(Context);
2418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
243b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
244b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_ppc_fp128_type(LLVMContextRef Context) {
245b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMPPCFP128TypeInContext(Context);
2468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
248bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen/* llcontext -> lltype */
249bb811a244567aa8a1522203f15588f4d001b7353Dale JohannesenCAMLprim LLVMTypeRef llvm_x86mmx_type(LLVMContextRef Context) {
250bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen  return LLVMX86MMXTypeInContext(Context);
251bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen}
252bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen
2538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/
2548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
255957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
256957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) {
25781a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
258957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 0);
259957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
260957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
261957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
262957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy,
263957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                                                value ParamTys) {
264957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
265957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 1);
2668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */
26946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) {
27046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsFunctionVarArg(FunTy));
2718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
27446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
27546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
27646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
27746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/
2818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
2835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_struct_type(LLVMContextRef C, value ElementTypes) {
2845371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
2855371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 0);
286957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
287957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
2885371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
2895371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C,
2905371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                             value ElementTypes) {
2915371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
2925371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 1);
2938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
295c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin/* lltype -> string option */
296c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok EdwinCAMLprim value llvm_struct_name(LLVMTypeRef Ty)
297c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin{
29831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
29931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *C = LLVMGetStructName(Ty);
30031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (C) {
30131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal1(result);
30231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    result = caml_alloc_small(1, 0);
30331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(result, 0, caml_copy_string(C));
30431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(result);
30531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
30631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
307c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin}
308c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin
3098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
3101940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) {
31146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
31246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
31346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
3148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
31646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */
31746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
31846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsPackedStruct(StructTy));
3198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/
3228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
324957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) {
32581a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMArrayType(ElementTy, Int_val(Count));
3268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
32857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */
32957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) {
33057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, 0);
33157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
33257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
33357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */
33457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy,
33557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen                                                 value AddressSpace) {
33657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, Int_val(AddressSpace));
33757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
33857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
3398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
340957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) {
34181a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMVectorType(ElementTy, Int_val(Count));
3428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
34546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
34646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetArrayLength(ArrayTy));
3478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
35057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) {
35157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return Val_int(LLVMGetPointerAddressSpace(PtrTy));
35257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
35357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
35457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */
35546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
35646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVectorSize(VectorTy));
3578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/
3608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
361b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
362b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) {
363b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMVoidTypeInContext(Context);
364b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
365b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
366b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
367b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) {
368b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMLabelTypeInContext(Context);
369b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
3708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/
3728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */
37446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
37546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMTypeOf(Val);
3768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3783dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* keep in sync with ValueKind.t */
3793dd16741864302af14b31b7f75375c09d8544a35Torok Edwinenum ValueKind {
3803dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  NullValue=0,
3813dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Argument,
3823dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BasicBlock,
3833dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  InlineAsm,
3843dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDNode,
3853dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDString,
3863dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BlockAddress,
3873dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantAggregateZero,
3883dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantArray,
3893dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantExpr,
3903dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantFP,
3913dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantInt,
3923dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantPointerNull,
3933dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantStruct,
3943dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantVector,
3953dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Function,
3963dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalAlias,
3973dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalVariable,
3983dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  UndefValue,
3993dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Instruction
4003dd16741864302af14b31b7f75375c09d8544a35Torok Edwin};
4013dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4023dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* llvalue -> ValueKind.t */
4033dd16741864302af14b31b7f75375c09d8544a35Torok Edwin#define DEFINE_CASE(Val, Kind) \
4043dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    do {if (LLVMIsA##Kind(Val)) CAMLreturn(Val_int(Kind));} while(0)
4053dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4063dd16741864302af14b31b7f75375c09d8544a35Torok EdwinCAMLprim value llvm_classify_value(LLVMValueRef Val) {
4073dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  CAMLparam0();
4083dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!Val)
4093dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(Val_int(NullValue));
4103dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAConstant(Val)) {
4113dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, BlockAddress);
4123dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantAggregateZero);
4133dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantArray);
4143dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantExpr);
4153dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantFP);
4163dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantInt);
4173dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantPointerNull);
4183dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantStruct);
4193dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantVector);
4203dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4213dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAInstruction(Val)) {
4223dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLlocal1(result);
4233dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    result = caml_alloc_small(1, 0);
4243dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val)));
4253dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(result);
4263dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4273dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAGlobalValue(Val)) {
4283dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, Function);
4293dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalAlias);
4303dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalVariable);
4313dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4323dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, Argument);
4333dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, BasicBlock);
4343dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, InlineAsm);
4353dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDNode);
4363dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDString);
4373dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, UndefValue);
4383dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  failwith("Unknown Value class");
4393dd16741864302af14b31b7f75375c09d8544a35Torok Edwin}
4403dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
44246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) {
44346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetValueName(Val));
4448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
44746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
44846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetValueName(Val, String_val(Name));
4498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
45288cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */
45388cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) {
45488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  LLVMDumpValue(Val);
45588cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  return Val_unit;
45688cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen}
45788cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen
458b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/
459b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
460b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */
461b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) {
462b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar  return LLVMGetOperand(V, Int_val(I));
463b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar}
464b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
465f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
466f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) {
467f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  LLVMSetOperand(U, Int_val(I), V);
468f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_unit;
469f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
470f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
471f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */
472f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) {
473f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_int(LLVMGetNumOperands(V));
474f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
475f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
4768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
4778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
47946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
48046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
481344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
482344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
483344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
48446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
48546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
4868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
488344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
48946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
49046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
491344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
492344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
4936563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
4946563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) {
4956563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return LLVMIsAConstantExpr(Val) ?
4966563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      Val_int(LLVMGetConstOpcode(Val)) : Val_int(0);
4976563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
4986563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
49946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/
50046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
50146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */
50246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) {
50346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_bool(LLVMHasMetadata(Val));
50446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
50546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
50646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */
50746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) {
50846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam1(MDKindID);
50946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef MD;
51046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) {
51146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
51246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) MD;
51346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
51446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
51546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
51646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
51746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
51846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
51946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID,
52046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                 LLVMValueRef MD) {
52146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), MD);
52246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
52346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
52446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
52546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */
52646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) {
52746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), NULL);
52846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
52946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
53046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
53146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
53246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/
53346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
53446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */
53546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) {
53646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDStringInContext(C, String_val(S), caml_string_length(S));
53746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
53846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
53946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */
54046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) {
54146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals),
54246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                             Wosize_val(ElementVals));
54346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
54446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
5454f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */
5464f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) {
54731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
54831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *S;
54931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  unsigned Len;
55031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
55131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if ((S = LLVMGetMDString(V, &Len))) {
55231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal2(Option, Str);
55331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
55431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Str = caml_alloc_string(Len);
55531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    memcpy(String_val(Str), S, Len);
55631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Option = alloc(1,0);
55731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(Option, 0, Str);
55831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
55931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
56031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
5614f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
5624f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin
5634f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value name)
5644f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{
5654f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLparam1(name);
5664f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLlocal1(Nodes);
5674f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(name)), 0);
5684f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  LLVMGetNamedMetadataOperands(M, String_val(name), (LLVMValueRef *) Nodes);
5694f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLreturn(Nodes);
5704f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
5718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
5728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
573e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */
574e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) {
575e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, (long long) Int_val(N), 1);
5768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
578344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
579e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
580e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                                          value SExt) {
581e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
582344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
583344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
5846563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */
5856563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const)
5866563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{
5876563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLparam0();
5886563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  if (LLVMIsAConstantInt(Const) &&
5896563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) {
5906563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    value Option = alloc(1, 0);
5916563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const));
5926563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    CAMLreturn(Option);
5936563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  }
5946563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLreturn(Val_int(0));
5956563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
5966563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
59745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */
59845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
59945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                               value Radix) {
60045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S),
60145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                     Int_val(Radix));
60245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
60345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
605e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) {
606e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstReal(RealTy, Double_val(N));
6078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
60945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */
61045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) {
61145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstRealOfStringAndSize(RealTy, String_val(S),
61245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                      caml_string_length(S));
61345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
61445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
6168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
617b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
618b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str,
619b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                        value NullTerminate) {
620b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
621b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  1);
622e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
623e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
624b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
625b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str,
626b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                         value NullTerminate) {
627b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
628b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  0);
6298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
632e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy,
63346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
634e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
635e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                        Wosize_val(ElementVals));
636e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
637e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
6385371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
6395371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) {
6405371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
6415371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 0);
6428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6445371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
6455371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C,
6465371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                               value ElementVals) {
6475371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
6485371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 1);
6498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
652e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
653e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals),
654e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals));
6554647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6564647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
6574647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/
6584647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
659404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */
6604647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred,
6614647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
6624647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
6634647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant);
6644647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6654647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
666404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */
6674647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred,
6684647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
6694647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
6704647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant);
6714647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6724647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
6734647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */
6744647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) {
6754647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
6764647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                      Wosize_val(Indices));
6778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6791b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */
6801b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal,
6811b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                               value Indices) {
6821b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
6831b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                              Wosize_val(Indices));
6841b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
6851b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
6861b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */
6871b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate,
6881b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                              value Indices) {
6891b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
6901b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
6911b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
6921b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
6931b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
6941b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
6951b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
6961b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
6971b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
6981b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
6991b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstExtractValue(Aggregate, idxs, size);
7001b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
7011b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
7021b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7031b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7041b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */
7051b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate,
7061b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                             LLVMValueRef Val, value Indices) {
7071b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7081b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
7091b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
7101b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
7111b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7121b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
7131b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
7141b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
7151b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
7161b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7171b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstInsertValue(Aggregate, Val, idxs, size);
7181b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
7191b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
7201b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7211b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
722ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */
723ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm,
724ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value Constraints, value HasSideEffects,
725ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value IsAlignStack) {
726ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar  return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints),
727ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                            Bool_val(HasSideEffects), Bool_val(IsAlignStack));
728ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar}
729ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar
7308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
7318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
73346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
73446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
7358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
737404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */
73846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
73946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
7408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
742404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */
74346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
74446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
7458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
74946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
75046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
7518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
75446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
75546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
7568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
759404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */
76046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
76146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
7628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
764404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */
76546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
76646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
7678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
77146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
77246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
7738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
77646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
77746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
7788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
781705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/
782705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
783705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */
784705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) {
785705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
786705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef First;
787705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((First = LLVMGetFirstUse(Val))) {
788705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
789705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) First;
790705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
791705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
792705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
793705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
794705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
795705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */
796705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) {
797705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
798705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef Next;
799705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((Next = LLVMGetNextUse(U))) {
800705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
801705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) Next;
802705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
803705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
804705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
805705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
806705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
807705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
808705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) {
809705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUser(UR);
810705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
811705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
812705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
813705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) {
814705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUsedValue(UR);
815705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
816705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
8178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
8188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8194733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef,
8204733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
8214733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
8228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
82346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
82446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
8256d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
8266d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
8276d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
82857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0));
8296d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return GlobalVar;
8306d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
83146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
8328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8348e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */
8358e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name,
8368e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    value AddressSpace,
8378e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    LLVMModuleRef M) {
8388e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar;
8398e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
8408e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
8418e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar      return LLVMConstBitCast(GlobalVar,
8428e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                              LLVMPointerType(Ty, Int_val(AddressSpace)));
8438e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    return GlobalVar;
8448e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  }
8458e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return LLVMAddGlobal(M, Ty, String_val(Name));
8468e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
8478e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
8486d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
8496d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
8506d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
8516d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
8526d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
85375e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
8546d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) GlobalVar;
8556d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
8566d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
8576d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
8586d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
8596d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
8608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
86146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
86246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
86346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
8648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
8658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
86646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
8678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8698e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */
8708e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name,
8718e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMValueRef Initializer,
8728e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   value AddressSpace,
8738e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMModuleRef M) {
8748e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M,
8758e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       LLVMTypeOf(Initializer),
8768e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       String_val(Name),
8778e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       Int_val(AddressSpace));
8788e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMSetInitializer(GlobalVar, Initializer);
8798e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return GlobalVar;
8808e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
8818e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
8828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
88346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
88446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
8858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
88946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
89046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
89146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
8928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
89646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
89746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
8988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
90246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
90346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
9048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
90746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
90846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
90946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
91046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
91146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
91246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
913c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */
914c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) {
915c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_bool(LLVMIsGlobalConstant(GlobalVar));
916c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
917c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
918c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */
919c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) {
920c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag));
921c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_unit;
922c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
923c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
9246ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/
9256ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
9266ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty,
9276ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar                                     LLVMValueRef Aliasee, value Name) {
9286ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar  return LLVMAddAlias(M, Ty, Aliasee, String_val(Name));
9296ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar}
9306ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
93146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
93246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
9334733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef,
9344733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
9354733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
93646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
93746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
93846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
9396d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
9406d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
9416d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty)
94257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0));
9436d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return Fn;
9446d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
94546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
94646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
94746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
9486d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
9496d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
9506d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
9516d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
9526d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
95375e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
9546d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) Fn;
9556d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
9566d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
9576d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
9586d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
9596d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
96046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
96146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
96246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
96346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
964b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry");
96546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
96646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
96746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
96846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
96946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
97046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
97146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
97246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
97346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
97446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
97546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
97646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
97746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
97846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
97946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
98046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
98146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
98246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
98346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
98446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
98546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
98646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
98746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
98846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
98946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
99080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */
9915eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) {
9925eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  const char *GC;
99380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLparam0();
99480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLlocal2(Name, Option);
99580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
9965eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  if ((GC = LLVMGetGC(Fn))) {
9975eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    Name = copy_string(GC);
99880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
99980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Option = alloc(1, 0);
100080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Field(Option, 0) = Name;
100180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Option);
100280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  } else {
100380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Val_int(0));
100480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  }
100580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
100680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
100780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */
10085eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) {
10095eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
101080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  return Val_unit;
101180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
101280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
1013e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
1014e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) {
10150941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMAddFunctionAttr(Arg, Int_val(PA));
1016e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1017e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1018e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1019e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
1020e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) {
10210941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMRemoveFunctionAttr(Arg, Int_val(PA));
1022e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1023e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
10244733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/
10254733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10264733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent)
10274733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10284733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */
10294733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
10304733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
10314733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
10324733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1033e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */
1034e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) {
10354733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
10364733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
10374733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Params;
10384733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
10394733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1040e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
1041e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) {
10420941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMAddAttribute(Arg, Int_val(PA));
1043e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1044e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1045e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1046e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
1047e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) {
10480941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMRemoveAttribute(Arg, Int_val(PA));
1049e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1050e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1051e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1052e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */
1053e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
1054e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  LLVMSetParamAlignment(Arg, Int_val(align));
1055e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1056e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1057e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
105846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
105946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10604733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(
10614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent)
10624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
106346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
106446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
106546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
106646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
106746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
106846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
106946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
107046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
107146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
107246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
107346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
107446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
107546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
107646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
1077b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name,
1078b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMValueRef Fn) {
1079b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name));
108046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
108146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
108246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
1083b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name,
1084b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMBasicBlockRef BB) {
1085b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name));
108646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
108746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
108846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
108946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
109046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
109146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
109246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1093033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/
1094033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
1095033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
1096033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen                 LLVMGetInstructionParent)
1097033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
10986563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
10996563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
11003dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  LLVMOpcode o;
11013dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!LLVMIsAInstruction(Inst))
11023dd16741864302af14b31b7f75375c09d8544a35Torok Edwin      failwith("Not an instruction");
11033dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  o = LLVMGetInstructionOpcode(Inst);
11046563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  assert (o <= LLVMUnwind );
11056563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return Val_int(o);
11066563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
1107033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
11084917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin/* llvalue -> ICmp.t */
11094917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
111031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
111131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  int x = LLVMGetICmpPredicate(Val);
111231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (x) {
111331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    value Option = alloc(1, 0);
111431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Field(Option, 0) = Val_int(x - LLVMIntEQ);
111531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
111631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
111731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
11184917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin}
11194917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
11204917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
1121cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/
1122cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1123cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */
1124cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
1125cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_int(LLVMGetInstructionCallConv(Inst));
1126cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1127cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1128cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */
1129cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
1130cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  LLVMSetInstructionCallConv(Inst, Int_val(CC));
1131cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_unit;
1132cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1133cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1134e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */
1135e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr,
1136e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value index,
1137e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value PA) {
11380941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMAddInstrAttribute(Instr, Int_val(index), Int_val(PA));
1139e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1140e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1141e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1142e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */
1143e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr,
1144e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value index,
1145e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value PA) {
11460941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMRemoveInstrAttribute(Instr, Int_val(index), Int_val(PA));
1147e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1148e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1149e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
115007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/
115107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
115207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */
115307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
115407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_bool(LLVMIsTailCall(CallInst));
115507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
115607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
115707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */
115807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall,
115907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen                                  LLVMValueRef CallInst) {
116007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  LLVMSetTailCall(CallInst, Bool_val(IsTailCall));
116107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_unit;
116207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
116307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
11642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/
11652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11662618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */
11672618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
11682618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMAddIncoming(PhiNode,
11692618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMValueRef*) &Field(Incoming, 0),
11702618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMBasicBlockRef*) &Field(Incoming, 1),
11712618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  1);
11722618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return Val_unit;
11732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
11742618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11752618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */
11762618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
11772618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  unsigned I;
11782618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLparam0();
11792618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLlocal3(Hd, Tl, Tmp);
11802618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11812618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  /* Build a tuple list of them. */
11822618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Tl = Val_int(0);
11832618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
11842618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Hd = alloc(2, 0);
11852618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
11862618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
11872618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11882618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tmp = alloc(2, 0);
11892618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 0, Hd);
11902618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 1, Tl);
11912618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tl = Tmp;
11922618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
11932618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11942618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLreturn(Tl);
11952618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
11962618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
119746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
119846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
119946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
120046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
120146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1202a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) {
120346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
120446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
120546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
120646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
120789f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  (char *) "IRBuilder",
120846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
120946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
121046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
121146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
121246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
121346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
121446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1215a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) {
1216a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
1217a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  Builder_val(V) = B;
1218a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  return V;
1219a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1220a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
12215371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */
12225371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) {
12235371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return alloc_builder(LLVMCreateBuilderInContext(C));
1224a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1225a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
1226033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */
1227033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) {
1228033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  if (Tag_val(Pos) == 0) {
1229033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0));
1230033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderAtEnd(Builder_val(B), BB);
1231033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  } else {
1232033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0));
1233033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderBefore(Builder_val(B), I);
1234033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  }
12358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
12368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
123746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1238dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */
1239628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) {
1240dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B));
1241dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  if (!InsertBlock)
1242dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen    raise_not_found();
1243dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  return InsertBlock;
1244dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen}
1245dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen
12465c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */
1247628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) {
1248628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar  LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name));
12495c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar  return Val_unit;
12505c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar}
12515c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar
125246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/
125346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
125446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
125546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) {
125646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), V);
125746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
125846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
125946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
126046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */
126146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) {
126246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), NULL);
126346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
126446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
126546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
126646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */
126746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) {
126846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam0();
126946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef L;
127046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) {
127146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
127246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) L;
127346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
127446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
127546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
127646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
127746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
127846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
127946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) {
128046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetInstDebugLocation(Builder_val(B), V);
128146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
128246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
128346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
128446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
128546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
128646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
128746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
128846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
128946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
129046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
129146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
129246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
129346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
129446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
129546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
129646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
12976793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */
12986793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) {
12996793dd9769047706acf34420586716450344fb66Erick Tryzelaar  return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals),
13006793dd9769047706acf34420586716450344fb66Erick Tryzelaar                               Wosize_val(RetVals));
13016793dd9769047706acf34420586716450344fb66Erick Tryzelaar}
13026793dd9769047706acf34420586716450344fb66Erick Tryzelaar
130346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
130446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
130546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
130646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
130746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
130846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
130946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
131046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
131146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
131246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
131346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
131446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
131546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
131646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
131746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
131846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
131946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
132046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
132146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
132246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
132346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
13241430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
13251430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal,
132621491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen                             LLVMBasicBlockRef Dest) {
132721491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  LLVMAddCase(Switch, OnVal, Dest);
132821491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  return Val_unit;
132921491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen}
133021491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen
1331c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */
1332c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr,
1333c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value EstimatedDests,
1334c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value B) {
1335c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests);
1336c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1337c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
1338c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
1339c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr,
1340c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                    LLVMBasicBlockRef Dest) {
1341c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  LLVMAddDestination(IndirectBr, Dest);
1342c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return Val_unit;
1343c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1344c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
134546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
134646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
134746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
134846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
134946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
135046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
135146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
135246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
135346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
135446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
135546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
135646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
135746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
135846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
135946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
136046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
136146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
136246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
136346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
136448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn,
136548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value NumClauses,  value Name,
136648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value B) {
136748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses),
136848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                               String_val(Name));
136948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
137048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
137148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)
137248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{
137348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    LLVMSetCleanup(LandingPadInst, Bool_val(flag));
137448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return Val_unit;
137548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
137648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
137746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
137846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
137946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
138046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
138146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
138246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
138346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
138446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
138546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
138646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
138746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
138846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
138946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
139046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1391e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS,
1392e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1393e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name));
1394e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1395e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1396e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
139719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS,
139819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
139919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name));
140019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
140119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
140219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1403e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS,
1404e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1405e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name));
1406e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1407e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1408e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
140946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
141046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
141146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
141246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
141346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
141446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
141519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
141619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
141719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name));
141819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
141919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
142019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
142119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
142219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
142319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name));
142419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
142519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
142619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1427e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS,
1428e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1429e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name));
1430e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1431e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1432e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
143346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
143446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
143546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
143646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
143746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
143846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
143919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
144019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
144119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name));
144219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
144319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
144419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
144519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
144619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
144719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name));
144819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
144919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
145019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1451e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS,
1452e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1453e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name));
1454e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1455e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1456e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
145746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
145846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
145946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
146046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
146146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
146246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
146346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
146446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
146546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
146646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
146746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
146846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1469e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
1470e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                            value Name, value B) {
1471e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name));
1472e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1473e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1474e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
147546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
147646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
147746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
147846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
147946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
148046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
148146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
148246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
148346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
148446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
148546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
148646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
148746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
148846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
148946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
149046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
149146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
149446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
149546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
149646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
149746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
149946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
150546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
150646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
150746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
150846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
150946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
151046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
151146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
151246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
151346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
151446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
151546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
151646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
151746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
152346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
152446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
152546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
152646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
152946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
153046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
153146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
153246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
153346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
153446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
153546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
153646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
153746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
153846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
153946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
154046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
154119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X,
154219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
154319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name));
154419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
154519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
154619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
154719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X,
154819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
154919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name));
155019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
155119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
155219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
155319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X,
155419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                     value Name, value B) {
155519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildFNeg(Builder_val(B), X, String_val(Name));
155619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
155719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
155819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
155946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
156046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
156146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
156246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
156346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
156446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
156546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
156646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
156746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
156846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
156946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
157046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
157146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
157246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
157346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
157446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
157546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
157646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
157746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
157846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
157946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
158046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
158146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
158246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
158346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
158446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
158546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
158646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
158746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
158846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
158946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
159046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
159146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
159246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
159346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
159446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
159546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
159646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
159746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1598e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
1599e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer,
1600e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value Indices, value Name,
1601e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1602e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInBoundsGEP(Builder_val(B), Pointer,
1603e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              (LLVMValueRef *) Op_val(Indices),
1604e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              Wosize_val(Indices), String_val(Name));
1605e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1606e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1607e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1608e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer,
1609c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                                               value Index, value Name,
1610e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1611c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner  return LLVMBuildStructGEP(Builder_val(B), Pointer,
1612c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                              Int_val(Index), String_val(Name));
1613e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1614e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1615e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1616e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) {
1617e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalString(Builder_val(B), String_val(Str),
1618e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1619e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1620e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1621e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1622e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name,
1623e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1624e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str),
1625e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                  String_val(Name));
1626e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1627e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
162846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
162946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
163046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
163146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
163246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
163346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
163446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
163546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
163646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
163746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
163846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
163946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
164046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
164146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
164246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
164346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
164446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
164546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
164646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
164746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
164846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
164946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
165046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
165146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
165246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
165346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
165446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
165546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
165646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
165746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
165846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
165946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
166046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
166146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
166246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
166346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
166446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
166546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
166646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
166746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
166846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
166946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
167046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
167146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
167246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
167346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
167446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
167546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
167646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
167746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
167846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
167946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
168046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
168146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
168246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
168446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
168546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
168646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
168746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
168846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
169146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
169246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
169346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
169446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
169546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
169746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
169846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
169946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
170046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
170146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1702e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1703e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1704e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1705e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1706e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1707e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1708e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1709e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1710e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1711e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1712e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1713e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1714e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1715e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X,
1716e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  LLVMTypeRef Ty, value Name,
1717e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1718e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1719e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1720e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1721e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1722e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty,
1723e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1724e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name));
1725e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1726e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1727e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1728e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty,
1729e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1730e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name));
1731e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1732e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1733e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1734e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty,
1735e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                        value Name, value B) {
1736e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name));
1737e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1738e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
173946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
174046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1741404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
174246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
174346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
174446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
174546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
174646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
174746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1749404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
175046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
175146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
175246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
175346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
175446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
175546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
175646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
175846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
17592618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
17602618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
17612618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  value Hd, Tl;
17622618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMValueRef FirstValue, PhiNode;
17632618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
17652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17662618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Hd = Field(Incoming, 0);
17672618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  FirstValue = (LLVMValueRef) Field(Hd, 0);
17682618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
17692618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                         String_val(Name));
17702618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17712618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
17722618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    value Hd = Field(Tl, 0);
17732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
17742618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                    (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
17752618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
17762618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17772618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return PhiNode;
177846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
178146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
178246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
178346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
178446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
178546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
178646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
178846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
178946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
179046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
179146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
179246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
179446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
179546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
179646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
179746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
179846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
180046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
180146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
180246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
180346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
180446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
180546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
180746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
180846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
180946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
181046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
181146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
181246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
181346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
181446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
181546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
181646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
181746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
181846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
181946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
182046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
182146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
182246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1823e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1824e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate,
1825e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                              value Idx, value Name, value B) {
1826e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx),
1827e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1828e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1829e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1830e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */
1831e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate,
1832e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             LLVMValueRef Val, value Idx,
1833e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1834e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx),
1835e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              String_val(Name));
1836e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1837e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1838e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1839e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name,
1840e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value B) {
1841e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name));
1842e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1843e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1844e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1845e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name,
1846e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value B) {
1847e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name));
1848e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1849e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1850e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1851e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS,
1852e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1853e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name));
1854e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
18551ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
1856da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1857da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/
1858da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1859da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer
1860da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1861da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) {
1862da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Path);
1863da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1864da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1865da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1866da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path),
1867da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen                                               &MemBuf, &Message))
1868da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1869da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1870da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLreturn((value) MemBuf);
1871da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1872da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1873da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer
1874da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1875da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
1876da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1877da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1878da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1879da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message))
1880da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1881da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1882da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return MemBuf;
1883da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1884da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1885da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */
1886da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
1887da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMemoryBuffer(MemBuf);
1888da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
1889da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1890da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1891d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/
1892d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1893d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */
1894d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) {
1895d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return LLVMCreatePassManager();
1896d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1897d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1898d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */
1899d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M,
1900d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                           LLVMPassManagerRef PM) {
1901d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunPassManager(PM, M));
1902d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1903d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1904d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
1905d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) {
1906d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMInitializeFunctionPassManager(FPM));
1907d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1908d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1909d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */
1910d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F,
1911d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                             LLVMPassManagerRef FPM) {
1912d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunFunctionPassManager(FPM, F));
1913d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1914d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1915d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
1916d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) {
1917d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMFinalizeFunctionPassManager(FPM));
1918d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1919d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1920d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */
1921d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) {
1922d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  LLVMDisposePassManager(PM);
1923d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_unit;
1924d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1925