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);
36a69773cead6dea09ade34342eafacf848ec41367Peter Zotov
37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
38da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
39da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void llvm_raise(value Prototype, char *Message) {
41da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Prototype);
42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLlocal1(CamlMessage);
43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CamlMessage = copy_string(Message);
45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMessage(Message);
46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
47da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  raise_with_arg(Prototype, CamlMessage);
482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  abort(); /* NOTREACHED */
49a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#ifdef CAMLnoreturn
50a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen  CAMLnoreturn; /* Silences warnings, but is missing in some versions. */
51a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#endif
52da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
54a69773cead6dea09ade34342eafacf848ec41367Peter Zotovstatic value llvm_fatal_error_handler;
55a69773cead6dea09ade34342eafacf848ec41367Peter Zotov
56a69773cead6dea09ade34342eafacf848ec41367Peter Zotovstatic void llvm_fatal_error_trampoline(const char *Reason) {
57a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  callback(llvm_fatal_error_handler, copy_string(Reason));
58a69773cead6dea09ade34342eafacf848ec41367Peter Zotov}
59a69773cead6dea09ade34342eafacf848ec41367Peter Zotov
60a69773cead6dea09ade34342eafacf848ec41367Peter ZotovCAMLprim value llvm_install_fatal_error_handler(value Handler) {
61a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  LLVMInstallFatalErrorHandler(llvm_fatal_error_trampoline);
62a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  llvm_fatal_error_handler = Handler;
63a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  caml_register_global_root(&llvm_fatal_error_handler);
64a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  return Val_unit;
65a69773cead6dea09ade34342eafacf848ec41367Peter Zotov}
66a69773cead6dea09ade34342eafacf848ec41367Peter Zotov
67a69773cead6dea09ade34342eafacf848ec41367Peter ZotovCAMLprim value llvm_reset_fatal_error_handler(value Unit) {
68a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  caml_remove_global_root(&llvm_fatal_error_handler);
69a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  LLVMResetFatalErrorHandler();
70a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  return Val_unit;
71a69773cead6dea09ade34342eafacf848ec41367Peter Zotov}
72a69773cead6dea09ade34342eafacf848ec41367Peter Zotov
73a69773cead6dea09ade34342eafacf848ec41367Peter ZotovCAMLprim value llvm_enable_pretty_stacktrace(value Unit) {
74a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  LLVMEnablePrettyStackTrace();
75a69773cead6dea09ade34342eafacf848ec41367Peter Zotov  return Val_unit;
76a69773cead6dea09ade34342eafacf848ec41367Peter Zotov}
77a69773cead6dea09ade34342eafacf848ec41367Peter Zotov
784733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksenstatic value alloc_variant(int tag, void *Value) {
794733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Iter = alloc_small(1, tag);
804733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  Field(Iter, 0) = Val_op(Value);
814733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Iter;
824733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
834733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
844733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* Macro to convert the C first/next/last/prev idiom to the Ocaml llpos/
854733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen   llrev_pos idiom. */
864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen#define DEFINE_ITERATORS(camlname, cname, pty, cty, pfun) \
874733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llpos */                        \
884733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_begin(pty Mom) {       \
894733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty First = LLVMGetFirst##cname(Mom);                 \
904733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (First)                                            \
914733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, First);                     \
924733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
954733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llpos */                         \
964733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_succ(cty Kid) {        \
974733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Next = LLVMGetNext##cname(Kid);                   \
984733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Next)                                             \
994733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Next);                      \
100f440691a20eff24cf59ac14e10057234ae182dbeGordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
1014733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
1024733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
1034733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llrev_pos */                    \
1044733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_end(pty Mom) {         \
1054733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Last = LLVMGetLast##cname(Mom);                   \
1064733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Last)                                             \
1074733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Last);                      \
1084733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
1094733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
1104733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
1114733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llrev_pos */                     \
1124733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_pred(cty Kid) {        \
1134733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Prev = LLVMGetPrevious##cname(Kid);               \
1144733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Prev)                                             \
1154733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Prev);                      \
1164733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
1174733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }
1184733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1205371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/*===-- Contexts ----------------------------------------------------------===*/
1215371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1225371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
1235371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_create_context(value Unit) {
1245371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMContextCreate();
1255371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1265371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1275371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> unit */
1285371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_dispose_context(LLVMContextRef C) {
1295371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  LLVMContextDispose(C);
1305371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return Val_unit;
1315371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1325371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1335371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
1345371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_global_context(value Unit) {
1355371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetGlobalContext();
1365371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1375371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
13846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> int */
13946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_mdkind_id(LLVMContextRef C, value Name) {
14046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  unsigned MDKindID = LLVMGetMDKindIDInContext(C, String_val(Name),
14146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                               caml_string_length(Name));
14246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_int(MDKindID);
14346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
14446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
1458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/
1468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
147263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar/* llcontext -> string -> llmodule */
148263d989a719c1864862fc91f59193a6c2b55ca48Erick TryzelaarCAMLprim LLVMModuleRef llvm_create_module(LLVMContextRef C, value ModuleID) {
149263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar  return LLVMModuleCreateWithNameInContext(String_val(ModuleID), C);
1508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */
15346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) {
15446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeModule(M);
1558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
1568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
158a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
159a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_target_triple(LLVMModuleRef M) {
160a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetTarget(M));
161a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
162a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
163a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
164a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_target_triple(value Trip, LLVMModuleRef M) {
165a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetTarget(M, String_val(Trip));
166a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
167a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
168a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
169a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
170a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_data_layout(LLVMModuleRef M) {
171a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetDataLayout(M));
172a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
173a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
174a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
175a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_data_layout(value Layout, LLVMModuleRef M) {
176a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetDataLayout(M, String_val(Layout));
177a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
178a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
179a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
180af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen/* llmodule -> unit */
181af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon HenriksenCAMLprim value llvm_dump_module(LLVMModuleRef M) {
182af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  LLVMDumpModule(M);
183af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  return Val_unit;
184af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen}
185af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen
1868a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* string -> llmodule -> unit */
1878a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_print_module(value Filename, LLVMModuleRef M) {
1888a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  char* Message;
1898a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  if(LLVMPrintModuleToFile(M, String_val(Filename), &Message)) {
1908a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov    llvm_raise(llvm_ioerror_exn, Message);
1918a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  }
1928a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1938a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
1948a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
1958a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1968a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llmodule -> string */
1978a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_string_of_llmodule(LLVMModuleRef M) {
1988a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  char* ModuleCStr;
1998a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  ModuleCStr = LLVMPrintModuleToString(M);
2008a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2018a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  value ModuleStr = caml_copy_string(ModuleCStr);
2028a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMDisposeMessage(ModuleCStr);
2038a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2048a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return ModuleStr;
2058a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
2068a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2070941534c712d77243d9dda5e8c1d927563b4edffChris Lattner/* llmodule -> string -> unit */
2080941534c712d77243d9dda5e8c1d927563b4edffChris LattnerCAMLprim value llvm_set_module_inline_asm(LLVMModuleRef M, value Asm) {
2090941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMSetModuleInlineAsm(M, String_val(Asm));
2100941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  return Val_unit;
2110941534c712d77243d9dda5e8c1d927563b4edffChris Lattner}
2128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/
2148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
215404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* lltype -> TypeKind.t */
21646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) {
21746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetTypeKind(Ty));
2188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
220ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok EdwinCAMLprim value llvm_type_is_sized(LLVMTypeRef Ty) {
221ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin    return Val_bool(LLVMTypeIsSized(Ty));
222ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin}
223ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin
2245371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* lltype -> llcontext */
2255371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_type_context(LLVMTypeRef Ty) {
2265371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetTypeContext(Ty);
2275371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
2285371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
2298a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* lltype -> unit */
2308a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_dump_type(LLVMTypeRef Val) {
2318a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMDumpType(Val);
2328a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
2338a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
2348a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2358a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* lltype -> string */
2368a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_string_of_lltype(LLVMTypeRef M) {
2378a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  char* TypeCStr;
2388a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  TypeCStr = LLVMPrintTypeToString(M);
2398a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2408a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  value TypeStr = caml_copy_string(TypeCStr);
2418a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMDisposeMessage(TypeCStr);
2428a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2438a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return TypeStr;
2448a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
2458a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
2468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/
2478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
248b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
249b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i1_type (LLVMContextRef Context) {
250b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt1TypeInContext(Context);
251b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
252b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
253b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
254b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i8_type (LLVMContextRef Context) {
255b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt8TypeInContext(Context);
256b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
257b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
258b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
259b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i16_type (LLVMContextRef Context) {
260b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt16TypeInContext(Context);
261b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
262b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
263b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
264b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i32_type (LLVMContextRef Context) {
265b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt32TypeInContext(Context);
266b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
267b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
268b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
269b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i64_type (LLVMContextRef Context) {
270b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt64TypeInContext(Context);
271b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
2728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
273b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> int -> lltype */
274b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_integer_type(LLVMContextRef Context, value Width) {
275b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMIntTypeInContext(Context, Int_val(Width));
2768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
27946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) {
28046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetIntTypeWidth(IntegerTy));
2818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/
2848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
285b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
286b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_float_type(LLVMContextRef Context) {
287b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFloatTypeInContext(Context);
2888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
290b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
291b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_double_type(LLVMContextRef Context) {
292b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMDoubleTypeInContext(Context);
2938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
295b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
296b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_x86fp80_type(LLVMContextRef Context) {
297b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMX86FP80TypeInContext(Context);
2988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
300b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
301b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_fp128_type(LLVMContextRef Context) {
302b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFP128TypeInContext(Context);
3038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
305b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
306b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_ppc_fp128_type(LLVMContextRef Context) {
307b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMPPCFP128TypeInContext(Context);
3088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/
3118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
312957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
313957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) {
31481a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
315957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 0);
316957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
317957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
318957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
319957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy,
320957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                                                value ParamTys) {
321957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
322957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 1);
3238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */
32646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) {
32746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsFunctionVarArg(FunTy));
3288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
33146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
33246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
33346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
33446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
3358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/
3388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3395371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
3405371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_struct_type(LLVMContextRef C, value ElementTypes) {
3415371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
3425371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 0);
343957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
344957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
3455371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
3465371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C,
3475371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                             value ElementTypes) {
3485371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
3495371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 1);
3508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3526b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* llcontext -> string -> lltype */
3536b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMTypeRef llvm_named_struct_type(LLVMContextRef C,
3546b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                            value Name) {
3556b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return LLVMStructCreateNamed(C, String_val(Name));
3566b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3576b228e506f42972c003599f4873a24910f8a530aTorok Edwin
3586b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_struct_set_body(LLVMTypeRef Ty,
3596b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                    value ElementTypes,
3606b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                    value Packed) {
3616b228e506f42972c003599f4873a24910f8a530aTorok Edwin  LLVMStructSetBody(Ty, (LLVMTypeRef *) ElementTypes,
3626b228e506f42972c003599f4873a24910f8a530aTorok Edwin                    Wosize_val(ElementTypes), Bool_val(Packed));
3636b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return Val_unit;
3646b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3656b228e506f42972c003599f4873a24910f8a530aTorok Edwin
366c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin/* lltype -> string option */
367c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok EdwinCAMLprim value llvm_struct_name(LLVMTypeRef Ty)
368c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin{
36931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
37031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *C = LLVMGetStructName(Ty);
37131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (C) {
37231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal1(result);
37331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    result = caml_alloc_small(1, 0);
37431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(result, 0, caml_copy_string(C));
37531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(result);
37631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
37731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
378c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin}
379c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin
3808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
3811940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) {
38246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
38346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
38446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
3858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
38746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */
38846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
38946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsPackedStruct(StructTy));
3908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3926b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> bool */
3936b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_is_opaque(LLVMTypeRef StructTy) {
3946b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return Val_bool(LLVMIsOpaqueStruct(StructTy));
3956b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3966b228e506f42972c003599f4873a24910f8a530aTorok Edwin
3978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/
3988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
400957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) {
40181a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMArrayType(ElementTy, Int_val(Count));
4028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
40457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */
40557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) {
40657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, 0);
40757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
40857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
40957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */
41057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy,
41157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen                                                 value AddressSpace) {
41257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, Int_val(AddressSpace));
41357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
41457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
4158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
416957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) {
41781a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMVectorType(ElementTy, Int_val(Count));
4188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
42146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
42246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetArrayLength(ArrayTy));
4238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
42657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) {
42757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return Val_int(LLVMGetPointerAddressSpace(PtrTy));
42857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
42957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
43057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */
43146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
43246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVectorSize(VectorTy));
4338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/
4368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
437b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
438b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) {
439b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMVoidTypeInContext(Context);
440b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
441b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
442b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
443b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) {
444b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMLabelTypeInContext(Context);
445b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
4468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4478a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llcontext -> lltype */
4488a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMTypeRef llvm_x86_mmx_type(LLVMContextRef Context) {
4498a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return LLVMX86MMXTypeInContext(Context);
4508a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
4518a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
452ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_type_by_name(LLVMModuleRef M, value Name)
453ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
454ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLparam1(Name);
455ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMTypeRef Ty = LLVMGetTypeByName(M, String_val(Name));
456ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  if (Ty) {
457ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    value Option = alloc(1, 0);
458ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    Field(Option, 0) = (value) Ty;
459ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    CAMLreturn(Option);
460ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  }
461ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLreturn(Val_int(0));
462ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
463ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
4648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/
4658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */
46746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
46846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMTypeOf(Val);
4698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4713dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* keep in sync with ValueKind.t */
4723dd16741864302af14b31b7f75375c09d8544a35Torok Edwinenum ValueKind {
4733dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  NullValue=0,
4743dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Argument,
4753dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BasicBlock,
4763dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  InlineAsm,
4773dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDNode,
4783dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDString,
4793dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BlockAddress,
4803dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantAggregateZero,
4813dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantArray,
48234b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov  ConstantDataArray,
48334b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov  ConstantDataVector,
4843dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantExpr,
4853dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantFP,
4863dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantInt,
4873dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantPointerNull,
4883dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantStruct,
4893dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantVector,
4903dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Function,
4913dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalAlias,
4923dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalVariable,
4933dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  UndefValue,
4943dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Instruction
4953dd16741864302af14b31b7f75375c09d8544a35Torok Edwin};
4963dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4973dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* llvalue -> ValueKind.t */
4983dd16741864302af14b31b7f75375c09d8544a35Torok Edwin#define DEFINE_CASE(Val, Kind) \
4993dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    do {if (LLVMIsA##Kind(Val)) CAMLreturn(Val_int(Kind));} while(0)
5003dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
5013dd16741864302af14b31b7f75375c09d8544a35Torok EdwinCAMLprim value llvm_classify_value(LLVMValueRef Val) {
5023dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  CAMLparam0();
5033dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!Val)
5043dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(Val_int(NullValue));
5053dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAConstant(Val)) {
5063dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, BlockAddress);
5073dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantAggregateZero);
5083dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantArray);
50934b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov    DEFINE_CASE(Val, ConstantDataArray);
51034b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov    DEFINE_CASE(Val, ConstantDataVector);
5113dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantExpr);
5123dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantFP);
5133dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantInt);
5143dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantPointerNull);
5153dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantStruct);
5163dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantVector);
5173dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
5183dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAInstruction(Val)) {
5193dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLlocal1(result);
5203dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    result = caml_alloc_small(1, 0);
5213dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val)));
5223dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(result);
5233dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
5243dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAGlobalValue(Val)) {
5253dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, Function);
5263dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalAlias);
5273dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalVariable);
5283dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
5293dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, Argument);
5303dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, BasicBlock);
5313dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, InlineAsm);
5323dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDNode);
5333dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDString);
5343dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, UndefValue);
5353dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  failwith("Unknown Value class");
5363dd16741864302af14b31b7f75375c09d8544a35Torok Edwin}
5373dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
5388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
53946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) {
54046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetValueName(Val));
5418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
54446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
54546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetValueName(Val, String_val(Name));
5468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
5478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
54988cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */
55088cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) {
55188cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  LLVMDumpValue(Val);
55288cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  return Val_unit;
55388cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen}
55488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen
555ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov/* llvalue -> string */
556850b520114dd6bd86fc8741201b9beea88f96599Peter ZotovCAMLprim value llvm_string_of_llvalue(LLVMValueRef M) {
557850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  char* ValueCStr;
558850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  ValueCStr = LLVMPrintValueToString(M);
559ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov
560850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  value ValueStr = caml_copy_string(ValueCStr);
561850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  LLVMDisposeMessage(ValueCStr);
562ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov
563850b520114dd6bd86fc8741201b9beea88f96599Peter Zotov  return ValueStr;
564ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov}
565ba0c7cd012b064e2d8009480f9ae6f7d75e00e13Peter Zotov
56688d74c3093de563408ceb834d999613038195e98Peter Zotov/* llvalue -> llvalue -> unit */
56788d74c3093de563408ceb834d999613038195e98Peter ZotovCAMLprim value llvm_replace_all_uses_with(LLVMValueRef OldVal,
56888d74c3093de563408ceb834d999613038195e98Peter Zotov                                          LLVMValueRef NewVal) {
56988d74c3093de563408ceb834d999613038195e98Peter Zotov  LLVMReplaceAllUsesWith(OldVal, NewVal);
57088d74c3093de563408ceb834d999613038195e98Peter Zotov  return Val_unit;
57188d74c3093de563408ceb834d999613038195e98Peter Zotov}
57288d74c3093de563408ceb834d999613038195e98Peter Zotov
573b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/
574b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
575b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */
576b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) {
577b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar  return LLVMGetOperand(V, Int_val(I));
578b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar}
579b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
580f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
581f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) {
582f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  LLVMSetOperand(U, Int_val(I), V);
583f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_unit;
584f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
585f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
586f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */
587f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) {
588f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_int(LLVMGetNumOperands(V));
589f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
590f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
5918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
5928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
59446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
59546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
596344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
597344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
598344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
59946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
60046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
6018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
603344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
60446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
60546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
606344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
607344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
6086563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
6096563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) {
6106563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return LLVMIsAConstantExpr(Val) ?
6116563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      Val_int(LLVMGetConstOpcode(Val)) : Val_int(0);
6126563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
6136563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
61446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/
61546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
61646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */
61746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) {
61846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_bool(LLVMHasMetadata(Val));
61946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
62046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
62146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */
62246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) {
62346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam1(MDKindID);
62446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef MD;
62546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) {
62646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
62746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) MD;
62846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
62946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
63046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
63146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
63246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
63346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
63446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID,
63546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                 LLVMValueRef MD) {
63646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), MD);
63746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
63846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
63946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
64046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */
64146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) {
64246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), NULL);
64346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
64446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
64546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
64646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
64746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/
64846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
64946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */
65046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) {
65146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDStringInContext(C, String_val(S), caml_string_length(S));
65246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
65346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
65446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */
65546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) {
65646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals),
65746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                             Wosize_val(ElementVals));
65846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
65946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
6604f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */
6614f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) {
66231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
66331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *S;
66431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  unsigned Len;
66531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
66631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if ((S = LLVMGetMDString(V, &Len))) {
66731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal2(Option, Str);
66831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
66931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Str = caml_alloc_string(Len);
67031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    memcpy(String_val(Str), S, Len);
67131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Option = alloc(1,0);
67231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(Option, 0, Str);
67331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
67431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
67531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
6764f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
6774f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin
6786b8416192aeb6502f027883b8056d389f2c186a9Peter Zotov/* llmodule -> string -> llvalue array */
679e5de63c7de04c81d7d8484e5b64f47941143c739Peter ZotovCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value Name)
6804f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{
681e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  CAMLparam1(Name);
6824f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLlocal1(Nodes);
683e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(Name)), 0);
684e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  LLVMGetNamedMetadataOperands(M, String_val(Name), (LLVMValueRef *) Nodes);
6854f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLreturn(Nodes);
6864f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
6878a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
6888a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llmodule -> string -> llvalue -> unit */
6898a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_append_namedmd(LLVMModuleRef M, value Name, LLVMValueRef Val) {
6908a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMAddNamedMetadataOperand(M, String_val(Name), Val);
6918a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
6928a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
6938a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
6948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
6958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
696e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */
697e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) {
698e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, (long long) Int_val(N), 1);
6998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
701344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
702e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
703e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                                          value SExt) {
704e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
705344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
706344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
7076563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */
7086563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const)
7096563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{
7106563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLparam0();
7116563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  if (LLVMIsAConstantInt(Const) &&
7126563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) {
7136563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    value Option = alloc(1, 0);
7146563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const));
7156563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    CAMLreturn(Option);
7166563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  }
7176563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLreturn(Val_int(0));
7186563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
7196563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
72045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */
72145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
72245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                               value Radix) {
72345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S),
72445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                     Int_val(Radix));
72545d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
72645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
7278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
728e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) {
729e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstReal(RealTy, Double_val(N));
7308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
73245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */
73345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) {
73445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstRealOfStringAndSize(RealTy, String_val(S),
73545d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                      caml_string_length(S));
73645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
73745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
7388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
7398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
740b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
741b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str,
742b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                        value NullTerminate) {
743b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
744b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  1);
745e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
746e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
747b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
748b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str,
749b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                         value NullTerminate) {
750b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
751b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  0);
7528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
755e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy,
75646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
757e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
758e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                        Wosize_val(ElementVals));
759e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
760e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
7615371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
7625371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) {
7635371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
7645371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 0);
7658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7676b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> llvalue array -> llvalue */
7686b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMValueRef llvm_const_named_struct(LLVMTypeRef Ty, value ElementVals) {
7696b228e506f42972c003599f4873a24910f8a530aTorok Edwin    return LLVMConstNamedStruct(Ty, (LLVMValueRef *) Op_val(ElementVals),  Wosize_val(ElementVals));
7706b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
7716b228e506f42972c003599f4873a24910f8a530aTorok Edwin
7725371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
7735371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C,
7745371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                               value ElementVals) {
7755371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
7765371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 1);
7778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
780e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
781e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals),
782e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals));
7834647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7844647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
7854647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/
7864647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
787404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */
7884647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred,
7894647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
7904647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
7914647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant);
7924647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7934647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
794404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */
7954647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred,
7964647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
7974647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
7984647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant);
7994647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
8004647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
8014647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */
8024647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) {
8034647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
8044647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                      Wosize_val(Indices));
8058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8071b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */
8081b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal,
8091b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                               value Indices) {
8101b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
8111b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                              Wosize_val(Indices));
8121b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
8131b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
814c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov/* llvalue -> lltype -> is_signed:bool -> llvalue */
815c8ac229cc8349685117f68bc6f1da04f98015cd6Peter ZotovCAMLprim LLVMValueRef llvm_const_intcast(LLVMValueRef CV, LLVMTypeRef T,
816c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov                                         value IsSigned) {
817c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov  return LLVMConstIntCast(CV, T, Bool_val(IsSigned));
818c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov}
819c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov
8201b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */
8211b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate,
8221b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                              value Indices) {
8231b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
8241b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
8251b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
8261b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
8271b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8281b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
8291b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
8301b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
8311b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
8321b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8331b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstExtractValue(Aggregate, idxs, size);
8341b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
8351b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
8361b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
8371b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8381b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */
8391b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate,
8401b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                             LLVMValueRef Val, value Indices) {
8411b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
8421b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
8431b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
8441b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
8451b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8461b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
8471b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
8481b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
8491b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
8501b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
8511b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstInsertValue(Aggregate, Val, idxs, size);
8521b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
8531b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
8541b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
8551b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
856ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */
857ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm,
858ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value Constraints, value HasSideEffects,
859ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value IsAlignStack) {
860ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar  return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints),
861ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                            Bool_val(HasSideEffects), Bool_val(IsAlignStack));
862ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar}
863ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar
8648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
8658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
86746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
86846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
8698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
871404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */
87246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
87346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
8748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
876404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */
87746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
87846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
8798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
88346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
88446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
8858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
88846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
88946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
8908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
893404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */
89446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
89546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
8968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
898404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */
89946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
90046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
9018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
90546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
90646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
9078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
91046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
91146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
9128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
915705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/
916705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
917705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */
918705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) {
919705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
920705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef First;
921705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((First = LLVMGetFirstUse(Val))) {
922705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
923705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) First;
924705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
925705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
926705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
927705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
928705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
929705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */
930705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) {
931705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
932705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef Next;
933705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((Next = LLVMGetNextUse(U))) {
934705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
935705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) Next;
936705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
937705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
938705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
939705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
940705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
941705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
942705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) {
943705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUser(UR);
944705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
945705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
946705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
947705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) {
948705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUsedValue(UR);
949705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
950705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
9518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
9528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9534733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef,
9544733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
9554733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
9568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
95746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
95846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
9596d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
9606d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
9616d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
96257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0));
9636d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return GlobalVar;
9646d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
96546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
9668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9688e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */
9698e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name,
9708e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    value AddressSpace,
9718e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    LLVMModuleRef M) {
9728e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar;
9738e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
9748e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
9758e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar      return LLVMConstBitCast(GlobalVar,
9768e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                              LLVMPointerType(Ty, Int_val(AddressSpace)));
9778e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    return GlobalVar;
9788e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  }
979150c95eab549e1d764eab7ed05b17fe09663fc6ePeter Zotov  return LLVMAddGlobalInAddressSpace(M, Ty, String_val(Name),
980150c95eab549e1d764eab7ed05b17fe09663fc6ePeter Zotov                                     Int_val(AddressSpace));
9818e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
9828e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
9836d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
9846d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
9856d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
9866d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
9876d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
98875e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
9896d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) GlobalVar;
9906d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
9916d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
9926d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
9936d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
9946d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
9958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
99646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
99746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
99846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
9998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
10008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
100146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
10028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
10038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
10048e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */
10058e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name,
10068e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMValueRef Initializer,
10078e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   value AddressSpace,
10088e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMModuleRef M) {
10098e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M,
10108e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       LLVMTypeOf(Initializer),
10118e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       String_val(Name),
10128e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       Int_val(AddressSpace));
10138e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMSetInitializer(GlobalVar, Initializer);
10148e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return GlobalVar;
10158e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
10168e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
10178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
101846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
101946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
10208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
10218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
10228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
10238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
102446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
102546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
102646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
10278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
10288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
10298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
10308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
103146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
103246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
10338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
10348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
10358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
10368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
103746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
103846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
10398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
10408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
10418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
104246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
104346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
104446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
104546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
104646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
104746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10488a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> ThreadLocalMode.t */
10498a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_thread_local_mode(LLVMValueRef GlobalVar) {
10508a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_int(LLVMGetThreadLocalMode(GlobalVar));
10518a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10528a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
10538a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* ThreadLocalMode.t -> llvalue -> unit */
10548a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_thread_local_mode(value ThreadLocalMode,
10558a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                          LLVMValueRef GlobalVar) {
10568a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetThreadLocalMode(GlobalVar, Int_val(ThreadLocalMode));
10578a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
10588a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10598a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
10608a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> bool */
10618a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_is_externally_initialized(LLVMValueRef GlobalVar) {
10628a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_bool(LLVMIsExternallyInitialized(GlobalVar));
10638a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10648a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
10658a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* bool -> llvalue -> unit */
10668a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_externally_initialized(value IsExternallyInitialized,
10678a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                               LLVMValueRef GlobalVar) {
10688a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetExternallyInitialized(GlobalVar, Bool_val(IsExternallyInitialized));
10698a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
10708a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
10718a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
1072c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */
1073c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) {
1074c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_bool(LLVMIsGlobalConstant(GlobalVar));
1075c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
1076c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
1077c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */
1078c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) {
1079c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag));
1080c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_unit;
1081c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
1082c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
10836ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/
10846ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
10856ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty,
10866ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar                                     LLVMValueRef Aliasee, value Name) {
10876ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar  return LLVMAddAlias(M, Ty, Aliasee, String_val(Name));
10886ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar}
10896ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
109046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
109146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10924733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef,
10934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
10944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
109546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
109646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
109746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
10986d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
10996d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
11006d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty)
110157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0));
11026d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return Fn;
11036d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
110446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
110546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
110646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
11076d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
11086d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
11096d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
11106d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
11116d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
111275e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
11136d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) Fn;
11146d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
11156d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
11166d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
11176d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
11186d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
111946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
112046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
112146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
112246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
1123b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry");
112446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
112546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
112646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
112746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
112846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
112946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
113046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
113146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
113246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
113346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
113446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
113546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
113646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
113746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
113846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
113946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
114046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
114146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
114246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
114346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
114446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
114546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
114646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
114746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
114846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
114980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */
11505eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) {
11515eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  const char *GC;
115280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLparam0();
115380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLlocal2(Name, Option);
115480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
11555eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  if ((GC = LLVMGetGC(Fn))) {
11565eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    Name = copy_string(GC);
115780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
115880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Option = alloc(1, 0);
115980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Field(Option, 0) = Name;
116080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Option);
116180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  } else {
116280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Val_int(0));
116380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  }
116480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
116580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
116680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */
11675eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) {
11685eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
116980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  return Val_unit;
117080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
117180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
11720be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1173e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) {
11740be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddFunctionAttr(Arg, Int32_val(PA));
1175e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1176e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1177e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
11788a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> string -> string -> unit */
11798a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_add_target_dependent_function_attr(
11808a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                  LLVMValueRef Arg, value A, value V) {
11818a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMAddTargetDependentFunctionAttr(Arg, String_val(A), String_val(V));
11828a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
11838a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
11848a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
11850be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 */
11860be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_function_attr(LLVMValueRef Fn)
11870be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
11880be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
11890be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetFunctionAttr(Fn)));
11900be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
11910be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
11920be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1193e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) {
11940be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveFunctionAttr(Arg, Int32_val(PA));
1195e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1196e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
11974733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/
11984733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
11994733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent)
12004733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
12014733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */
12024733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
12034733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
12044733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
12054733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
12060be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int */
12070be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_param_attr(LLVMValueRef Param)
12080be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
12090be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
12100be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetAttribute(Param)));
12110be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
12120be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
1213e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */
1214e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) {
12154733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
12164733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
12174733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Params;
12184733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
12194733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
12200be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1221e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) {
12220be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddAttribute(Arg, Int32_val(PA));
1223e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1224e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1225e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
12260be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1227e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) {
12280be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveAttribute(Arg, Int32_val(PA));
1229e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1230e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1231e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1232e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */
1233e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
1234e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  LLVMSetParamAlignment(Arg, Int_val(align));
1235e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1236e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1237e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
123846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
123946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
12404733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(
12414733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent)
12424733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1243ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llbasicblock -> llvalue option */
1244ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_block_terminator(LLVMBasicBlockRef Block)
1245ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1246ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLparam0();
1247ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMValueRef Term = LLVMGetBasicBlockTerminator(Block);
1248ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  if (Term) {
1249ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    value Option = alloc(1, 0);
1250ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    Field(Option, 0) = (value) Term;
1251ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    CAMLreturn(Option);
1252ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  }
1253ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLreturn(Val_int(0));
1254ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1255ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
125646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
125746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
125846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
125946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
126046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
126146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
126246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
126346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
126446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
126546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
126646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
126746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
126846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
12698a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> unit */
12708a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_remove_block(LLVMBasicBlockRef BB) {
12718a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMRemoveBasicBlockFromParent(BB);
12728a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
12738a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
12748a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
12758a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> llbasicblock -> unit */
12768a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_move_block_before(LLVMBasicBlockRef Pos, LLVMBasicBlockRef BB) {
12778a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMMoveBasicBlockBefore(BB, Pos);
12788a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
12798a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
12808a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
12818a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> llbasicblock -> unit */
12828a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_move_block_after(LLVMBasicBlockRef Pos, LLVMBasicBlockRef BB) {
12838a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMMoveBasicBlockAfter(BB, Pos);
12848a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
12858a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
12868a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
128746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
1288b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name,
1289b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMValueRef Fn) {
1290b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name));
129146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
129246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
129346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
1294b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name,
1295b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMBasicBlockRef BB) {
1296b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name));
129746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
129846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
129946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
130046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
130146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
130246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
130346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1304033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/
1305033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
1306033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
1307033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen                 LLVMGetInstructionParent)
1308033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
13096563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
13106563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
13113dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  LLVMOpcode o;
13123dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!LLVMIsAInstruction(Inst))
13133dd16741864302af14b31b7f75375c09d8544a35Torok Edwin      failwith("Not an instruction");
13143dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  o = LLVMGetInstructionOpcode(Inst);
1315efde86753d6f324ac9d0b42e48fd3ebf40c17905Benjamin Kramer  assert (o <= LLVMLandingPad);
13166563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return Val_int(o);
13176563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
1318033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
13196b8416192aeb6502f027883b8056d389f2c186a9Peter Zotov/* llvalue -> ICmp.t option */
13204917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
132131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
132231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  int x = LLVMGetICmpPredicate(Val);
132331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (x) {
132431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    value Option = alloc(1, 0);
132531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Field(Option, 0) = Val_int(x - LLVMIntEQ);
132631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
132731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
132831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
13294917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin}
13304917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
13314917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
1332cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/
1333cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1334cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */
1335cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
1336cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_int(LLVMGetInstructionCallConv(Inst));
1337cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1338cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1339cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */
1340cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
1341cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  LLVMSetInstructionCallConv(Inst, Int_val(CC));
1342cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_unit;
1343cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1344cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
13450be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1346e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr,
1347e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value index,
1348e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value PA) {
13490be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1350e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1351e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1352e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
13530be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1354e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr,
1355e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value index,
1356e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value PA) {
13570be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1358e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1359e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1360e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
136107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/
136207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
136307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */
136407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
136507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_bool(LLVMIsTailCall(CallInst));
136607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
136707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
136807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */
136907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall,
137007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen                                  LLVMValueRef CallInst) {
137107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  LLVMSetTailCall(CallInst, Bool_val(IsTailCall));
137207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_unit;
137307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
137407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
13758a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/*--... Operations on load/store instructions (only)........................--*/
13768a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
13778a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> bool */
13788a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_is_volatile(LLVMValueRef MemoryInst) {
13798a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_bool(LLVMGetVolatile(MemoryInst));
13808a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
13818a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
13828a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* bool -> llvalue -> unit */
13838a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_volatile(value IsVolatile,
13848a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                  LLVMValueRef MemoryInst) {
13858a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetVolatile(MemoryInst, Bool_val(IsVolatile));
13868a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Val_unit;
13878a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
13888a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
13892618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/
13902618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
13912618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */
13922618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
13932618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMAddIncoming(PhiNode,
13942618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMValueRef*) &Field(Incoming, 0),
13952618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMBasicBlockRef*) &Field(Incoming, 1),
13962618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  1);
13972618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return Val_unit;
13982618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
13992618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
14002618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */
14012618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
14022618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  unsigned I;
14032618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLparam0();
14042618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLlocal3(Hd, Tl, Tmp);
14052618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
14062618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  /* Build a tuple list of them. */
14072618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Tl = Val_int(0);
14082618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
14092618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Hd = alloc(2, 0);
14102618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
14112618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
14122618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
14132618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tmp = alloc(2, 0);
14142618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 0, Hd);
14152618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 1, Tl);
14162618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tl = Tmp;
14172618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
14182618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
14192618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLreturn(Tl);
14202618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
14212618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
1422ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> unit */
1423ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_delete_instruction(LLVMValueRef Instruction) {
1424ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMInstructionEraseFromParent(Instruction);
1425ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return Val_unit;
1426ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
142746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
142846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
142946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
143046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
143146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1432a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) {
143346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
143446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
143546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
143646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
143719648c00d66d5fc35c7954faa0bc63a34f68cb9dPeter Zotov  (char *) "LLVMIRBuilder",
143846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
143946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
144046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
144146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
144246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
14434d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#ifdef custom_compare_ext_default
14444d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes  , custom_compare_ext_default
14454d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#endif
144646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
144746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1448a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) {
1449a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
1450a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  Builder_val(V) = B;
1451a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  return V;
1452a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1453a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
14545371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */
14555371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) {
14565371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return alloc_builder(LLVMCreateBuilderInContext(C));
1457a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1458a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
1459033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */
1460033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) {
1461033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  if (Tag_val(Pos) == 0) {
1462033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0));
1463033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderAtEnd(Builder_val(B), BB);
1464033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  } else {
1465033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0));
1466033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderBefore(Builder_val(B), I);
1467033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  }
14688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
14698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
147046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1471dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */
1472628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) {
1473dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B));
1474dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  if (!InsertBlock)
1475dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen    raise_not_found();
1476dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  return InsertBlock;
1477dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen}
1478dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen
14795c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */
1480628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) {
1481628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar  LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name));
14825c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar  return Val_unit;
14835c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar}
14845c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar
148546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/
148646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
148746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
148846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) {
148946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), V);
149046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
149146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
149246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
149346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */
149446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) {
149546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), NULL);
149646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
149746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
149846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
149946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */
150046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) {
150146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam0();
150246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef L;
150346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) {
150446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
150546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) L;
150646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
150746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
150846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
150946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
151046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
151146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
151246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) {
151346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetInstDebugLocation(Builder_val(B), V);
151446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
151546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
151646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
151746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
152146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
152246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
152346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
152646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
152746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
152846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
15306793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */
15316793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) {
15326793dd9769047706acf34420586716450344fb66Erick Tryzelaar  return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals),
15336793dd9769047706acf34420586716450344fb66Erick Tryzelaar                               Wosize_val(RetVals));
15346793dd9769047706acf34420586716450344fb66Erick Tryzelaar}
15356793dd9769047706acf34420586716450344fb66Erick Tryzelaar
153646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
153746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
153846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
153946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
154046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
154146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
154246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
154346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
154446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
154546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
154646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
154746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
154846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
154946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
155046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
155146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
155246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
155346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
155446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
155546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
155646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1557ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> string -> llbuilder -> llvalue */
1558ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_malloc(LLVMTypeRef Ty, value Name,
1559ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                        value B)
1560ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1561ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildMalloc(Builder_val(B), Ty, String_val(Name));
1562ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1563ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1564ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> string -> llbuilder -> llvalue */
1565ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_array_malloc(LLVMTypeRef Ty,
1566ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              LLVMValueRef Val,
1567ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              value Name, value B)
1568ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1569ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildArrayMalloc(Builder_val(B), Ty, Val, String_val(Name));
1570ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1571ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1572ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1573ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_free(LLVMValueRef P, value B)
1574ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1575ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildFree(Builder_val(B), P);
1576ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1577ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
15781430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
15791430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal,
158021491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen                             LLVMBasicBlockRef Dest) {
158121491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  LLVMAddCase(Switch, OnVal, Dest);
158221491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  return Val_unit;
158321491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen}
158421491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen
1585c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */
1586c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr,
1587c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value EstimatedDests,
1588c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value B) {
1589c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests);
1590c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1591c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
1592c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
1593c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr,
1594c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                    LLVMBasicBlockRef Dest) {
1595c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  LLVMAddDestination(IndirectBr, Dest);
1596c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return Val_unit;
1597c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1598c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
159946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
160046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
160146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
160246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
160346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
160446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
160546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
160646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
160746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
160846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
161046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
161146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
161246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
161346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
161446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
161546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
161646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
161746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1618ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> int -> string -> llbuilder -> llvalue */
161948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn,
162048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value NumClauses,  value Name,
162148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value B) {
162248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses),
162348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                               String_val(Name));
162448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
162548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1626ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llvalue -> unit */
1627ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_add_clause(LLVMValueRef LandingPadInst, LLVMValueRef ClauseVal)
1628ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1629ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    LLVMAddClause(LandingPadInst, ClauseVal);
1630ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return Val_unit;
1631ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1632ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1633ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1634ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> bool -> unit */
163548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)
163648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{
163748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    LLVMSetCleanup(LandingPadInst, Bool_val(flag));
163848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return Val_unit;
163948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
164048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1641ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1642ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_resume(LLVMValueRef Exn, value B)
1643ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1644ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return LLVMBuildResume(Builder_val(B), Exn);
1645ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1646ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
164746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
164846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
164946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
165046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
165146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
165246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
165346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
165446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
165546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
165646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
165746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
165846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
165946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
166046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1661e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS,
1662e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1663e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name));
1664e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1665e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1666e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
166719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS,
166819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
166919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name));
167019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
167119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
167219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1673e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS,
1674e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1675e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name));
1676e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1677e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1678e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
167946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
168046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
168146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
168246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
168446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
168519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
168619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
168719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name));
168819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
168919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
169019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
169119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
169219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
169319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name));
169419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
169519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
169619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1697e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS,
1698e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1699e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name));
1700e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1701e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1702e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
170346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
170446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
170546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
170646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
170746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
170846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
170919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
171019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
171119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name));
171219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
171319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
171419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
171519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
171619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
171719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name));
171819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
171919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
172019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1721e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS,
1722e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1723e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name));
1724e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1725e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1726e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
172746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
172846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
172946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
173046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
173146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
173246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
173346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
173446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
173546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
173646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
173746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
173846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1739e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
1740e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                            value Name, value B) {
1741e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name));
1742e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1743e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1744e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
174546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
174646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
174746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
174846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
175146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
175246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
175346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
175446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
175546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
175746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
175846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
175946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
176046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
176146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
176246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
176346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
176446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
176546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
176646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
176746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
176846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
176946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
177046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
177146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
177246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
177446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
177546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
177646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
177746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
177846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
178146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
178246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
178346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
178446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
178546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
178746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
178846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
178946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
179046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
179246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
179346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
179446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
179546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
179646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
179846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
179946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
180046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
180146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
180246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
180446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
180546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
180646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
180746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
180846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
181046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
181119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X,
181219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
181319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name));
181419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
181519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
181619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
181719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X,
181819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
181919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name));
182019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
182119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
182219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
182319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X,
182419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                     value Name, value B) {
182519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildFNeg(Builder_val(B), X, String_val(Name));
182619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
182719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
182819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
182946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
183046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
183146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
183246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
183346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
183446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
183546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
183646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
183746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
183846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
183946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
184046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
184146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
184246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
184346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
184446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
184546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
184646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
184746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
184846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
184946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
185046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
185146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
185246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
185346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
185446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
185546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
185646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
185746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
185846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
185946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
18608a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* AtomicRMWBinOp.t -> llvalue -> llvalue -> AtomicOrdering.t ->
18618a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov   bool -> llbuilder -> llvalue */
18628a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMValueRef llvm_build_atomicrmw_native(value BinOp, LLVMValueRef Ptr,
18638a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                                  LLVMValueRef Val, value Ord,
18648a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                                  value ST, value Name, value B) {
18658a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMValueRef Instr;
18668a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  Instr = LLVMBuildAtomicRMW(Builder_val(B), Int_val(BinOp),
18678a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                             Ptr, Val, Int_val(Ord), Bool_val(ST));
18688a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  LLVMSetValueName(Instr, String_val(Name));
18698a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return Instr;
18708a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
18718a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
18728a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMValueRef llvm_build_atomicrmw_bytecode(value *argv, int argn) {
18738a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov  return llvm_build_atomicrmw_native(argv[0], (LLVMValueRef) argv[1],
18748a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                     (LLVMValueRef) argv[2], argv[3],
18758a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov                                     argv[4], argv[5], argv[6]);
18768a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov}
18778a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov
187846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
187946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
188046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
188146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
188246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
188346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
188446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
188546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1886e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
1887e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer,
1888e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value Indices, value Name,
1889e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1890e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInBoundsGEP(Builder_val(B), Pointer,
1891e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              (LLVMValueRef *) Op_val(Indices),
1892e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              Wosize_val(Indices), String_val(Name));
1893e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1894e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1895e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1896e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer,
1897c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                                               value Index, value Name,
1898e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1899c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner  return LLVMBuildStructGEP(Builder_val(B), Pointer,
1900c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                              Int_val(Index), String_val(Name));
1901e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1902e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1903e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1904e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) {
1905e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalString(Builder_val(B), String_val(Str),
1906e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1907e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1908e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1909e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1910e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name,
1911e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1912e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str),
1913e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                  String_val(Name));
1914e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1915e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
191646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
191746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
191846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
191946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
192046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
192146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
192246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
192446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
192546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
192646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
192746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
192846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
193046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
193146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
193246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
193346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
193446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
193546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
193646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
193746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
193846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
193946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
194046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
194146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
194246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
194346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
194446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
194546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
194646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
194746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
194846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
194946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
195046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
195146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
195246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
195346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
195446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
195546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
195646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
195746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
195846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
195946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
196046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
196146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
196246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
196346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
196446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
196546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
196646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
196746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
196846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
196946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
197046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
197146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
197246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
197346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
197446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
197546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
197646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
197746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
197846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
197946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
198046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
198146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
198246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
198346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
198446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
198546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
198646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
198746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
198846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
198946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1990e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1991e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1992e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1993e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1994e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1995e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1996e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1997e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1998e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1999e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
2000e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2001e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2002e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
2003e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X,
2004e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  LLVMTypeRef Ty, value Name,
2005e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
2006e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name));
2007e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2008e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2009e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
2010e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty,
2011e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
2012e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name));
2013e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2014e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2015e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
2016e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty,
2017e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
2018e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name));
2019e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2020e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2021e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
2022e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty,
2023e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                        value Name, value B) {
2024e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name));
2025e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2026e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
202746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
202846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
2029404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
203046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
203146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
203246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
203346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
203446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
203546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
203646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
2037404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
203846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
203946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
204046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
204146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
204246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
204346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
204446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
204546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
204646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
20472618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
20482618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
20492618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  value Hd, Tl;
20502618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMValueRef FirstValue, PhiNode;
20512618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20522618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
20532618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20542618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Hd = Field(Incoming, 0);
20552618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  FirstValue = (LLVMValueRef) Field(Hd, 0);
20562618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
20572618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                         String_val(Name));
20582618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20592618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
20602618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    value Hd = Field(Tl, 0);
20612618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
20622618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                    (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
20632618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
20642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
20652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return PhiNode;
206646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
206746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
206846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
206946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
207046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
207146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
207246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
207346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
207446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
207546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
207646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
207746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
207846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
207946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
208046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
208146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
208246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
208346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
208446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
208546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
208646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
208746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
208846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
208946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
209046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
209146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
209246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
209346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
209446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
209546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
209646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
209746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
209846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
209946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
210046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
210146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
210246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
210346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
210446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
210546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
210646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
210746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
210846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
210946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
211046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
2111e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
2112e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate,
2113e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                              value Idx, value Name, value B) {
2114e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx),
2115e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
2116e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2117e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2118e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */
2119e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate,
2120e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             LLVMValueRef Val, value Idx,
2121e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
2122e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx),
2123e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              String_val(Name));
2124e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2125e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2126e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
2127e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name,
2128e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value B) {
2129e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name));
2130e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2131e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2132e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
2133e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name,
2134e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value B) {
2135e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name));
2136e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
2137e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
2138e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
2139e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS,
2140e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
2141e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name));
2142e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
21431ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
2144da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/
2145da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2146da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer
2147da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
2148da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) {
2149da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Path);
2150da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
2151da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
2152da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2153da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path),
2154da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen                                               &MemBuf, &Message))
2155da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
2156da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2157da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLreturn((value) MemBuf);
2158da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2159da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2160da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer
2161da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
2162da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
2163da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
2164da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
2165da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2166da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message))
2167da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
2168da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2169da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return MemBuf;
2170da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2171da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2172f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* ?name:string -> string -> llmemorybuffer */
2173f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_string(value Name, value String) {
2174f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  const char *NameCStr;
2175f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  if(Name == Val_int(0))
2176f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov    NameCStr = "";
2177f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  else
2178f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov    NameCStr = String_val(Field(Name, 0));
2179f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2180f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  LLVMMemoryBufferRef MemBuf;
2181f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  MemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy(
2182f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov                String_val(String), caml_string_length(String), NameCStr);
2183f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2184f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  return MemBuf;
2185f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov}
2186f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2187f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* llmemorybuffer -> string */
2188f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim value llvm_memorybuffer_as_string(LLVMMemoryBufferRef MemBuf) {
2189f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  value String = caml_alloc_string(LLVMGetBufferSize(MemBuf));
2190f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  memcpy(String_val(String), LLVMGetBufferStart(MemBuf),
2191f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov         LLVMGetBufferSize(MemBuf));
2192f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2193f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  return String;
2194f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov}
2195f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2196da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */
2197da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
2198da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMemoryBuffer(MemBuf);
2199da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
2200da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2201da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2202d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/
2203d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2204d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */
2205d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) {
2206d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return LLVMCreatePassManager();
2207d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2208d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2209d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */
2210d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M,
2211d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                           LLVMPassManagerRef PM) {
2212d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunPassManager(PM, M));
2213d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2214d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2215d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2216d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) {
2217d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMInitializeFunctionPassManager(FPM));
2218d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2219d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2220d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */
2221d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F,
2222d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                             LLVMPassManagerRef FPM) {
2223d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunFunctionPassManager(FPM, F));
2224d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2225d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2226d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2227d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) {
2228d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMFinalizeFunctionPassManager(FPM));
2229d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2230d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2231d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */
2232d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) {
2233d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  LLVMDisposePassManager(PM);
2234d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_unit;
2235d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2236