llvm_ocaml.c revision 850b520114dd6bd86fc8741201b9beea88f96599
1dfc58e3bcfcb8f37796b2ca1c289dd202f26d03cSylvestre Ledru/*===-- 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|*                                                                            *|
10dfc58e3bcfcb8f37796b2ca1c289dd202f26d03cSylvestre Ledru|* 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"
242618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen#include <assert.h>
25da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include <stdlib.h>
264f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin#include <string.h>
27da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
28da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
29da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Can't use the recommended caml_named_value mechanism for backwards
30da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   compatibility reasons. This is largely equivalent. */
31da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksenstatic value llvm_ioerror_exn;
32da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
33da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_register_core_exns(value IoError) {
34da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  llvm_ioerror_exn = Field(IoError, 0);
35da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  register_global_root(&llvm_ioerror_exn);
36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
38da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void llvm_raise(value Prototype, char *Message) {
40da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Prototype);
41da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLlocal1(CamlMessage);
42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CamlMessage = copy_string(Message);
44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMessage(Message);
45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  raise_with_arg(Prototype, CamlMessage);
472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  abort(); /* NOTREACHED */
48a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#ifdef CAMLnoreturn
49a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen  CAMLnoreturn; /* Silences warnings, but is missing in some versions. */
50a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#endif
51da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
534733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksenstatic value alloc_variant(int tag, void *Value) {
544733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Iter = alloc_small(1, tag);
554733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  Field(Iter, 0) = Val_op(Value);
564733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Iter;
574733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
584733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
594733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* Macro to convert the C first/next/last/prev idiom to the Ocaml llpos/
604733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen   llrev_pos idiom. */
614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen#define DEFINE_ITERATORS(camlname, cname, pty, cty, pfun) \
624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llpos */                        \
634733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_begin(pty Mom) {       \
644733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty First = LLVMGetFirst##cname(Mom);                 \
654733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (First)                                            \
664733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, First);                     \
674733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
684733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
704733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llpos */                         \
714733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_succ(cty Kid) {        \
724733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Next = LLVMGetNext##cname(Kid);                   \
734733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Next)                                             \
744733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Next);                      \
75f440691a20eff24cf59ac14e10057234ae182dbeGordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
764733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
774733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
784733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llrev_pos */                    \
794733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_end(pty Mom) {         \
804733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Last = LLVMGetLast##cname(Mom);                   \
814733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Last)                                             \
824733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Last);                      \
834733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
844733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
854733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llrev_pos */                     \
874733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_pred(cty Kid) {        \
884733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Prev = LLVMGetPrevious##cname(Kid);               \
894733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Prev)                                             \
904733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Prev);                      \
914733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
924733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }
934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
955371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/*===-- Contexts ----------------------------------------------------------===*/
965371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
975371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
985371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_create_context(value Unit) {
995371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMContextCreate();
1005371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1015371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1025371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> unit */
1035371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_dispose_context(LLVMContextRef C) {
1045371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  LLVMContextDispose(C);
1055371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return Val_unit;
1065371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1075371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1085371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
1095371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_global_context(value Unit) {
1105371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetGlobalContext();
1115371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1125371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
11346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> int */
11446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_mdkind_id(LLVMContextRef C, value Name) {
11546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  unsigned MDKindID = LLVMGetMDKindIDInContext(C, String_val(Name),
11646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                               caml_string_length(Name));
11746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_int(MDKindID);
11846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
11946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
1208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/
1218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
122263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar/* llcontext -> string -> llmodule */
123263d989a719c1864862fc91f59193a6c2b55ca48Erick TryzelaarCAMLprim LLVMModuleRef llvm_create_module(LLVMContextRef C, value ModuleID) {
124263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar  return LLVMModuleCreateWithNameInContext(String_val(ModuleID), C);
1258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */
12846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) {
12946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeModule(M);
1308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
1318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
133a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
134a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_target_triple(LLVMModuleRef M) {
135a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetTarget(M));
136a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
137a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
138a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
139a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_target_triple(value Trip, LLVMModuleRef M) {
140a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetTarget(M, String_val(Trip));
141a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
142a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
143a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
144a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
145a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_data_layout(LLVMModuleRef M) {
146a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetDataLayout(M));
147a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
148a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
149a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
150a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_data_layout(value Layout, LLVMModuleRef M) {
151a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetDataLayout(M, String_val(Layout));
152a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
153a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
154a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
155af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen/* llmodule -> unit */
156af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon HenriksenCAMLprim value llvm_dump_module(LLVMModuleRef M) {
157af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  LLVMDumpModule(M);
158af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  return Val_unit;
159af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen}
160af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen
1618a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* string -> llmodule -> unit */
1628a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_print_module(value Filename, LLVMModuleRef M) {
1638a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  char* Message;
1648a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  if(LLVMPrintModuleToFile(M, String_val(Filename), &Message)) {
1658a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov    llvm_raise(llvm_ioerror_exn, Message);
1668a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  }
1678a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1688a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
1698a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
1708a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1718a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llmodule -> string */
1728a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_string_of_llmodule(LLVMModuleRef M) {
1738a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  char* ModuleCStr;
1748a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  ModuleCStr = LLVMPrintModuleToString(M);
1758a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1768a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  value ModuleStr = caml_copy_string(ModuleCStr);
1778a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMDisposeMessage(ModuleCStr);
1788a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1798a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return ModuleStr;
1808a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
1818a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1820941534c712d77243d9dda5e8c1d927563b4edffChris Lattner/* llmodule -> string -> unit */
1830941534c712d77243d9dda5e8c1d927563b4edffChris LattnerCAMLprim value llvm_set_module_inline_asm(LLVMModuleRef M, value Asm) {
1840941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMSetModuleInlineAsm(M, String_val(Asm));
1850941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  return Val_unit;
1860941534c712d77243d9dda5e8c1d927563b4edffChris Lattner}
1878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/
1898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
190404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* lltype -> TypeKind.t */
19146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) {
19246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetTypeKind(Ty));
1938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
195ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok EdwinCAMLprim value llvm_type_is_sized(LLVMTypeRef Ty) {
196ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin    return Val_bool(LLVMTypeIsSized(Ty));
197ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin}
198ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin
1995371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* lltype -> llcontext */
2005371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_type_context(LLVMTypeRef Ty) {
2015371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetTypeContext(Ty);
2025371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
2035371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
2048a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* lltype -> unit */
2058a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_dump_type(LLVMTypeRef Val) {
2068a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMDumpType(Val);
2078a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
2088a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
2098a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2108a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* lltype -> string */
2118a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_string_of_lltype(LLVMTypeRef M) {
2128a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  char* TypeCStr;
2138a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  TypeCStr = LLVMPrintTypeToString(M);
2148a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2158a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  value TypeStr = caml_copy_string(TypeCStr);
2168a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMDisposeMessage(TypeCStr);
2178a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2188a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return TypeStr;
2198a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
2208a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/
2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
223b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
224b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i1_type (LLVMContextRef Context) {
225b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt1TypeInContext(Context);
226b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
227b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
228b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
229b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i8_type (LLVMContextRef Context) {
230b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt8TypeInContext(Context);
231b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
232b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
233b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
234b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i16_type (LLVMContextRef Context) {
235b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt16TypeInContext(Context);
236b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
237b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
238b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
239b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i32_type (LLVMContextRef Context) {
240b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt32TypeInContext(Context);
241b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
242b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
243b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
244b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i64_type (LLVMContextRef Context) {
245b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt64TypeInContext(Context);
246b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
2478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
248b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> int -> lltype */
249b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_integer_type(LLVMContextRef Context, value Width) {
250b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMIntTypeInContext(Context, Int_val(Width));
2518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
25446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) {
25546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetIntTypeWidth(IntegerTy));
2568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/
2598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
260b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
261b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_float_type(LLVMContextRef Context) {
262b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFloatTypeInContext(Context);
2638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
265b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
266b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_double_type(LLVMContextRef Context) {
267b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMDoubleTypeInContext(Context);
2688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
270b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
271b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_x86fp80_type(LLVMContextRef Context) {
272b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMX86FP80TypeInContext(Context);
2738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
275b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
276b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_fp128_type(LLVMContextRef Context) {
277b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFP128TypeInContext(Context);
2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
280b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
281b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_ppc_fp128_type(LLVMContextRef Context) {
282b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMPPCFP128TypeInContext(Context);
2838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/
2868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
287957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
288957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) {
28981a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
290957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 0);
291957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
292957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
293957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
294957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy,
295957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                                                value ParamTys) {
296957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
297957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 1);
2988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */
30146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) {
30246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsFunctionVarArg(FunTy));
3038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
30646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
30746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
30846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
30946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
3108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/
3138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3145371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
3155371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_struct_type(LLVMContextRef C, value ElementTypes) {
3165371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
3175371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 0);
318957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
319957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
3205371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
3215371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C,
3225371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                             value ElementTypes) {
3235371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
3245371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 1);
3258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3276b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* llcontext -> string -> lltype */
3286b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMTypeRef llvm_named_struct_type(LLVMContextRef C,
3296b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                            value Name) {
3306b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return LLVMStructCreateNamed(C, String_val(Name));
3316b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3326b228e506f42972c003599f4873a24910f8a530aTorok Edwin
3336b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_struct_set_body(LLVMTypeRef Ty,
3346b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                    value ElementTypes,
3356b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                    value Packed) {
3366b228e506f42972c003599f4873a24910f8a530aTorok Edwin  LLVMStructSetBody(Ty, (LLVMTypeRef *) ElementTypes,
3376b228e506f42972c003599f4873a24910f8a530aTorok Edwin                    Wosize_val(ElementTypes), Bool_val(Packed));
3386b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return Val_unit;
3396b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3406b228e506f42972c003599f4873a24910f8a530aTorok Edwin
341c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin/* lltype -> string option */
342c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok EdwinCAMLprim value llvm_struct_name(LLVMTypeRef Ty)
343c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin{
34431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
34531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *C = LLVMGetStructName(Ty);
34631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (C) {
34731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal1(result);
34831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    result = caml_alloc_small(1, 0);
34931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(result, 0, caml_copy_string(C));
35031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(result);
35131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
35231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
353c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin}
354c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin
3558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
3561940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) {
35746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
35846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
35946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
3608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
36246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */
36346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
36446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsPackedStruct(StructTy));
3658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3676b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> bool */
3686b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_is_opaque(LLVMTypeRef StructTy) {
3696b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return Val_bool(LLVMIsOpaqueStruct(StructTy));
3706b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3716b228e506f42972c003599f4873a24910f8a530aTorok Edwin
3728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/
3738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
375957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) {
37681a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMArrayType(ElementTy, Int_val(Count));
3778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
37957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */
38057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) {
38157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, 0);
38257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
38357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
38457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */
38557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy,
38657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen                                                 value AddressSpace) {
38757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, Int_val(AddressSpace));
38857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
38957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
3908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
391957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) {
39281a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMVectorType(ElementTy, Int_val(Count));
3938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
39646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
39746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetArrayLength(ArrayTy));
3988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
40157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) {
40257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return Val_int(LLVMGetPointerAddressSpace(PtrTy));
40357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
40457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
40557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */
40646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
40746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVectorSize(VectorTy));
4088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/
4118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
412b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
413b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) {
414b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMVoidTypeInContext(Context);
415b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
416b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
417b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
418b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) {
419b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMLabelTypeInContext(Context);
420b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
4218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4228a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llcontext -> lltype */
4238a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMTypeRef llvm_x86_mmx_type(LLVMContextRef Context) {
4248a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return LLVMX86MMXTypeInContext(Context);
4258a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
4268a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
427ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_type_by_name(LLVMModuleRef M, value Name)
428ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
429ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLparam1(Name);
430ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMTypeRef Ty = LLVMGetTypeByName(M, String_val(Name));
431ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  if (Ty) {
432ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    value Option = alloc(1, 0);
433ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    Field(Option, 0) = (value) Ty;
434ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    CAMLreturn(Option);
435ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  }
436ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLreturn(Val_int(0));
437ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
438ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
4398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/
4408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */
44246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
44346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMTypeOf(Val);
4448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4463dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* keep in sync with ValueKind.t */
4473dd16741864302af14b31b7f75375c09d8544a35Torok Edwinenum ValueKind {
4483dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  NullValue=0,
4493dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Argument,
4503dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BasicBlock,
4513dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  InlineAsm,
4523dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDNode,
4533dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDString,
4543dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BlockAddress,
4553dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantAggregateZero,
4563dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantArray,
45734b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov  ConstantDataArray,
45834b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov  ConstantDataVector,
4593dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantExpr,
4603dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantFP,
4613dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantInt,
4623dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantPointerNull,
4633dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantStruct,
4643dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantVector,
4653dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Function,
4663dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalAlias,
4673dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalVariable,
4683dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  UndefValue,
4693dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Instruction
4703dd16741864302af14b31b7f75375c09d8544a35Torok Edwin};
4713dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4723dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* llvalue -> ValueKind.t */
4733dd16741864302af14b31b7f75375c09d8544a35Torok Edwin#define DEFINE_CASE(Val, Kind) \
4743dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    do {if (LLVMIsA##Kind(Val)) CAMLreturn(Val_int(Kind));} while(0)
4753dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4763dd16741864302af14b31b7f75375c09d8544a35Torok EdwinCAMLprim value llvm_classify_value(LLVMValueRef Val) {
4773dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  CAMLparam0();
4783dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!Val)
4793dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(Val_int(NullValue));
4803dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAConstant(Val)) {
4813dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, BlockAddress);
4823dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantAggregateZero);
4833dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantArray);
48434b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov    DEFINE_CASE(Val, ConstantDataArray);
48534b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov    DEFINE_CASE(Val, ConstantDataVector);
4863dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantExpr);
4873dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantFP);
4883dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantInt);
4893dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantPointerNull);
4903dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantStruct);
4913dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantVector);
4923dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4933dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAInstruction(Val)) {
4943dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLlocal1(result);
4953dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    result = caml_alloc_small(1, 0);
4963dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val)));
4973dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(result);
4983dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4993dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAGlobalValue(Val)) {
5003dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, Function);
5013dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalAlias);
5023dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalVariable);
5033dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
5043dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, Argument);
5053dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, BasicBlock);
5063dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, InlineAsm);
5073dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDNode);
5083dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDString);
5093dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, UndefValue);
5103dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  failwith("Unknown Value class");
5113dd16741864302af14b31b7f75375c09d8544a35Torok Edwin}
5123dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
5138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
51446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) {
51546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetValueName(Val));
5168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
51946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
52046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetValueName(Val, String_val(Name));
5218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
5228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
52488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */
52588cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) {
52688cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  LLVMDumpValue(Val);
52788cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  return Val_unit;
52888cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen}
52988cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen
530ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov/* llvalue -> string */
531850b520114dd6bd86fc8741201b9beea88f96599Peter ZotovCAMLprim value llvm_string_of_llvalue(LLVMValueRef M) {
532850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  char* ValueCStr;
533850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  ValueCStr = LLVMPrintValueToString(M);
534ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov
535850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  value ValueStr = caml_copy_string(ValueCStr);
536850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  LLVMDisposeMessage(ValueCStr);
537ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov
538850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  return ValueStr;
539ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov}
540ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov
54188d74c3093de563408ceb834d999613038195e98Peter Zotov/* llvalue -> llvalue -> unit */
54288d74c3093de563408ceb834d999613038195e98Peter ZotovCAMLprim value llvm_replace_all_uses_with(LLVMValueRef OldVal,
54388d74c3093de563408ceb834d999613038195e98Peter Zotov                                          LLVMValueRef NewVal) {
54488d74c3093de563408ceb834d999613038195e98Peter Zotov  LLVMReplaceAllUsesWith(OldVal, NewVal);
54588d74c3093de563408ceb834d999613038195e98Peter Zotov  return Val_unit;
54688d74c3093de563408ceb834d999613038195e98Peter Zotov}
54788d74c3093de563408ceb834d999613038195e98Peter Zotov
548b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/
549b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
550b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */
551b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) {
552b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar  return LLVMGetOperand(V, Int_val(I));
553b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar}
554b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
555f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
556f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) {
557f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  LLVMSetOperand(U, Int_val(I), V);
558f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_unit;
559f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
560f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
561f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */
562f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) {
563f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_int(LLVMGetNumOperands(V));
564f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
565f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
5668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
5678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
56946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
57046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
571344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
572344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
573344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
57446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
57546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
5768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
578344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
57946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
58046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
581344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
582344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
5836563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
5846563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) {
5856563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return LLVMIsAConstantExpr(Val) ?
5866563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      Val_int(LLVMGetConstOpcode(Val)) : Val_int(0);
5876563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
5886563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
58946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/
59046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
59146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */
59246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) {
59346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_bool(LLVMHasMetadata(Val));
59446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
59546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
59646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */
59746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) {
59846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam1(MDKindID);
59946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef MD;
60046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) {
60146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
60246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) MD;
60346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
60446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
60546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
60646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
60746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
60846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
60946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID,
61046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                 LLVMValueRef MD) {
61146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), MD);
61246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
61346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
61446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
61546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */
61646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) {
61746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), NULL);
61846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
61946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
62046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
62146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
62246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/
62346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
62446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */
62546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) {
62646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDStringInContext(C, String_val(S), caml_string_length(S));
62746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
62846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
62946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */
63046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) {
63146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals),
63246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                             Wosize_val(ElementVals));
63346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
63446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
6354f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */
6364f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) {
63731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
63831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *S;
63931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  unsigned Len;
64031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
64131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if ((S = LLVMGetMDString(V, &Len))) {
64231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal2(Option, Str);
64331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
64431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Str = caml_alloc_string(Len);
64531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    memcpy(String_val(Str), S, Len);
64631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Option = alloc(1,0);
64731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(Option, 0, Str);
64831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
64931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
65031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
6514f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
6524f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin
6536b8416192aeb6502f027883b8056d389f2c186a9Peter Zotov/* llmodule -> string -> llvalue array */
654e5de63c7de04c81d7d8484e5b64f47941143c739Peter ZotovCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value Name)
6554f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{
656e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  CAMLparam1(Name);
6574f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLlocal1(Nodes);
658e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(Name)), 0);
659e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  LLVMGetNamedMetadataOperands(M, String_val(Name), (LLVMValueRef *) Nodes);
6604f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLreturn(Nodes);
6614f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
6628a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
6638a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llmodule -> string -> llvalue -> unit */
6648a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_append_namedmd(LLVMModuleRef M, value Name, LLVMValueRef Val) {
6658a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMAddNamedMetadataOperand(M, String_val(Name), Val);
6668a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
6678a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
6688a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
6698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
6708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
671e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */
672e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) {
673e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, (long long) Int_val(N), 1);
6748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
676344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
677e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
678e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                                          value SExt) {
679e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
680344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
681344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
6826563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */
6836563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const)
6846563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{
6856563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLparam0();
6866563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  if (LLVMIsAConstantInt(Const) &&
6876563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) {
6886563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    value Option = alloc(1, 0);
6896563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const));
6906563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    CAMLreturn(Option);
6916563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  }
6926563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLreturn(Val_int(0));
6936563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
6946563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
69545d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */
69645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
69745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                               value Radix) {
69845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S),
69945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                     Int_val(Radix));
70045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
70145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
7028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
703e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) {
704e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstReal(RealTy, Double_val(N));
7058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
70745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */
70845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) {
70945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstRealOfStringAndSize(RealTy, String_val(S),
71045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                      caml_string_length(S));
71145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
71245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
7138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
7148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
715b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
716b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str,
717b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                        value NullTerminate) {
718b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
719b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  1);
720e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
721e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
722b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
723b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str,
724b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                         value NullTerminate) {
725b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
726b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  0);
7278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
730e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy,
73146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
732e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
733e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                        Wosize_val(ElementVals));
734e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
735e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
7365371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
7375371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) {
7385371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
7395371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 0);
7408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7426b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> llvalue array -> llvalue */
7436b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMValueRef llvm_const_named_struct(LLVMTypeRef Ty, value ElementVals) {
7446b228e506f42972c003599f4873a24910f8a530aTorok Edwin    return LLVMConstNamedStruct(Ty, (LLVMValueRef *) Op_val(ElementVals),  Wosize_val(ElementVals));
7456b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
7466b228e506f42972c003599f4873a24910f8a530aTorok Edwin
7475371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
7485371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C,
7495371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                               value ElementVals) {
7505371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
7515371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 1);
7528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
755e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
756e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals),
757e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals));
7584647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7594647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
7604647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/
7614647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
762404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */
7634647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred,
7644647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
7654647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
7664647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant);
7674647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7684647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
769404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */
7704647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred,
7714647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
7724647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
7734647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant);
7744647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7754647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
7764647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */
7774647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) {
7784647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7794647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                      Wosize_val(Indices));
7808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7821b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */
7831b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal,
7841b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                               value Indices) {
7851b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7861b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                              Wosize_val(Indices));
7871b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7881b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
789c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov/* llvalue -> lltype -> is_signed:bool -> llvalue */
790c8ac229cc8349685117f68bc6f1da04f98015cd6Peter ZotovCAMLprim LLVMValueRef llvm_const_intcast(LLVMValueRef CV, LLVMTypeRef T,
791c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov                                         value IsSigned) {
792c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov  return LLVMConstIntCast(CV, T, Bool_val(IsSigned));
793c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov}
794c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov
7951b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */
7961b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate,
7971b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                              value Indices) {
7981b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7991b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
8001b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
8011b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
8021b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8031b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
8041b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
8051b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
8061b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
8071b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8081b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstExtractValue(Aggregate, idxs, size);
8091b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
8101b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
8111b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
8121b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8131b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */
8141b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate,
8151b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                             LLVMValueRef Val, value Indices) {
8161b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
8171b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
8181b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
8191b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
8201b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8211b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
8221b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
8231b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
8241b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
8251b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8261b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstInsertValue(Aggregate, Val, idxs, size);
8271b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
8281b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
8291b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
8301b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
831ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */
832ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm,
833ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value Constraints, value HasSideEffects,
834ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value IsAlignStack) {
835ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar  return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints),
836ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                            Bool_val(HasSideEffects), Bool_val(IsAlignStack));
837ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar}
838ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar
8398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
8408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
84246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
84346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
8448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
846404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */
84746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
84846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
8498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
851404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */
85246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
85346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
8548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
85846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
85946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
8608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
86346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
86446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
8658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
868404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */
86946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
87046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
8718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
873404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */
87446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
87546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
8768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
88046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
88146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
8828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
88546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
88646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
8878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
890705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/
891705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
892705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */
893705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) {
894705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
895705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef First;
896705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((First = LLVMGetFirstUse(Val))) {
897705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
898705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) First;
899705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
900705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
901705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
902705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
903705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
904705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */
905705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) {
906705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
907705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef Next;
908705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((Next = LLVMGetNextUse(U))) {
909705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
910705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) Next;
911705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
912705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
913705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
914705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
915705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
916705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
917705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) {
918705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUser(UR);
919705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
920705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
921705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
922705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) {
923705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUsedValue(UR);
924705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
925705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
9268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
9278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9284733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef,
9294733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
9304733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
9318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
93246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
93346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
9346d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
9356d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
9366d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
93757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0));
9386d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return GlobalVar;
9396d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
94046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
9418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9438e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */
9448e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name,
9458e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    value AddressSpace,
9468e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    LLVMModuleRef M) {
9478e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar;
9488e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
9498e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
9508e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar      return LLVMConstBitCast(GlobalVar,
9518e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                              LLVMPointerType(Ty, Int_val(AddressSpace)));
9528e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    return GlobalVar;
9538e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  }
954150c95eab549e1d764eab7ed05b17fe09663fc6ePeter Zotov  return LLVMAddGlobalInAddressSpace(M, Ty, String_val(Name),
955150c95eab549e1d764eab7ed05b17fe09663fc6ePeter Zotov                                     Int_val(AddressSpace));
9568e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
9578e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
9586d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
9596d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
9606d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
9616d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
9626d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
96375e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
9646d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) GlobalVar;
9656d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
9666d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
9676d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
9686d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
9696d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
9708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
97146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
97246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
97346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
9748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
9758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
97646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
9778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9798e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */
9808e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name,
9818e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMValueRef Initializer,
9828e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   value AddressSpace,
9838e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMModuleRef M) {
9848e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M,
9858e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       LLVMTypeOf(Initializer),
9868e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       String_val(Name),
9878e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       Int_val(AddressSpace));
9888e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMSetInitializer(GlobalVar, Initializer);
9898e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return GlobalVar;
9908e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
9918e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
9928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
99346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
99446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
9958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
99946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
100046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
100146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
10028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
10038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
10048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
10058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
100646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
100746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
10088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
10098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
10108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
10118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
101246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
101346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
10148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
10158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
10168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
101746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
101846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
101946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
102046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
102146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
102246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10238a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> ThreadLocalMode.t */
10248a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_thread_local_mode(LLVMValueRef GlobalVar) {
10258a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_int(LLVMGetThreadLocalMode(GlobalVar));
10268a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10278a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
10288a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* ThreadLocalMode.t -> llvalue -> unit */
10298a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_thread_local_mode(value ThreadLocalMode,
10308a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                          LLVMValueRef GlobalVar) {
10318a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetThreadLocalMode(GlobalVar, Int_val(ThreadLocalMode));
10328a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
10338a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10348a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
10358a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> bool */
10368a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_is_externally_initialized(LLVMValueRef GlobalVar) {
10378a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_bool(LLVMIsExternallyInitialized(GlobalVar));
10388a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10398a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
10408a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* bool -> llvalue -> unit */
10418a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_externally_initialized(value IsExternallyInitialized,
10428a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                               LLVMValueRef GlobalVar) {
10438a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetExternallyInitialized(GlobalVar, Bool_val(IsExternallyInitialized));
10448a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
10458a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10468a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1047c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */
1048c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) {
1049c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_bool(LLVMIsGlobalConstant(GlobalVar));
1050c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
1051c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
1052c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */
1053c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) {
1054c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag));
1055c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_unit;
1056c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
1057c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
10586ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/
10596ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
10606ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty,
10616ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar                                     LLVMValueRef Aliasee, value Name) {
10626ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar  return LLVMAddAlias(M, Ty, Aliasee, String_val(Name));
10636ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar}
10646ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
106546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
106646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10674733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef,
10684733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
10694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
107046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
107146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
107246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
10736d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
10746d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
10756d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty)
107657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0));
10776d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return Fn;
10786d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
107946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
108046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
108146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10826d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
10836d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
10846d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
10856d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
10866d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
108775e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
10886d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) Fn;
10896d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
10906d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
10916d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
10926d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
10936d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
109446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
109546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
109646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
109746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
1098b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry");
109946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
110046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
110146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
110246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
110346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
110446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
110546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
110646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
110746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
110846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
110946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
111046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
111146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
111246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
111346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
111446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
111546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
111646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
111746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
111846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
111946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
112046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
112146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
112246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
112346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
112480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */
11255eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) {
11265eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  const char *GC;
112780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLparam0();
112880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLlocal2(Name, Option);
112980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
11305eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  if ((GC = LLVMGetGC(Fn))) {
11315eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    Name = copy_string(GC);
113280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
113380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Option = alloc(1, 0);
113480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Field(Option, 0) = Name;
113580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Option);
113680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  } else {
113780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Val_int(0));
113880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  }
113980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
114080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
114180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */
11425eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) {
11435eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
114480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  return Val_unit;
114580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
114680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
11470be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1148e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) {
11490be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddFunctionAttr(Arg, Int32_val(PA));
1150e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1151e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1152e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
11538a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> string -> string -> unit */
11548a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_add_target_dependent_function_attr(
11558a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                  LLVMValueRef Arg, value A, value V) {
11568a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMAddTargetDependentFunctionAttr(Arg, String_val(A), String_val(V));
11578a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
11588a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
11598a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
11600be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 */
11610be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_function_attr(LLVMValueRef Fn)
11620be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
11630be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
11640be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetFunctionAttr(Fn)));
11650be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
11660be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
11670be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1168e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) {
11690be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveFunctionAttr(Arg, Int32_val(PA));
1170e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1171e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
11724733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/
11734733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
11744733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent)
11754733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
11764733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */
11774733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
11784733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
11794733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
11804733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
11810be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int */
11820be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_param_attr(LLVMValueRef Param)
11830be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
11840be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
11850be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetAttribute(Param)));
11860be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
11870be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
1188e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */
1189e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) {
11904733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
11914733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
11924733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Params;
11934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
11944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
11950be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1196e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) {
11970be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddAttribute(Arg, Int32_val(PA));
1198e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1199e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1200e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
12010be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1202e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) {
12030be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveAttribute(Arg, Int32_val(PA));
1204e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1205e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1206e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1207e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */
1208e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
1209e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  LLVMSetParamAlignment(Arg, Int_val(align));
1210e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1211e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1212e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
121346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
121446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
12154733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(
12164733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent)
12174733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1218ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llbasicblock -> llvalue option */
1219ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_block_terminator(LLVMBasicBlockRef Block)
1220ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1221ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLparam0();
1222ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMValueRef Term = LLVMGetBasicBlockTerminator(Block);
1223ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  if (Term) {
1224ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    value Option = alloc(1, 0);
1225ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    Field(Option, 0) = (value) Term;
1226ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    CAMLreturn(Option);
1227ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  }
1228ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLreturn(Val_int(0));
1229ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1230ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
123146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
123246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
123346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
123446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
123546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
123646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
123746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
123846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
123946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
124046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
124146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
124246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
124346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
12448a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> unit */
12458a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_remove_block(LLVMBasicBlockRef BB) {
12468a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMRemoveBasicBlockFromParent(BB);
12478a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
12488a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
12498a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
12508a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> llbasicblock -> unit */
12518a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_move_block_before(LLVMBasicBlockRef Pos, LLVMBasicBlockRef BB) {
12528a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMMoveBasicBlockBefore(BB, Pos);
12538a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
12548a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
12558a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
12568a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> llbasicblock -> unit */
12578a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_move_block_after(LLVMBasicBlockRef Pos, LLVMBasicBlockRef BB) {
12588a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMMoveBasicBlockAfter(BB, Pos);
12598a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
12608a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
12618a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
126246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
1263b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name,
1264b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMValueRef Fn) {
1265b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name));
126646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
126746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
126846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
1269b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name,
1270b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMBasicBlockRef BB) {
1271b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name));
127246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
127346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
127446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
127546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
127646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
127746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
127846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1279033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/
1280033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
1281033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
1282033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen                 LLVMGetInstructionParent)
1283033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
12846563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
12856563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
12863dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  LLVMOpcode o;
12873dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!LLVMIsAInstruction(Inst))
12883dd16741864302af14b31b7f75375c09d8544a35Torok Edwin      failwith("Not an instruction");
12893dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  o = LLVMGetInstructionOpcode(Inst);
1290efde86753d6f324ac9d0b42e48fd3ebf40c17905Benjamin Kramer  assert (o <= LLVMLandingPad);
12916563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return Val_int(o);
12926563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
1293033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
12946b8416192aeb6502f027883b8056d389f2c186a9Peter Zotov/* llvalue -> ICmp.t option */
12954917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
129631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
129731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  int x = LLVMGetICmpPredicate(Val);
129831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (x) {
129931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    value Option = alloc(1, 0);
130031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Field(Option, 0) = Val_int(x - LLVMIntEQ);
130131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
130231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
130331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
13044917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin}
13054917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
13064917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
1307cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/
1308cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1309cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */
1310cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
1311cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_int(LLVMGetInstructionCallConv(Inst));
1312cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1313cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1314cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */
1315cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
1316cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  LLVMSetInstructionCallConv(Inst, Int_val(CC));
1317cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_unit;
1318cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1319cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
13200be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1321e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr,
1322e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value index,
1323e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value PA) {
13240be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1325e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1326e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1327e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
13280be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1329e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr,
1330e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value index,
1331e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value PA) {
13320be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1333e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1334e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1335e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
133607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/
133707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
133807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */
133907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
134007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_bool(LLVMIsTailCall(CallInst));
134107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
134207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
134307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */
134407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall,
134507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen                                  LLVMValueRef CallInst) {
134607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  LLVMSetTailCall(CallInst, Bool_val(IsTailCall));
134707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_unit;
134807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
134907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
13508a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/*--... Operations on load/store instructions (only)........................--*/
13518a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
13528a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> bool */
13538a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_is_volatile(LLVMValueRef MemoryInst) {
13548a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_bool(LLVMGetVolatile(MemoryInst));
13558a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
13568a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
13578a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* bool -> llvalue -> unit */
13588a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_volatile(value IsVolatile,
13598a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                  LLVMValueRef MemoryInst) {
13608a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetVolatile(MemoryInst, Bool_val(IsVolatile));
13618a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
13628a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
13638a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
13642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/
13652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13662618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */
13672618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
13682618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMAddIncoming(PhiNode,
13692618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMValueRef*) &Field(Incoming, 0),
13702618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMBasicBlockRef*) &Field(Incoming, 1),
13712618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  1);
13722618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return Val_unit;
13732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
13742618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13752618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */
13762618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
13772618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  unsigned I;
13782618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLparam0();
13792618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLlocal3(Hd, Tl, Tmp);
13802618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13812618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  /* Build a tuple list of them. */
13822618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Tl = Val_int(0);
13832618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
13842618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Hd = alloc(2, 0);
13852618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
13862618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
13872618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13882618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tmp = alloc(2, 0);
13892618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 0, Hd);
13902618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 1, Tl);
13912618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tl = Tmp;
13922618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
13932618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13942618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLreturn(Tl);
13952618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
13962618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
1397ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> unit */
1398ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_delete_instruction(LLVMValueRef Instruction) {
1399ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMInstructionEraseFromParent(Instruction);
1400ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return Val_unit;
1401ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
140246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
140346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
140446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
140546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
140646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1407a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) {
140846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
140946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
141046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
141146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
141219648c00d66d5fc35c7954faa0bc63a34f68cb9dPeter Zotov  (char *) "LLVMIRBuilder",
141346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
141446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
141546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
141646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
141746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
14184d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#ifdef custom_compare_ext_default
14194d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes  , custom_compare_ext_default
14204d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#endif
142146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
142246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1423a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) {
1424a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
1425a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  Builder_val(V) = B;
1426a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  return V;
1427a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1428a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
14295371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */
14305371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) {
14315371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return alloc_builder(LLVMCreateBuilderInContext(C));
1432a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1433a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
1434033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */
1435033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) {
1436033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  if (Tag_val(Pos) == 0) {
1437033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0));
1438033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderAtEnd(Builder_val(B), BB);
1439033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  } else {
1440033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0));
1441033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderBefore(Builder_val(B), I);
1442033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  }
14438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
14448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
144546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1446dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */
1447628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) {
1448dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B));
1449dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  if (!InsertBlock)
1450dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen    raise_not_found();
1451dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  return InsertBlock;
1452dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen}
1453dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen
14545c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */
1455628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) {
1456628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar  LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name));
14575c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar  return Val_unit;
14585c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar}
14595c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar
146046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/
146146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
146246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
146346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) {
146446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), V);
146546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
146646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
146746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
146846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */
146946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) {
147046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), NULL);
147146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
147246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
147346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
147446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */
147546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) {
147646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam0();
147746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef L;
147846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) {
147946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
148046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) L;
148146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
148246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
148346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
148446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
148546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
148646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
148746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) {
148846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetInstDebugLocation(Builder_val(B), V);
148946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
149046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
149146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
149246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
149446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
149646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
149746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
149846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
149946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
15056793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */
15066793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) {
15076793dd9769047706acf34420586716450344fb66Erick Tryzelaar  return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals),
15086793dd9769047706acf34420586716450344fb66Erick Tryzelaar                               Wosize_val(RetVals));
15096793dd9769047706acf34420586716450344fb66Erick Tryzelaar}
15106793dd9769047706acf34420586716450344fb66Erick Tryzelaar
151146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
151246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
151346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
151446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
151546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
151646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
151746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
152146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
152246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
152546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
152646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
152746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
152846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
152946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
153046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
153146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1532ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> string -> llbuilder -> llvalue */
1533ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_malloc(LLVMTypeRef Ty, value Name,
1534ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                        value B)
1535ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1536ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildMalloc(Builder_val(B), Ty, String_val(Name));
1537ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1538ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1539ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> string -> llbuilder -> llvalue */
1540ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_array_malloc(LLVMTypeRef Ty,
1541ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              LLVMValueRef Val,
1542ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              value Name, value B)
1543ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1544ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildArrayMalloc(Builder_val(B), Ty, Val, String_val(Name));
1545ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1546ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1547ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1548ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_free(LLVMValueRef P, value B)
1549ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1550ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildFree(Builder_val(B), P);
1551ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1552ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
15531430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
15541430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal,
155521491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen                             LLVMBasicBlockRef Dest) {
155621491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  LLVMAddCase(Switch, OnVal, Dest);
155721491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  return Val_unit;
155821491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen}
155921491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen
1560c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */
1561c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr,
1562c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value EstimatedDests,
1563c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value B) {
1564c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests);
1565c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1566c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
1567c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
1568c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr,
1569c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                    LLVMBasicBlockRef Dest) {
1570c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  LLVMAddDestination(IndirectBr, Dest);
1571c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return Val_unit;
1572c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1573c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
157446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
157546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
157646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
157746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
157846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
157946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
158046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
158146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
158246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
158346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
158446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
158546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
158646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
158746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
158846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
158946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
159046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
159146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
159246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1593ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> int -> string -> llbuilder -> llvalue */
159448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn,
159548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value NumClauses,  value Name,
159648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value B) {
159748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses),
159848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                               String_val(Name));
159948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
160048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1601ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llvalue -> unit */
1602ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_add_clause(LLVMValueRef LandingPadInst, LLVMValueRef ClauseVal)
1603ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1604ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    LLVMAddClause(LandingPadInst, ClauseVal);
1605ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return Val_unit;
1606ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1607ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1608ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1609ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> bool -> unit */
161048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)
161148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{
161248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    LLVMSetCleanup(LandingPadInst, Bool_val(flag));
161348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return Val_unit;
161448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
161548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1616ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1617ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_resume(LLVMValueRef Exn, value B)
1618ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1619ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return LLVMBuildResume(Builder_val(B), Exn);
1620ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1621ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
162246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
162346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
162446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
162546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
162646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
162746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
162846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
162946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
163046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
163146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
163246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
163346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
163446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
163546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1636e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS,
1637e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1638e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name));
1639e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1640e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1641e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
164219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS,
164319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
164419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name));
164519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
164619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
164719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1648e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS,
1649e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1650e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name));
1651e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1652e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1653e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
165446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
165546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
165646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
165746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
165846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
165946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
166019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
166119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
166219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name));
166319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
166419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
166519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
166619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
166719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
166819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name));
166919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
167019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
167119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1672e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS,
1673e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1674e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name));
1675e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1676e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1677e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
167846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
167946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
168046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
168146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
168346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
168419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
168519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
168619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name));
168719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
168819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
168919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
169019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
169119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
169219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name));
169319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
169419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
169519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1696e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS,
1697e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1698e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name));
1699e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1700e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1701e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
170246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
170346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
170446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
170546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
170646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
170746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
170846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
170946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
171046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
171146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
171246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
171346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1714e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
1715e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                            value Name, value B) {
1716e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name));
1717e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1718e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1719e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
172046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
172146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
172246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
172346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
172446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
172546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
172646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
172746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
172846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
172946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
173046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
173146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
173246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
173346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
173446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
173546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
173646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
173746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
173846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
173946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
174046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
174146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
174346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
174446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
174546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
174646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
174746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
174946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
175046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
175146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
175246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
175346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
175446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
175646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
175746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
175846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
175946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
176046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
176146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
176246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
176346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
176446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
176546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
176646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
176746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
176846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
176946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
177046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
177146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
177346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
177446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
177546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
177646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
177746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
177946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
178046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
178146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
178246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
178346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
178446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
178619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X,
178719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
178819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name));
178919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
179019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
179119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
179219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X,
179319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
179419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name));
179519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
179619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
179719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
179819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X,
179919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                     value Name, value B) {
180019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildFNeg(Builder_val(B), X, String_val(Name));
180119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
180219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
180319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
180446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
180546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
180646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
180746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
180946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
181046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
181146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
181246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
181346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
181446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
181546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
181646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
181746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
181846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
181946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
182046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
182146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
182246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
182346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
182446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
182546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
182646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
182746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
182846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
182946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
183046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
183146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
183246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
183346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
183446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
18358a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* AtomicRMWBinOp.t -> llvalue -> llvalue -> AtomicOrdering.t ->
18368a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov   bool -> llbuilder -> llvalue */
18378a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMValueRef llvm_build_atomicrmw_native(value BinOp, LLVMValueRef Ptr,
18388a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                                  LLVMValueRef Val, value Ord,
18398a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                                  value ST, value Name, value B) {
18408a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMValueRef Instr;
18418a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  Instr = LLVMBuildAtomicRMW(Builder_val(B), Int_val(BinOp),
18428a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                             Ptr, Val, Int_val(Ord), Bool_val(ST));
18438a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetValueName(Instr, String_val(Name));
18448a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Instr;
18458a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
18468a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
18478a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMValueRef llvm_build_atomicrmw_bytecode(value *argv, int argn) {
18488a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return llvm_build_atomicrmw_native(argv[0], (LLVMValueRef) argv[1],
18498a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                     (LLVMValueRef) argv[2], argv[3],
18508a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                     argv[4], argv[5], argv[6]);
18518a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
18528a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
185346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
185446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
185546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
185646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
185746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
185846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
185946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
186046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1861e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
1862e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer,
1863e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value Indices, value Name,
1864e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1865e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInBoundsGEP(Builder_val(B), Pointer,
1866e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              (LLVMValueRef *) Op_val(Indices),
1867e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              Wosize_val(Indices), String_val(Name));
1868e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1869e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1870e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1871e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer,
1872c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                                               value Index, value Name,
1873e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1874c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner  return LLVMBuildStructGEP(Builder_val(B), Pointer,
1875c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                              Int_val(Index), String_val(Name));
1876e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1877e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1878e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1879e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) {
1880e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalString(Builder_val(B), String_val(Str),
1881e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1882e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1883e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1884e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1885e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name,
1886e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1887e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str),
1888e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                  String_val(Name));
1889e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1890e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
189146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
189246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
189346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
189446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
189546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
189646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
189746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
189846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
189946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
190046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
190146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
190246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
190346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
190446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
190546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
190646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
190746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
190846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
190946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
191046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
191146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
191246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
191346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
191446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
191546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
191646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
191746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
191846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
191946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
192046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
192146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
192346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
192446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
192546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
192646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
192746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
192946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
193046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
193146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
193246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
193346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
193446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
193546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
193646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
193746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
193846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
193946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
194046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
194146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
194246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
194346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
194446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
194546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
194646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
194746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
194846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
194946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
195046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
195146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
195246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
195346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
195446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
195546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
195646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
195746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
195846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
195946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
196046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
196146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
196246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
196346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
196446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1965e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1966e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1967e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1968e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1969e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1970e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1971e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1972e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1973e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1974e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1975e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1976e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1977e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1978e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X,
1979e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  LLVMTypeRef Ty, value Name,
1980e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1981e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1982e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1983e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1984e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1985e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty,
1986e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1987e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name));
1988e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1989e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1990e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1991e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty,
1992e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1993e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name));
1994e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1995e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1996e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1997e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty,
1998e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                        value Name, value B) {
1999e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name));
2000e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2001e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
200246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
200346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
2004404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
200546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
200646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
200746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
200846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
200946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
201046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
201146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
2012404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
201346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
201446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
201546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
201646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
201746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
201846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
201946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
202046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
202146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
20222618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
20232618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
20242618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  value Hd, Tl;
20252618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMValueRef FirstValue, PhiNode;
20262618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20272618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
20282618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20292618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Hd = Field(Incoming, 0);
20302618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  FirstValue = (LLVMValueRef) Field(Hd, 0);
20312618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
20322618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                         String_val(Name));
20332618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20342618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
20352618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    value Hd = Field(Tl, 0);
20362618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
20372618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                    (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
20382618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
20392618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20402618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return PhiNode;
204146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
204246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
204346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
204446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
204546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
204646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
204746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
204846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
204946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
205046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
205146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
205246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
205346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
205446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
205546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
205646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
205746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
205846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
205946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
206046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
206146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
206246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
206346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
206446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
206546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
206646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
206746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
206846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
206946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
207046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
207146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
207246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
207346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
207446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
207546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
207646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
207746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
207846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
207946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
208046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
208146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
208246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
208346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
208446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
208546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
2086e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
2087e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate,
2088e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                              value Idx, value Name, value B) {
2089e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx),
2090e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
2091e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2092e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2093e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */
2094e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate,
2095e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             LLVMValueRef Val, value Idx,
2096e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
2097e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx),
2098e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              String_val(Name));
2099e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2100e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2101e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
2102e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name,
2103e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value B) {
2104e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name));
2105e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2106e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2107e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
2108e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name,
2109e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value B) {
2110e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name));
2111e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2112e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2113e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
2114e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS,
2115e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
2116e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name));
2117e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
21181ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
2119da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/
2120da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2121da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer
2122da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
2123da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) {
2124da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Path);
2125da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
2126da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
2127da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2128da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path),
2129da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen                                               &MemBuf, &Message))
2130da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
2131da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2132da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLreturn((value) MemBuf);
2133da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2134da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2135da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer
2136da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
2137da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
2138da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
2139da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
2140da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2141da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message))
2142da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
2143da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2144da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return MemBuf;
2145da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2146da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2147f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* ?name:string -> string -> llmemorybuffer */
2148f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_string(value Name, value String) {
2149f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  const char *NameCStr;
2150f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  if(Name == Val_int(0))
2151f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov    NameCStr = "";
2152f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  else
2153f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov    NameCStr = String_val(Field(Name, 0));
2154f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2155f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  LLVMMemoryBufferRef MemBuf;
2156f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  MemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy(
2157f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov                String_val(String), caml_string_length(String), NameCStr);
2158f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2159f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  return MemBuf;
2160f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov}
2161f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2162f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* llmemorybuffer -> string */
2163f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim value llvm_memorybuffer_as_string(LLVMMemoryBufferRef MemBuf) {
2164f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  value String = caml_alloc_string(LLVMGetBufferSize(MemBuf));
2165f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  memcpy(String_val(String), LLVMGetBufferStart(MemBuf),
2166f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov         LLVMGetBufferSize(MemBuf));
2167f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2168f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  return String;
2169f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov}
2170f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2171da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */
2172da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
2173da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMemoryBuffer(MemBuf);
2174da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
2175da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2176da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2177d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/
2178d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2179d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */
2180d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) {
2181d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return LLVMCreatePassManager();
2182d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2183d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2184d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */
2185d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M,
2186d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                           LLVMPassManagerRef PM) {
2187d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunPassManager(PM, M));
2188d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2189d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2190d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2191d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) {
2192d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMInitializeFunctionPassManager(FPM));
2193d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2194d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2195d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */
2196d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F,
2197d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                             LLVMPassManagerRef FPM) {
2198d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunFunctionPassManager(FPM, F));
2199d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2200d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2201d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2202d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) {
2203d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMFinalizeFunctionPassManager(FPM));
2204d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2205d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2206d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */
2207d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) {
2208d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  LLVMDisposePassManager(PM);
2209d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_unit;
2210d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2211