llvm_ocaml.c revision 6b228e506f42972c003599f4873a24910f8a530a
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
2956b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* llcontext -> string -> lltype */
2966b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMTypeRef llvm_named_struct_type(LLVMContextRef C,
2976b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                            value Name) {
2986b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return LLVMStructCreateNamed(C, String_val(Name));
2996b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3006b228e506f42972c003599f4873a24910f8a530aTorok Edwin
3016b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_struct_set_body(LLVMTypeRef Ty,
3026b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                    value ElementTypes,
3036b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                    value Packed) {
3046b228e506f42972c003599f4873a24910f8a530aTorok Edwin  LLVMStructSetBody(Ty, (LLVMTypeRef *) ElementTypes,
3056b228e506f42972c003599f4873a24910f8a530aTorok Edwin                    Wosize_val(ElementTypes), Bool_val(Packed));
3066b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return Val_unit;
3076b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3086b228e506f42972c003599f4873a24910f8a530aTorok Edwin
309c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin/* lltype -> string option */
310c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok EdwinCAMLprim value llvm_struct_name(LLVMTypeRef Ty)
311c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin{
31231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
31331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *C = LLVMGetStructName(Ty);
31431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (C) {
31531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal1(result);
31631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    result = caml_alloc_small(1, 0);
31731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(result, 0, caml_copy_string(C));
31831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(result);
31931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
32031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
321c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin}
322c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin
3238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
3241940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) {
32546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
32646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
32746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
3288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
33046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */
33146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
33246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsPackedStruct(StructTy));
3338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3356b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> bool */
3366b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_is_opaque(LLVMTypeRef StructTy) {
3376b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return Val_bool(LLVMIsOpaqueStruct(StructTy));
3386b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3396b228e506f42972c003599f4873a24910f8a530aTorok Edwin
3408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/
3418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
343957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) {
34481a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMArrayType(ElementTy, Int_val(Count));
3458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
34757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */
34857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) {
34957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, 0);
35057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
35157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
35257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */
35357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy,
35457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen                                                 value AddressSpace) {
35557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, Int_val(AddressSpace));
35657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
35757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
3588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
359957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) {
36081a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMVectorType(ElementTy, Int_val(Count));
3618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
36446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
36546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetArrayLength(ArrayTy));
3668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
36957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) {
37057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return Val_int(LLVMGetPointerAddressSpace(PtrTy));
37157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
37257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
37357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */
37446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
37546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVectorSize(VectorTy));
3768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/
3798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
380b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
381b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) {
382b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMVoidTypeInContext(Context);
383b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
384b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
385b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
386b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) {
387b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMLabelTypeInContext(Context);
388b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
3898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/
3918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */
39346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
39446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMTypeOf(Val);
3958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3973dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* keep in sync with ValueKind.t */
3983dd16741864302af14b31b7f75375c09d8544a35Torok Edwinenum ValueKind {
3993dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  NullValue=0,
4003dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Argument,
4013dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BasicBlock,
4023dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  InlineAsm,
4033dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDNode,
4043dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDString,
4053dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BlockAddress,
4063dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantAggregateZero,
4073dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantArray,
4083dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantExpr,
4093dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantFP,
4103dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantInt,
4113dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantPointerNull,
4123dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantStruct,
4133dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantVector,
4143dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Function,
4153dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalAlias,
4163dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalVariable,
4173dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  UndefValue,
4183dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Instruction
4193dd16741864302af14b31b7f75375c09d8544a35Torok Edwin};
4203dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4213dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* llvalue -> ValueKind.t */
4223dd16741864302af14b31b7f75375c09d8544a35Torok Edwin#define DEFINE_CASE(Val, Kind) \
4233dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    do {if (LLVMIsA##Kind(Val)) CAMLreturn(Val_int(Kind));} while(0)
4243dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4253dd16741864302af14b31b7f75375c09d8544a35Torok EdwinCAMLprim value llvm_classify_value(LLVMValueRef Val) {
4263dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  CAMLparam0();
4273dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!Val)
4283dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(Val_int(NullValue));
4293dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAConstant(Val)) {
4303dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, BlockAddress);
4313dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantAggregateZero);
4323dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantArray);
4333dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantExpr);
4343dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantFP);
4353dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantInt);
4363dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantPointerNull);
4373dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantStruct);
4383dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantVector);
4393dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4403dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAInstruction(Val)) {
4413dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLlocal1(result);
4423dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    result = caml_alloc_small(1, 0);
4433dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val)));
4443dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(result);
4453dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4463dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAGlobalValue(Val)) {
4473dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, Function);
4483dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalAlias);
4493dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalVariable);
4503dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4513dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, Argument);
4523dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, BasicBlock);
4533dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, InlineAsm);
4543dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDNode);
4553dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDString);
4563dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, UndefValue);
4573dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  failwith("Unknown Value class");
4583dd16741864302af14b31b7f75375c09d8544a35Torok Edwin}
4593dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
46146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) {
46246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetValueName(Val));
4638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
46646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
46746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetValueName(Val, String_val(Name));
4688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
47188cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */
47288cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) {
47388cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  LLVMDumpValue(Val);
47488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  return Val_unit;
47588cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen}
47688cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen
477b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/
478b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
479b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */
480b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) {
481b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar  return LLVMGetOperand(V, Int_val(I));
482b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar}
483b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
484f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
485f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) {
486f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  LLVMSetOperand(U, Int_val(I), V);
487f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_unit;
488f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
489f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
490f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */
491f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) {
492f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_int(LLVMGetNumOperands(V));
493f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
494f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
4958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
4968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
49846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
49946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
500344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
501344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
502344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
50346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
50446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
5058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
507344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
50846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
50946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
510344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
511344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
5126563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
5136563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) {
5146563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return LLVMIsAConstantExpr(Val) ?
5156563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      Val_int(LLVMGetConstOpcode(Val)) : Val_int(0);
5166563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
5176563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
51846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/
51946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
52046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */
52146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) {
52246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_bool(LLVMHasMetadata(Val));
52346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
52446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
52546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */
52646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) {
52746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam1(MDKindID);
52846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef MD;
52946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) {
53046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
53146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) MD;
53246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
53346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
53446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
53546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
53646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
53746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
53846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID,
53946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                 LLVMValueRef MD) {
54046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), MD);
54146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
54246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
54346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
54446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */
54546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) {
54646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), NULL);
54746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
54846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
54946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
55046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
55146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/
55246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
55346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */
55446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) {
55546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDStringInContext(C, String_val(S), caml_string_length(S));
55646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
55746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
55846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */
55946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) {
56046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals),
56146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                             Wosize_val(ElementVals));
56246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
56346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
5644f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */
5654f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) {
56631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
56731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *S;
56831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  unsigned Len;
56931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
57031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if ((S = LLVMGetMDString(V, &Len))) {
57131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal2(Option, Str);
57231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
57331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Str = caml_alloc_string(Len);
57431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    memcpy(String_val(Str), S, Len);
57531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Option = alloc(1,0);
57631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(Option, 0, Str);
57731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
57831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
57931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
5804f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
5814f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin
5824f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value name)
5834f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{
5844f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLparam1(name);
5854f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLlocal1(Nodes);
5864f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(name)), 0);
5874f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  LLVMGetNamedMetadataOperands(M, String_val(name), (LLVMValueRef *) Nodes);
5884f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLreturn(Nodes);
5894f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
5908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
5918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
592e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */
593e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) {
594e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, (long long) Int_val(N), 1);
5958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
597344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
598e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
599e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                                          value SExt) {
600e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
601344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
602344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
6036563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */
6046563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const)
6056563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{
6066563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLparam0();
6076563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  if (LLVMIsAConstantInt(Const) &&
6086563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) {
6096563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    value Option = alloc(1, 0);
6106563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const));
6116563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    CAMLreturn(Option);
6126563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  }
6136563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLreturn(Val_int(0));
6146563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
6156563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
61645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */
61745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
61845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                               value Radix) {
61945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S),
62045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                     Int_val(Radix));
62145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
62245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
624e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) {
625e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstReal(RealTy, Double_val(N));
6268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
62845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */
62945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) {
63045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstRealOfStringAndSize(RealTy, String_val(S),
63145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                      caml_string_length(S));
63245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
63345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
6358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
636b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
637b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str,
638b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                        value NullTerminate) {
639b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
640b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  1);
641e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
642e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
643b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
644b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str,
645b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                         value NullTerminate) {
646b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
647b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  0);
6488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
651e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy,
65246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
653e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
654e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                        Wosize_val(ElementVals));
655e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
656e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
6575371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
6585371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) {
6595371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
6605371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 0);
6618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6636b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> llvalue array -> llvalue */
6646b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMValueRef llvm_const_named_struct(LLVMTypeRef Ty, value ElementVals) {
6656b228e506f42972c003599f4873a24910f8a530aTorok Edwin    return LLVMConstNamedStruct(Ty, (LLVMValueRef *) Op_val(ElementVals),  Wosize_val(ElementVals));
6666b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
6676b228e506f42972c003599f4873a24910f8a530aTorok Edwin
6685371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
6695371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C,
6705371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                               value ElementVals) {
6715371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
6725371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 1);
6738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
676e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
677e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals),
678e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals));
6794647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6804647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
6814647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/
6824647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
683404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */
6844647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred,
6854647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
6864647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
6874647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant);
6884647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6894647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
690404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */
6914647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred,
6924647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
6934647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
6944647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant);
6954647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6964647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
6974647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */
6984647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) {
6994647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7004647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                      Wosize_val(Indices));
7018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7031b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */
7041b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal,
7051b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                               value Indices) {
7061b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7071b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                              Wosize_val(Indices));
7081b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7091b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7101b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */
7111b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate,
7121b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                              value Indices) {
7131b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7141b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
7151b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
7161b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
7171b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7181b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
7191b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
7201b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
7211b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
7221b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7231b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstExtractValue(Aggregate, idxs, size);
7241b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
7251b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
7261b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7271b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7281b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */
7291b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate,
7301b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                             LLVMValueRef Val, value Indices) {
7311b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7321b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
7331b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
7341b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
7351b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7361b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
7371b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
7381b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
7391b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
7401b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7411b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstInsertValue(Aggregate, Val, idxs, size);
7421b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
7431b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
7441b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7451b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
746ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */
747ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm,
748ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value Constraints, value HasSideEffects,
749ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value IsAlignStack) {
750ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar  return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints),
751ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                            Bool_val(HasSideEffects), Bool_val(IsAlignStack));
752ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar}
753ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar
7548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
7558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
75746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
75846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
7598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
761404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */
76246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
76346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
7648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
766404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */
76746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
76846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
7698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
77346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
77446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
7758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
77846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
77946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
7808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
783404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */
78446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
78546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
7868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
788404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */
78946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
79046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
7918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
79546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
79646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
7978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
80046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
80146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
8028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
805705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/
806705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
807705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */
808705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) {
809705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
810705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef First;
811705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((First = LLVMGetFirstUse(Val))) {
812705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
813705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) First;
814705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
815705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
816705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
817705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
818705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
819705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */
820705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) {
821705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
822705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef Next;
823705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((Next = LLVMGetNextUse(U))) {
824705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
825705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) Next;
826705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
827705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
828705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
829705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
830705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
831705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
832705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) {
833705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUser(UR);
834705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
835705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
836705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
837705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) {
838705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUsedValue(UR);
839705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
840705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
8418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
8428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8434733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef,
8444733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
8454733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
8468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
84746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
84846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
8496d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
8506d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
8516d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
85257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0));
8536d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return GlobalVar;
8546d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
85546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
8568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8588e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */
8598e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name,
8608e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    value AddressSpace,
8618e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    LLVMModuleRef M) {
8628e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar;
8638e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
8648e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
8658e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar      return LLVMConstBitCast(GlobalVar,
8668e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                              LLVMPointerType(Ty, Int_val(AddressSpace)));
8678e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    return GlobalVar;
8688e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  }
8698e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return LLVMAddGlobal(M, Ty, String_val(Name));
8708e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
8718e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
8726d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
8736d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
8746d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
8756d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
8766d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
87775e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
8786d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) GlobalVar;
8796d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
8806d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
8816d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
8826d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
8836d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
8848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
88546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
88646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
88746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
8888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
8898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
89046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
8918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8938e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */
8948e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name,
8958e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMValueRef Initializer,
8968e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   value AddressSpace,
8978e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMModuleRef M) {
8988e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M,
8998e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       LLVMTypeOf(Initializer),
9008e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       String_val(Name),
9018e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       Int_val(AddressSpace));
9028e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMSetInitializer(GlobalVar, Initializer);
9038e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return GlobalVar;
9048e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
9058e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
9068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
90746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
90846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
9098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
91346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
91446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
91546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
9168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
92046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
92146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
9228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
92646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
92746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
9288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
93146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
93246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
93346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
93446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
93546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
93646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
937c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */
938c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) {
939c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_bool(LLVMIsGlobalConstant(GlobalVar));
940c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
941c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
942c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */
943c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) {
944c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag));
945c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_unit;
946c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
947c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
9486ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/
9496ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
9506ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty,
9516ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar                                     LLVMValueRef Aliasee, value Name) {
9526ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar  return LLVMAddAlias(M, Ty, Aliasee, String_val(Name));
9536ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar}
9546ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
95546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
95646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
9574733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef,
9584733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
9594733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
96046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
96146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
96246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
9636d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
9646d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
9656d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty)
96657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0));
9676d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return Fn;
9686d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
96946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
97046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
97146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
9726d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
9736d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
9746d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
9756d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
9766d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
97775e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
9786d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) Fn;
9796d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
9806d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
9816d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
9826d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
9836d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
98446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
98546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
98646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
98746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
988b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry");
98946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
99046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
99146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
99246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
99346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
99446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
99546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
99646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
99746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
99846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
99946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
100046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
100146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
100246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
100346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
100446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
100546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
100646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
100746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
100846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
100946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
101046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
101146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
101246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
101346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
101480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */
10155eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) {
10165eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  const char *GC;
101780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLparam0();
101880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLlocal2(Name, Option);
101980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
10205eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  if ((GC = LLVMGetGC(Fn))) {
10215eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    Name = copy_string(GC);
102280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
102380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Option = alloc(1, 0);
102480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Field(Option, 0) = Name;
102580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Option);
102680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  } else {
102780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Val_int(0));
102880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  }
102980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
103080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
103180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */
10325eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) {
10335eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
103480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  return Val_unit;
103580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
103680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
1037e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
1038e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) {
10390941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMAddFunctionAttr(Arg, Int_val(PA));
1040e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1041e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1042e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1043e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
1044e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) {
10450941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMRemoveFunctionAttr(Arg, Int_val(PA));
1046e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1047e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
10484733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/
10494733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10504733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent)
10514733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10524733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */
10534733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
10544733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
10554733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
10564733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1057e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */
1058e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) {
10594733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
10604733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
10614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Params;
10624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
10634733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1064e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
1065e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) {
10660941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMAddAttribute(Arg, Int_val(PA));
1067e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1068e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1069e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1070e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
1071e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) {
10720941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMRemoveAttribute(Arg, Int_val(PA));
1073e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1074e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1075e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1076e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */
1077e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
1078e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  LLVMSetParamAlignment(Arg, Int_val(align));
1079e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1080e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1081e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
108246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
108346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10844733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(
10854733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent)
10864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
108746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
108846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
108946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
109046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
109146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
109246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
109346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
109446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
109546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
109646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
109746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
109846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
109946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
110046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
1101b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name,
1102b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMValueRef Fn) {
1103b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name));
110446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
110546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
110646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
1107b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name,
1108b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMBasicBlockRef BB) {
1109b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name));
111046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
111146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
111246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
111346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
111446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
111546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
111646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1117033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/
1118033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
1119033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
1120033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen                 LLVMGetInstructionParent)
1121033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
11226563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
11236563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
11243dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  LLVMOpcode o;
11253dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!LLVMIsAInstruction(Inst))
11263dd16741864302af14b31b7f75375c09d8544a35Torok Edwin      failwith("Not an instruction");
11273dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  o = LLVMGetInstructionOpcode(Inst);
11286563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  assert (o <= LLVMUnwind );
11296563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return Val_int(o);
11306563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
1131033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
11324917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin/* llvalue -> ICmp.t */
11334917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
113431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
113531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  int x = LLVMGetICmpPredicate(Val);
113631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (x) {
113731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    value Option = alloc(1, 0);
113831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Field(Option, 0) = Val_int(x - LLVMIntEQ);
113931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
114031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
114131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
11424917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin}
11434917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
11444917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
1145cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/
1146cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1147cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */
1148cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
1149cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_int(LLVMGetInstructionCallConv(Inst));
1150cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1151cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1152cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */
1153cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
1154cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  LLVMSetInstructionCallConv(Inst, Int_val(CC));
1155cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_unit;
1156cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1157cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1158e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */
1159e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr,
1160e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value index,
1161e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value PA) {
11620941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMAddInstrAttribute(Instr, Int_val(index), Int_val(PA));
1163e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1164e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1165e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1166e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */
1167e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr,
1168e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value index,
1169e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value PA) {
11700941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMRemoveInstrAttribute(Instr, Int_val(index), Int_val(PA));
1171e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1172e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1173e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
117407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/
117507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
117607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */
117707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
117807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_bool(LLVMIsTailCall(CallInst));
117907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
118007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
118107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */
118207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall,
118307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen                                  LLVMValueRef CallInst) {
118407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  LLVMSetTailCall(CallInst, Bool_val(IsTailCall));
118507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_unit;
118607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
118707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
11882618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/
11892618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11902618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */
11912618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
11922618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMAddIncoming(PhiNode,
11932618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMValueRef*) &Field(Incoming, 0),
11942618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMBasicBlockRef*) &Field(Incoming, 1),
11952618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  1);
11962618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return Val_unit;
11972618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
11982618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11992618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */
12002618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
12012618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  unsigned I;
12022618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLparam0();
12032618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLlocal3(Hd, Tl, Tmp);
12042618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12052618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  /* Build a tuple list of them. */
12062618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Tl = Val_int(0);
12072618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
12082618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Hd = alloc(2, 0);
12092618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
12102618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
12112618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12122618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tmp = alloc(2, 0);
12132618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 0, Hd);
12142618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 1, Tl);
12152618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tl = Tmp;
12162618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
12172618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12182618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLreturn(Tl);
12192618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
12202618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
122146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
122246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
122346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
122446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
122546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1226a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) {
122746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
122846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
122946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
123046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
123189f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  (char *) "IRBuilder",
123246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
123346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
123446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
123546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
123646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
123746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
123846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1239a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) {
1240a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
1241a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  Builder_val(V) = B;
1242a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  return V;
1243a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1244a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
12455371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */
12465371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) {
12475371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return alloc_builder(LLVMCreateBuilderInContext(C));
1248a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1249a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
1250033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */
1251033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) {
1252033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  if (Tag_val(Pos) == 0) {
1253033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0));
1254033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderAtEnd(Builder_val(B), BB);
1255033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  } else {
1256033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0));
1257033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderBefore(Builder_val(B), I);
1258033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  }
12598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
12608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
126146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1262dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */
1263628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) {
1264dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B));
1265dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  if (!InsertBlock)
1266dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen    raise_not_found();
1267dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  return InsertBlock;
1268dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen}
1269dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen
12705c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */
1271628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) {
1272628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar  LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name));
12735c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar  return Val_unit;
12745c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar}
12755c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar
127646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/
127746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
127846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
127946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) {
128046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), V);
128146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
128246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
128346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
128446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */
128546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) {
128646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), NULL);
128746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
128846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
128946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
129046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */
129146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) {
129246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam0();
129346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef L;
129446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) {
129546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
129646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) L;
129746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
129846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
129946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
130046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
130146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
130246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
130346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) {
130446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetInstDebugLocation(Builder_val(B), V);
130546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
130646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
130746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
130846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
130946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
131046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
131146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
131246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
131346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
131446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
131546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
131646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
131746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
131846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
131946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
132046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
13216793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */
13226793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) {
13236793dd9769047706acf34420586716450344fb66Erick Tryzelaar  return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals),
13246793dd9769047706acf34420586716450344fb66Erick Tryzelaar                               Wosize_val(RetVals));
13256793dd9769047706acf34420586716450344fb66Erick Tryzelaar}
13266793dd9769047706acf34420586716450344fb66Erick Tryzelaar
132746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
132846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
132946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
133046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
133146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
133246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
133346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
133446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
133546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
133646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
133746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
133846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
133946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
134046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
134146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
134246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
134346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
134446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
134546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
134646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
134746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
13481430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
13491430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal,
135021491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen                             LLVMBasicBlockRef Dest) {
135121491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  LLVMAddCase(Switch, OnVal, Dest);
135221491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  return Val_unit;
135321491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen}
135421491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen
1355c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */
1356c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr,
1357c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value EstimatedDests,
1358c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value B) {
1359c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests);
1360c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1361c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
1362c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
1363c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr,
1364c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                    LLVMBasicBlockRef Dest) {
1365c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  LLVMAddDestination(IndirectBr, Dest);
1366c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return Val_unit;
1367c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1368c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
136946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
137046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
137146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
137246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
137346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
137446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
137546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
137646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
137746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
137846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
137946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
138046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
138146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
138246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
138346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
138446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
138546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
138646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
138746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
138848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn,
138948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value NumClauses,  value Name,
139048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value B) {
139148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses),
139248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                               String_val(Name));
139348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
139448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
139548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)
139648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{
139748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    LLVMSetCleanup(LandingPadInst, Bool_val(flag));
139848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return Val_unit;
139948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
140048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
140146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
140246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
140346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
140446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
140546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
140646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
140746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
140846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
140946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
141046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
141146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
141246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
141346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
141446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1415e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS,
1416e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1417e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name));
1418e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1419e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1420e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
142119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS,
142219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
142319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name));
142419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
142519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
142619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1427e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS,
1428e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1429e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name));
1430e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1431e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1432e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
143346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
143446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
143546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(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_sub(LLVMValueRef LHS, LLVMValueRef RHS,
144019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
144119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWSub(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_sub(LLVMValueRef LHS, LLVMValueRef RHS,
144619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
144719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name));
144819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
144919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
145019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1451e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS,
1452e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1453e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name));
1454e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1455e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1456e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
145746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
145846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
145946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
146046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
146146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
146246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
146319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
146419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
146519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name));
146619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
146719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
146819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
146919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
147019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
147119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name));
147219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
147319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
147419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1475e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS,
1476e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1477e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name));
1478e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1479e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1480e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
148146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
148246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
148346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
148446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
148546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
148646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
148746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
148846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
148946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
149046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
149146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1493e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
1494e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                            value Name, value B) {
1495e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name));
1496e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1497e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1498e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
149946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
150546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
150646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
150746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
150846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
150946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
151046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
151146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
151246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
151346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
151446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
151546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
151646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
151746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
152346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
152446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
152546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
152646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
152946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
153046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
153146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
153246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
153346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
153446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
153546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
153646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
153746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
153846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
153946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
154046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
154146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
154246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
154346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
154446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
154546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
154646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
154746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
154846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
154946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
155046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
155146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
155246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
155346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
155446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
155546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
155646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
155746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
155846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
155946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
156046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
156146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
156246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
156346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
156446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
156519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X,
156619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
156719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name));
156819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
156919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
157019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
157119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X,
157219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
157319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name));
157419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
157519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
157619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
157719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X,
157819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                     value Name, value B) {
157919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildFNeg(Builder_val(B), X, String_val(Name));
158019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
158119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
158219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
158346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
158446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
158546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
158646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
158746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
158846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
158946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
159046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
159146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
159246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
159346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
159446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
159546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
159646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
159746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
159846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
159946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
160046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
160146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
160346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
160446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
160546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
160646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
160746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
160946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
161046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
161146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
161246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
161346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
161446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
161546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
161646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
161746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
161846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
161946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
162046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
162146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1622e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
1623e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer,
1624e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value Indices, value Name,
1625e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1626e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInBoundsGEP(Builder_val(B), Pointer,
1627e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              (LLVMValueRef *) Op_val(Indices),
1628e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              Wosize_val(Indices), String_val(Name));
1629e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1630e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1631e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1632e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer,
1633c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                                               value Index, value Name,
1634e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1635c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner  return LLVMBuildStructGEP(Builder_val(B), Pointer,
1636c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                              Int_val(Index), String_val(Name));
1637e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1638e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1639e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1640e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) {
1641e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalString(Builder_val(B), String_val(Str),
1642e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1643e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1644e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1645e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1646e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name,
1647e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1648e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str),
1649e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                  String_val(Name));
1650e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1651e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
165246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
165346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
165446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
165546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
165646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
165746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
165846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
165946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
166046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
166146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
166246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
166346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
166446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
166546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
166646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
166746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
166846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
166946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
167046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
167146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
167246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
167346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
167446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
167546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
167646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
167746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
167846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
167946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
168046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
168146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
168246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
168446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
168546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
168646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
168746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
168846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
169146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
169246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
169346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
169446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
169546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
169746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
169846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
169946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
170046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
170146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
170246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
170346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
170446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
170546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
170646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
170746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
170846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
170946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
171046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
171146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
171246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
171346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
171446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
171546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
171646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
171746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
171846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
171946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
172046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
172146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
172246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
172346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
172446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
172546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1726e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1727e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1728e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1729e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1730e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1731e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1732e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1733e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1734e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1735e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1736e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1737e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1738e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1739e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X,
1740e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  LLVMTypeRef Ty, value Name,
1741e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1742e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1743e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1744e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1745e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1746e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty,
1747e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1748e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name));
1749e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1750e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1751e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1752e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty,
1753e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1754e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name));
1755e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1756e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1757e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1758e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty,
1759e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                        value Name, value B) {
1760e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name));
1761e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1762e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
176346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
176446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1765404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
176646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
176746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
176846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
176946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
177046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
177146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1773404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
177446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
177546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
177646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
177746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
177846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
177946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
178046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
178246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
17832618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
17842618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
17852618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  value Hd, Tl;
17862618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMValueRef FirstValue, PhiNode;
17872618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17882618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
17892618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17902618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Hd = Field(Incoming, 0);
17912618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  FirstValue = (LLVMValueRef) Field(Hd, 0);
17922618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
17932618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                         String_val(Name));
17942618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17952618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
17962618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    value Hd = Field(Tl, 0);
17972618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
17982618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                    (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
17992618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
18002618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
18012618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return PhiNode;
180246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
180446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
180546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
180646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
180746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
180846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
180946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
181046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
181146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
181246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
181346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
181446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
181546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
181646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
181746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
181846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
181946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
182046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
182146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
182246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
182346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
182446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
182546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
182646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
182746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
182846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
182946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
183046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
183146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
183246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
183346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
183446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
183546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
183646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
183746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
183846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
183946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
184046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
184146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
184246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
184346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
184446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
184546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
184646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1847e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1848e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate,
1849e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                              value Idx, value Name, value B) {
1850e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx),
1851e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1852e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1853e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1854e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */
1855e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate,
1856e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             LLVMValueRef Val, value Idx,
1857e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1858e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx),
1859e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              String_val(Name));
1860e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1861e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1862e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1863e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name,
1864e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value B) {
1865e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name));
1866e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1867e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1868e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1869e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name,
1870e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value B) {
1871e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name));
1872e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1873e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1874e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1875e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS,
1876e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1877e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name));
1878e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
18791ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
1880da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1881da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/
1882da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1883da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer
1884da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1885da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) {
1886da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Path);
1887da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1888da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1889da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1890da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path),
1891da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen                                               &MemBuf, &Message))
1892da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1893da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1894da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLreturn((value) MemBuf);
1895da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1896da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1897da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer
1898da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1899da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
1900da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1901da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1902da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1903da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message))
1904da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1905da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1906da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return MemBuf;
1907da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1908da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1909da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */
1910da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
1911da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMemoryBuffer(MemBuf);
1912da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
1913da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1914da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1915d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/
1916d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1917d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */
1918d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) {
1919d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return LLVMCreatePassManager();
1920d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1921d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1922d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */
1923d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M,
1924d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                           LLVMPassManagerRef PM) {
1925d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunPassManager(PM, M));
1926d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1927d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1928d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
1929d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) {
1930d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMInitializeFunctionPassManager(FPM));
1931d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1932d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1933d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */
1934d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F,
1935d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                             LLVMPassManagerRef FPM) {
1936d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunFunctionPassManager(FPM, F));
1937d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1938d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1939d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
1940d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) {
1941d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMFinalizeFunctionPassManager(FPM));
1942d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1943d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1944d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */
1945d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) {
1946d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  LLVMDisposePassManager(PM);
1947d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_unit;
1948d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1949