llvm_ocaml.c revision 8a3bdd6a3fa8312809a432579a5685d431ca8410
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,
4573dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantExpr,
4583dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantFP,
4593dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantInt,
4603dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantPointerNull,
4613dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantStruct,
4623dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantVector,
4633dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Function,
4643dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalAlias,
4653dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalVariable,
4663dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  UndefValue,
4673dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Instruction
4683dd16741864302af14b31b7f75375c09d8544a35Torok Edwin};
4693dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4703dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* llvalue -> ValueKind.t */
4713dd16741864302af14b31b7f75375c09d8544a35Torok Edwin#define DEFINE_CASE(Val, Kind) \
4723dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    do {if (LLVMIsA##Kind(Val)) CAMLreturn(Val_int(Kind));} while(0)
4733dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4743dd16741864302af14b31b7f75375c09d8544a35Torok EdwinCAMLprim value llvm_classify_value(LLVMValueRef Val) {
4753dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  CAMLparam0();
4763dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!Val)
4773dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(Val_int(NullValue));
4783dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAConstant(Val)) {
4793dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, BlockAddress);
4803dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantAggregateZero);
4813dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantArray);
4823dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantExpr);
4833dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantFP);
4843dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantInt);
4853dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantPointerNull);
4863dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantStruct);
4873dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantVector);
4883dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4893dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAInstruction(Val)) {
4903dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLlocal1(result);
4913dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    result = caml_alloc_small(1, 0);
4923dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val)));
4933dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(result);
4943dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4953dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAGlobalValue(Val)) {
4963dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, Function);
4973dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalAlias);
4983dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalVariable);
4993dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
5003dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, Argument);
5013dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, BasicBlock);
5023dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, InlineAsm);
5033dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDNode);
5043dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDString);
5053dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, UndefValue);
5063dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  failwith("Unknown Value class");
5073dd16741864302af14b31b7f75375c09d8544a35Torok Edwin}
5083dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
5098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
51046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) {
51146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetValueName(Val));
5128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
51546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
51646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetValueName(Val, String_val(Name));
5178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
5188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
52088cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */
52188cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) {
52288cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  LLVMDumpValue(Val);
52388cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  return Val_unit;
52488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen}
52588cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen
52688d74c3093de563408ceb834d999613038195e98Peter Zotov/* llvalue -> llvalue -> unit */
52788d74c3093de563408ceb834d999613038195e98Peter ZotovCAMLprim value llvm_replace_all_uses_with(LLVMValueRef OldVal,
52888d74c3093de563408ceb834d999613038195e98Peter Zotov                                          LLVMValueRef NewVal) {
52988d74c3093de563408ceb834d999613038195e98Peter Zotov  LLVMReplaceAllUsesWith(OldVal, NewVal);
53088d74c3093de563408ceb834d999613038195e98Peter Zotov  return Val_unit;
53188d74c3093de563408ceb834d999613038195e98Peter Zotov}
53288d74c3093de563408ceb834d999613038195e98Peter Zotov
533b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/
534b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
535b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */
536b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) {
537b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar  return LLVMGetOperand(V, Int_val(I));
538b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar}
539b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
540f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
541f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) {
542f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  LLVMSetOperand(U, Int_val(I), V);
543f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_unit;
544f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
545f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
546f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */
547f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) {
548f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_int(LLVMGetNumOperands(V));
549f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
550f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
5518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
5528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
55446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
55546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
556344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
557344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
558344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
55946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
56046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
5618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
563344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
56446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
56546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
566344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
567344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
5686563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
5696563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) {
5706563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return LLVMIsAConstantExpr(Val) ?
5716563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      Val_int(LLVMGetConstOpcode(Val)) : Val_int(0);
5726563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
5736563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
57446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/
57546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
57646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */
57746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) {
57846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_bool(LLVMHasMetadata(Val));
57946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
58046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
58146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */
58246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) {
58346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam1(MDKindID);
58446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef MD;
58546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) {
58646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
58746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) MD;
58846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
58946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
59046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
59146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
59246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
59346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
59446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID,
59546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                 LLVMValueRef MD) {
59646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), MD);
59746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
59846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
59946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
60046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */
60146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) {
60246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), NULL);
60346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
60446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
60546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
60646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
60746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/
60846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
60946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */
61046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) {
61146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDStringInContext(C, String_val(S), caml_string_length(S));
61246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
61346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
61446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */
61546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) {
61646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals),
61746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                             Wosize_val(ElementVals));
61846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
61946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
6204f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */
6214f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) {
62231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
62331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *S;
62431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  unsigned Len;
62531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
62631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if ((S = LLVMGetMDString(V, &Len))) {
62731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal2(Option, Str);
62831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
62931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Str = caml_alloc_string(Len);
63031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    memcpy(String_val(Str), S, Len);
63131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Option = alloc(1,0);
63231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(Option, 0, Str);
63331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
63431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
63531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
6364f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
6374f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin
638e5de63c7de04c81d7d8484e5b64f47941143c739Peter ZotovCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value Name)
6394f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{
640e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  CAMLparam1(Name);
6414f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLlocal1(Nodes);
642e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(Name)), 0);
643e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  LLVMGetNamedMetadataOperands(M, String_val(Name), (LLVMValueRef *) Nodes);
6444f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLreturn(Nodes);
6454f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
6468a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
6478a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llmodule -> string -> llvalue -> unit */
6488a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_append_namedmd(LLVMModuleRef M, value Name, LLVMValueRef Val) {
6498a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMAddNamedMetadataOperand(M, String_val(Name), Val);
6508a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
6518a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
6528a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
6538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
6548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
655e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */
656e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) {
657e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, (long long) Int_val(N), 1);
6588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
660344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
661e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
662e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                                          value SExt) {
663e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
664344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
665344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
6666563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */
6676563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const)
6686563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{
6696563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLparam0();
6706563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  if (LLVMIsAConstantInt(Const) &&
6716563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) {
6726563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    value Option = alloc(1, 0);
6736563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const));
6746563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    CAMLreturn(Option);
6756563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  }
6766563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLreturn(Val_int(0));
6776563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
6786563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
67945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */
68045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
68145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                               value Radix) {
68245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S),
68345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                     Int_val(Radix));
68445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
68545d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
687e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) {
688e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstReal(RealTy, Double_val(N));
6898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
69145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */
69245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) {
69345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstRealOfStringAndSize(RealTy, String_val(S),
69445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                      caml_string_length(S));
69545d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
69645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
6988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
699b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
700b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str,
701b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                        value NullTerminate) {
702b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
703b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  1);
704e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
705e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
706b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
707b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str,
708b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                         value NullTerminate) {
709b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
710b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  0);
7118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
714e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy,
71546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
716e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
717e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                        Wosize_val(ElementVals));
718e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
719e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
7205371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
7215371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) {
7225371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
7235371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 0);
7248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7266b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> llvalue array -> llvalue */
7276b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMValueRef llvm_const_named_struct(LLVMTypeRef Ty, value ElementVals) {
7286b228e506f42972c003599f4873a24910f8a530aTorok Edwin    return LLVMConstNamedStruct(Ty, (LLVMValueRef *) Op_val(ElementVals),  Wosize_val(ElementVals));
7296b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
7306b228e506f42972c003599f4873a24910f8a530aTorok Edwin
7315371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
7325371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C,
7335371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                               value ElementVals) {
7345371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
7355371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 1);
7368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
739e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
740e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals),
741e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals));
7424647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7434647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
7444647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/
7454647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
746404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */
7474647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred,
7484647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
7494647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
7504647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant);
7514647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7524647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
753404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */
7544647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred,
7554647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
7564647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
7574647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant);
7584647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7594647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
7604647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */
7614647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) {
7624647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7634647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                      Wosize_val(Indices));
7648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7661b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */
7671b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal,
7681b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                               value Indices) {
7691b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7701b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                              Wosize_val(Indices));
7711b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7721b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7731b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */
7741b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate,
7751b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                              value Indices) {
7761b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7771b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
7781b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
7791b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
7801b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7811b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
7821b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
7831b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
7841b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
7851b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7861b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstExtractValue(Aggregate, idxs, size);
7871b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
7881b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
7891b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7901b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7911b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */
7921b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate,
7931b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                             LLVMValueRef Val, value Indices) {
7941b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7951b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
7961b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
7971b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
7981b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7991b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
8001b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
8011b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
8021b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
8031b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8041b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstInsertValue(Aggregate, Val, idxs, size);
8051b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
8061b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
8071b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
8081b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
809ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */
810ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm,
811ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value Constraints, value HasSideEffects,
812ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value IsAlignStack) {
813ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar  return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints),
814ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                            Bool_val(HasSideEffects), Bool_val(IsAlignStack));
815ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar}
816ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar
8178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
8188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
82046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
82146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
8228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
824404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */
82546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
82646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
8278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
829404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */
83046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
83146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
8328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
83646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
83746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
8388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
84146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
84246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
8438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
846404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */
84746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
84846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
8498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
851404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */
85246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
85346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
8548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
85846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
85946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
8608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
86346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
86446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
8658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
868705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/
869705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
870705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */
871705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) {
872705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
873705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef First;
874705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((First = LLVMGetFirstUse(Val))) {
875705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
876705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) First;
877705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
878705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
879705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
880705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
881705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
882705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */
883705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) {
884705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
885705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef Next;
886705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((Next = LLVMGetNextUse(U))) {
887705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
888705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) Next;
889705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
890705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
891705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
892705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
893705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
894705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
895705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) {
896705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUser(UR);
897705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
898705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
899705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
900705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) {
901705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUsedValue(UR);
902705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
903705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
9048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
9058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9064733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef,
9074733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
9084733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
9098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
91046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
91146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
9126d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
9136d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
9146d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
91557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0));
9166d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return GlobalVar;
9176d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
91846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
9198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9218e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */
9228e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name,
9238e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    value AddressSpace,
9248e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    LLVMModuleRef M) {
9258e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar;
9268e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
9278e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
9288e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar      return LLVMConstBitCast(GlobalVar,
9298e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                              LLVMPointerType(Ty, Int_val(AddressSpace)));
9308e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    return GlobalVar;
9318e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  }
9328e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return LLVMAddGlobal(M, Ty, String_val(Name));
9338e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
9348e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
9356d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
9366d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
9376d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
9386d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
9396d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
94075e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
9416d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) GlobalVar;
9426d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
9436d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
9446d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
9456d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
9466d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
9478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
94846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
94946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
95046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
9518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
9528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
95346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
9548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9568e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */
9578e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name,
9588e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMValueRef Initializer,
9598e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   value AddressSpace,
9608e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMModuleRef M) {
9618e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M,
9628e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       LLVMTypeOf(Initializer),
9638e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       String_val(Name),
9648e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       Int_val(AddressSpace));
9658e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMSetInitializer(GlobalVar, Initializer);
9668e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return GlobalVar;
9678e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
9688e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
9698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
97046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
97146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
9728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
97646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
97746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
97846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
9798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
98346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
98446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
9858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
98946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
99046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
9918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
99446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
99546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
99646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
99746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
99846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
99946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10008a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> ThreadLocalMode.t */
10018a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_thread_local_mode(LLVMValueRef GlobalVar) {
10028a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_int(LLVMGetThreadLocalMode(GlobalVar));
10038a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10048a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
10058a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* ThreadLocalMode.t -> llvalue -> unit */
10068a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_thread_local_mode(value ThreadLocalMode,
10078a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                          LLVMValueRef GlobalVar) {
10088a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetThreadLocalMode(GlobalVar, Int_val(ThreadLocalMode));
10098a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
10108a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10118a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
10128a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> bool */
10138a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_is_externally_initialized(LLVMValueRef GlobalVar) {
10148a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_bool(LLVMIsExternallyInitialized(GlobalVar));
10158a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10168a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
10178a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* bool -> llvalue -> unit */
10188a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_externally_initialized(value IsExternallyInitialized,
10198a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                               LLVMValueRef GlobalVar) {
10208a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetExternallyInitialized(GlobalVar, Bool_val(IsExternallyInitialized));
10218a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
10228a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10238a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1024c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */
1025c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) {
1026c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_bool(LLVMIsGlobalConstant(GlobalVar));
1027c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
1028c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
1029c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */
1030c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) {
1031c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag));
1032c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_unit;
1033c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
1034c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
10356ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/
10366ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
10376ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty,
10386ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar                                     LLVMValueRef Aliasee, value Name) {
10396ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar  return LLVMAddAlias(M, Ty, Aliasee, String_val(Name));
10406ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar}
10416ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
104246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
104346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10444733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef,
10454733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
10464733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
104746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
104846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
104946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
10506d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
10516d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
10526d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty)
105357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0));
10546d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return Fn;
10556d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
105646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
105746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
105846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10596d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
10606d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
10616d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
10626d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
10636d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
106475e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
10656d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) Fn;
10666d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
10676d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
10686d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
10696d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
10706d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
107146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
107246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
107346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
107446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
1075b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry");
107646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
107746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
107846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
107946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
108046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
108146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
108246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
108346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
108446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
108546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
108646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
108746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
108846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
108946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
109046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
109146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
109246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
109346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
109446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
109546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
109646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
109746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
109846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
109946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
110046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
110180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */
11025eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) {
11035eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  const char *GC;
110480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLparam0();
110580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLlocal2(Name, Option);
110680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
11075eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  if ((GC = LLVMGetGC(Fn))) {
11085eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    Name = copy_string(GC);
110980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
111080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Option = alloc(1, 0);
111180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Field(Option, 0) = Name;
111280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Option);
111380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  } else {
111480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Val_int(0));
111580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  }
111680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
111780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
111880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */
11195eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) {
11205eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
112180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  return Val_unit;
112280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
112380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
11240be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1125e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) {
11260be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddFunctionAttr(Arg, Int32_val(PA));
1127e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1128e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1129e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
11308a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> string -> string -> unit */
11318a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_add_target_dependent_function_attr(
11328a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                  LLVMValueRef Arg, value A, value V) {
11338a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMAddTargetDependentFunctionAttr(Arg, String_val(A), String_val(V));
11348a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
11358a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
11368a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
11370be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 */
11380be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_function_attr(LLVMValueRef Fn)
11390be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
11400be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
11410be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetFunctionAttr(Fn)));
11420be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
11430be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
11440be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1145e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) {
11460be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveFunctionAttr(Arg, Int32_val(PA));
1147e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1148e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
11494733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/
11504733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
11514733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent)
11524733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
11534733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */
11544733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
11554733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
11564733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
11574733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
11580be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int */
11590be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_param_attr(LLVMValueRef Param)
11600be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
11610be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
11620be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetAttribute(Param)));
11630be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
11640be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
1165e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */
1166e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) {
11674733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
11684733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
11694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Params;
11704733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
11714733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
11720be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1173e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) {
11740be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddAttribute(Arg, Int32_val(PA));
1175e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1176e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1177e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
11780be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1179e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) {
11800be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveAttribute(Arg, Int32_val(PA));
1181e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1182e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1183e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1184e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */
1185e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
1186e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  LLVMSetParamAlignment(Arg, Int_val(align));
1187e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1188e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1189e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
119046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
119146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
11924733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(
11934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent)
11944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1195ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llbasicblock -> llvalue option */
1196ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_block_terminator(LLVMBasicBlockRef Block)
1197ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1198ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLparam0();
1199ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMValueRef Term = LLVMGetBasicBlockTerminator(Block);
1200ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  if (Term) {
1201ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    value Option = alloc(1, 0);
1202ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    Field(Option, 0) = (value) Term;
1203ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    CAMLreturn(Option);
1204ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  }
1205ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLreturn(Val_int(0));
1206ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1207ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
120846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
120946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
121046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
121146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
121246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
121346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
121446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
121546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
121646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
121746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
121846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
121946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
122046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
12218a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> unit */
12228a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_remove_block(LLVMBasicBlockRef BB) {
12238a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMRemoveBasicBlockFromParent(BB);
12248a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
12258a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
12268a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
12278a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> llbasicblock -> unit */
12288a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_move_block_before(LLVMBasicBlockRef Pos, LLVMBasicBlockRef BB) {
12298a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMMoveBasicBlockBefore(BB, Pos);
12308a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
12318a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
12328a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
12338a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> llbasicblock -> unit */
12348a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_move_block_after(LLVMBasicBlockRef Pos, LLVMBasicBlockRef BB) {
12358a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMMoveBasicBlockAfter(BB, Pos);
12368a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
12378a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
12388a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
123946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
1240b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name,
1241b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMValueRef Fn) {
1242b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name));
124346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
124446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
124546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
1246b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name,
1247b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMBasicBlockRef BB) {
1248b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name));
124946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
125046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
125146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
125246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
125346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
125446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
125546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1256033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/
1257033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
1258033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
1259033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen                 LLVMGetInstructionParent)
1260033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
12616563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
12626563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
12633dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  LLVMOpcode o;
12643dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!LLVMIsAInstruction(Inst))
12653dd16741864302af14b31b7f75375c09d8544a35Torok Edwin      failwith("Not an instruction");
12663dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  o = LLVMGetInstructionOpcode(Inst);
1267efde86753d6f324ac9d0b42e48fd3ebf40c17905Benjamin Kramer  assert (o <= LLVMLandingPad);
12686563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return Val_int(o);
12696563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
1270033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
12714917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin/* llvalue -> ICmp.t */
12724917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
127331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
127431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  int x = LLVMGetICmpPredicate(Val);
127531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (x) {
127631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    value Option = alloc(1, 0);
127731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Field(Option, 0) = Val_int(x - LLVMIntEQ);
127831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
127931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
128031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
12814917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin}
12824917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
12834917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
1284cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/
1285cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1286cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */
1287cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
1288cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_int(LLVMGetInstructionCallConv(Inst));
1289cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1290cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1291cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */
1292cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
1293cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  LLVMSetInstructionCallConv(Inst, Int_val(CC));
1294cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_unit;
1295cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1296cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
12970be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1298e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr,
1299e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value index,
1300e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value PA) {
13010be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1302e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1303e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1304e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
13050be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1306e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr,
1307e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value index,
1308e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value PA) {
13090be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1310e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1311e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1312e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
131307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/
131407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
131507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */
131607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
131707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_bool(LLVMIsTailCall(CallInst));
131807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
131907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
132007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */
132107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall,
132207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen                                  LLVMValueRef CallInst) {
132307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  LLVMSetTailCall(CallInst, Bool_val(IsTailCall));
132407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_unit;
132507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
132607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
13278a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/*--... Operations on load/store instructions (only)........................--*/
13288a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
13298a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> bool */
13308a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_is_volatile(LLVMValueRef MemoryInst) {
13318a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_bool(LLVMGetVolatile(MemoryInst));
13328a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
13338a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
13348a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* bool -> llvalue -> unit */
13358a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_volatile(value IsVolatile,
13368a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                  LLVMValueRef MemoryInst) {
13378a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetVolatile(MemoryInst, Bool_val(IsVolatile));
13388a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
13398a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
13408a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
13412618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/
13422618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13432618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */
13442618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
13452618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMAddIncoming(PhiNode,
13462618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMValueRef*) &Field(Incoming, 0),
13472618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMBasicBlockRef*) &Field(Incoming, 1),
13482618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  1);
13492618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return Val_unit;
13502618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
13512618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13522618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */
13532618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
13542618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  unsigned I;
13552618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLparam0();
13562618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLlocal3(Hd, Tl, Tmp);
13572618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13582618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  /* Build a tuple list of them. */
13592618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Tl = Val_int(0);
13602618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
13612618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Hd = alloc(2, 0);
13622618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
13632618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
13642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tmp = alloc(2, 0);
13662618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 0, Hd);
13672618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 1, Tl);
13682618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tl = Tmp;
13692618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
13702618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13712618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLreturn(Tl);
13722618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
13732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
1374ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> unit */
1375ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_delete_instruction(LLVMValueRef Instruction) {
1376ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMInstructionEraseFromParent(Instruction);
1377ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return Val_unit;
1378ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
137946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
138046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
138146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
138246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
138346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1384a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) {
138546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
138646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
138746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
138846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
138989f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  (char *) "IRBuilder",
139046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
139146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
139246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
139346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
139446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
13954d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#ifdef custom_compare_ext_default
13964d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes  , custom_compare_ext_default
13974d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#endif
139846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
139946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1400a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) {
1401a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
1402a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  Builder_val(V) = B;
1403a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  return V;
1404a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1405a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
14065371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */
14075371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) {
14085371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return alloc_builder(LLVMCreateBuilderInContext(C));
1409a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1410a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
1411033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */
1412033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) {
1413033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  if (Tag_val(Pos) == 0) {
1414033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0));
1415033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderAtEnd(Builder_val(B), BB);
1416033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  } else {
1417033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0));
1418033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderBefore(Builder_val(B), I);
1419033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  }
14208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
14218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
142246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1423dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */
1424628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) {
1425dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B));
1426dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  if (!InsertBlock)
1427dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen    raise_not_found();
1428dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  return InsertBlock;
1429dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen}
1430dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen
14315c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */
1432628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) {
1433628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar  LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name));
14345c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar  return Val_unit;
14355c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar}
14365c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar
143746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/
143846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
143946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
144046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) {
144146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), V);
144246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
144346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
144446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
144546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */
144646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) {
144746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), NULL);
144846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
144946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
145046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
145146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */
145246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) {
145346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam0();
145446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef L;
145546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) {
145646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
145746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) L;
145846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
145946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
146046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
146146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
146246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
146346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
146446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) {
146546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetInstDebugLocation(Builder_val(B), V);
146646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
146746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
146846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
146946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
147046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
147146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
147246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
147346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
147446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
147546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
147646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
147746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
147846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
147946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
148046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
148146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
14826793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */
14836793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) {
14846793dd9769047706acf34420586716450344fb66Erick Tryzelaar  return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals),
14856793dd9769047706acf34420586716450344fb66Erick Tryzelaar                               Wosize_val(RetVals));
14866793dd9769047706acf34420586716450344fb66Erick Tryzelaar}
14876793dd9769047706acf34420586716450344fb66Erick Tryzelaar
148846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
148946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
149046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
149146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
149246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
149446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
149546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
149646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
149746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
149846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
149946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
150546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
150646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
150746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
150846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1509ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> string -> llbuilder -> llvalue */
1510ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_malloc(LLVMTypeRef Ty, value Name,
1511ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                        value B)
1512ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1513ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildMalloc(Builder_val(B), Ty, String_val(Name));
1514ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1515ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1516ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> string -> llbuilder -> llvalue */
1517ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_array_malloc(LLVMTypeRef Ty,
1518ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              LLVMValueRef Val,
1519ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              value Name, value B)
1520ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1521ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildArrayMalloc(Builder_val(B), Ty, Val, String_val(Name));
1522ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1523ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1524ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1525ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_free(LLVMValueRef P, value B)
1526ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1527ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildFree(Builder_val(B), P);
1528ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1529ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
15301430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
15311430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal,
153221491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen                             LLVMBasicBlockRef Dest) {
153321491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  LLVMAddCase(Switch, OnVal, Dest);
153421491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  return Val_unit;
153521491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen}
153621491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen
1537c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */
1538c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr,
1539c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value EstimatedDests,
1540c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value B) {
1541c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests);
1542c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1543c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
1544c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
1545c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr,
1546c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                    LLVMBasicBlockRef Dest) {
1547c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  LLVMAddDestination(IndirectBr, Dest);
1548c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return Val_unit;
1549c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1550c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
155146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
155246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
155346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
155446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
155546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
155646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
155746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
155846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
155946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
156046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
156146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
156246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
156346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
156446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
156546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
156646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
156746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
156846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
156946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1570ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> int -> string -> llbuilder -> llvalue */
157148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn,
157248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value NumClauses,  value Name,
157348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value B) {
157448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses),
157548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                               String_val(Name));
157648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
157748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1578ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llvalue -> unit */
1579ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_add_clause(LLVMValueRef LandingPadInst, LLVMValueRef ClauseVal)
1580ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1581ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    LLVMAddClause(LandingPadInst, ClauseVal);
1582ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return Val_unit;
1583ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1584ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1585ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1586ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> bool -> unit */
158748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)
158848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{
158948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    LLVMSetCleanup(LandingPadInst, Bool_val(flag));
159048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return Val_unit;
159148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
159248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1593ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1594ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_resume(LLVMValueRef Exn, value B)
1595ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1596ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return LLVMBuildResume(Builder_val(B), Exn);
1597ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1598ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
159946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
160046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
160146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
160246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
160346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
160546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
160746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
160846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
160946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
161046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
161146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
161246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1613e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS,
1614e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1615e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name));
1616e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1617e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1618e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
161919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS,
162019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
162119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name));
162219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
162319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
162419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1625e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS,
1626e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1627e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name));
1628e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1629e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1630e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
163146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
163246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
163346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
163446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
163546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
163646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
163719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
163819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
163919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name));
164019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
164119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
164219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
164319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
164419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
164519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name));
164619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
164719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
164819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1649e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS,
1650e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1651e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name));
1652e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1653e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1654e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
165546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
165646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
165746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
165846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
165946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
166046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
166119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
166219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
166319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name));
166419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
166519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
166619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
166719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
166819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
166919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name));
167019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
167119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
167219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1673e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS,
1674e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1675e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name));
1676e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1677e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1678e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
167946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
168046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
168146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
168246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
168446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
168546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
168646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
168746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
168846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1691e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
1692e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                            value Name, value B) {
1693e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name));
1694e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1695e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1696e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
169746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
169846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
169946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
170046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
170146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
170246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
170346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
170446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
170546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
170646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
170746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
170846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
170946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
171046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
171146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
171246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
171346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
171446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
171546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
171646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
171746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
171846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
171946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
172046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
172146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
172246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
172346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
172446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
172546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
172646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
172746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
172846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
172946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
173046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
173146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
173246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
173346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
173446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
173546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
173646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
173746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
173846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
173946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
174046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
174146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
174246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
174446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
174546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
174646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
174746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
174846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
175146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
175246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
175346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
175446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
175546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
175746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
175846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
175946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
176046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
176146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
176246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
176319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X,
176419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
176519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name));
176619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
176719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
176819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
176919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X,
177019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
177119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name));
177219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
177319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
177419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
177519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X,
177619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                     value Name, value B) {
177719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildFNeg(Builder_val(B), X, String_val(Name));
177819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
177919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
178019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
178146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
178246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
178346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
178446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
178546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
178746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
178946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
179046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
179146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
179246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
179446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
179546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
179646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
179746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
179846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
180046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
180146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
180246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
180346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
180446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
180646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
180746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
180846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
180946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
181046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
181146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
18128a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* AtomicRMWBinOp.t -> llvalue -> llvalue -> AtomicOrdering.t ->
18138a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov   bool -> llbuilder -> llvalue */
18148a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMValueRef llvm_build_atomicrmw_native(value BinOp, LLVMValueRef Ptr,
18158a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                                  LLVMValueRef Val, value Ord,
18168a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                                  value ST, value Name, value B) {
18178a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMValueRef Instr;
18188a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  Instr = LLVMBuildAtomicRMW(Builder_val(B), Int_val(BinOp),
18198a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                             Ptr, Val, Int_val(Ord), Bool_val(ST));
18208a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetValueName(Instr, String_val(Name));
18218a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Instr;
18228a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
18238a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
18248a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMValueRef llvm_build_atomicrmw_bytecode(value *argv, int argn) {
18258a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return llvm_build_atomicrmw_native(argv[0], (LLVMValueRef) argv[1],
18268a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                     (LLVMValueRef) argv[2], argv[3],
18278a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                     argv[4], argv[5], argv[6]);
18288a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
18298a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
183046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
183146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
183246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
183346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
183446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
183546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
183646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
183746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1838e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
1839e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer,
1840e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value Indices, value Name,
1841e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1842e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInBoundsGEP(Builder_val(B), Pointer,
1843e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              (LLVMValueRef *) Op_val(Indices),
1844e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              Wosize_val(Indices), String_val(Name));
1845e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1846e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1847e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1848e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer,
1849c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                                               value Index, value Name,
1850e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1851c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner  return LLVMBuildStructGEP(Builder_val(B), Pointer,
1852c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                              Int_val(Index), String_val(Name));
1853e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1854e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1855e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1856e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) {
1857e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalString(Builder_val(B), String_val(Str),
1858e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1859e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1860e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1861e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1862e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name,
1863e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1864e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str),
1865e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                  String_val(Name));
1866e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1867e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
186846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
186946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
187046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
187146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
187246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
187346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
187446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
187546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
187646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
187746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
187846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
187946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
188046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
188146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
188246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
188346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
188446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
188546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
188646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
188746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
188846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
188946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
189046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
189146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
189246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
189346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
189446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
189546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
189646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
189746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
189846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
189946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
190046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
190146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
190246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
190346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
190446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
190546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
190646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
190746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
190846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
190946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
191046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
191146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
191246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
191346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
191446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
191546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
191646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
191746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
191846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
191946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
192046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
192146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
192246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
192446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
192546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
192646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
192746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
192846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
193046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
193146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
193246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
193346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
193446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
193546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
193646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
193746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
193846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
193946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
194046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
194146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1942e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1943e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1944e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1945e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1946e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1947e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1948e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1949e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1950e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1951e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1952e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1953e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1954e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1955e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X,
1956e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  LLVMTypeRef Ty, value Name,
1957e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1958e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1959e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1960e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1961e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1962e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty,
1963e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1964e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name));
1965e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1966e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1967e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1968e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty,
1969e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1970e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name));
1971e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1972e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1973e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1974e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty,
1975e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                        value Name, value B) {
1976e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name));
1977e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1978e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
197946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
198046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1981404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
198246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
198346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
198446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
198546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
198646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
198746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
198846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1989404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
199046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
199146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
199246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
199346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
199446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
199546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
199646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
199746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
199846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
19992618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
20002618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
20012618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  value Hd, Tl;
20022618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMValueRef FirstValue, PhiNode;
20032618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20042618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
20052618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20062618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Hd = Field(Incoming, 0);
20072618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  FirstValue = (LLVMValueRef) Field(Hd, 0);
20082618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
20092618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                         String_val(Name));
20102618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20112618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
20122618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    value Hd = Field(Tl, 0);
20132618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
20142618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                    (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
20152618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
20162618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20172618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return PhiNode;
201846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
201946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
202046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
202146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
202246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
202346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
202446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
202546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
202646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
202746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
202846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
202946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
203046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
203146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
203246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
203346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
203446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
203546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
203646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
203746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
203846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
203946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
204046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
204146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
204246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
204346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
204446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
204546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
204646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
204746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
204846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
204946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
205046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
205146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
205246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
205346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
205446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
205546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
205646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
205746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
205846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
205946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
206046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
206146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
206246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
2063e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
2064e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate,
2065e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                              value Idx, value Name, value B) {
2066e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx),
2067e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
2068e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2069e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2070e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */
2071e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate,
2072e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             LLVMValueRef Val, value Idx,
2073e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
2074e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx),
2075e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              String_val(Name));
2076e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2077e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2078e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
2079e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name,
2080e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value B) {
2081e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name));
2082e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2083e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2084e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
2085e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name,
2086e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value B) {
2087e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name));
2088e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2089e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2090e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
2091e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS,
2092e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
2093e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name));
2094e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
20951ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
2096da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/
2097da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2098da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer
2099da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
2100da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) {
2101da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Path);
2102da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
2103da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
2104da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2105da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path),
2106da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen                                               &MemBuf, &Message))
2107da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
2108da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2109da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLreturn((value) MemBuf);
2110da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2111da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2112da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer
2113da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
2114da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
2115da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
2116da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
2117da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2118da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message))
2119da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
2120da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2121da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return MemBuf;
2122da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2123da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2124f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* ?name:string -> string -> llmemorybuffer */
2125f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_string(value Name, value String) {
2126f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  const char *NameCStr;
2127f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  if(Name == Val_int(0))
2128f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov    NameCStr = "";
2129f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  else
2130f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov    NameCStr = String_val(Field(Name, 0));
2131f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2132f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  LLVMMemoryBufferRef MemBuf;
2133f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  MemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy(
2134f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov                String_val(String), caml_string_length(String), NameCStr);
2135f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2136f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  return MemBuf;
2137f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov}
2138f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2139f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* llmemorybuffer -> string */
2140f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim value llvm_memorybuffer_as_string(LLVMMemoryBufferRef MemBuf) {
2141f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  value String = caml_alloc_string(LLVMGetBufferSize(MemBuf));
2142f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  memcpy(String_val(String), LLVMGetBufferStart(MemBuf),
2143f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov         LLVMGetBufferSize(MemBuf));
2144f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2145f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  return String;
2146f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov}
2147f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2148da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */
2149da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
2150da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMemoryBuffer(MemBuf);
2151da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
2152da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2153da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2154d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/
2155d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2156d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */
2157d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) {
2158d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return LLVMCreatePassManager();
2159d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2160d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2161d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */
2162d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M,
2163d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                           LLVMPassManagerRef PM) {
2164d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunPassManager(PM, M));
2165d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2166d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2167d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2168d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) {
2169d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMInitializeFunctionPassManager(FPM));
2170d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2171d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2172d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */
2173d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F,
2174d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                             LLVMPassManagerRef FPM) {
2175d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunFunctionPassManager(FPM, F));
2176d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2177d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2178d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2179d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) {
2180d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMFinalizeFunctionPassManager(FPM));
2181d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2182d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2183d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */
2184d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) {
2185d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  LLVMDisposePassManager(PM);
2186d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_unit;
2187d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2188