llvm_ocaml.c revision 6563c879964c3bcf5c77d40da8d4c807adf605aa
1bbf1c514bd832bf1306fe3e87221fd78bbc306efGordon Henriksen/*===-- llvm_ocaml.c - LLVM Ocaml Glue --------------------------*- C++ -*-===*\
28ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
38ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                     The LLVM Compiler Infrastructure                       *|
48ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
5234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* This file is distributed under the University of Illinois Open Source      *|
6234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* License. See LICENSE.TXT for details.                                      *|
78ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
88ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*===----------------------------------------------------------------------===*|
98ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* This file glues LLVM's ocaml interface to its C interface. These functions *|
118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* are by and large transparent wrappers to the corresponding C functions.    *|
128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* Note that these functions intentionally take liberties with the CAMLparamX *|
148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* macros, since most of the parameters are not GC heap objects.              *|
158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen\*===----------------------------------------------------------------------===*/
178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "llvm-c/Core.h"
198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/alloc.h"
2046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#include "caml/custom.h"
218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/memory.h"
22da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/fail.h"
23da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/callback.h"
246d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen#include "llvm/Config/config.h"
252618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen#include <assert.h>
26da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include <stdlib.h>
274f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin#include <string.h>
28da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
29da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
30da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Can't use the recommended caml_named_value mechanism for backwards
31da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   compatibility reasons. This is largely equivalent. */
32da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksenstatic value llvm_ioerror_exn;
33da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
34da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_register_core_exns(value IoError) {
35da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  llvm_ioerror_exn = Field(IoError, 0);
36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  register_global_root(&llvm_ioerror_exn);
37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
38da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
39da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void llvm_raise(value Prototype, char *Message) {
41da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Prototype);
42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLlocal1(CamlMessage);
43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CamlMessage = copy_string(Message);
45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMessage(Message);
46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
47da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  raise_with_arg(Prototype, CamlMessage);
482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  abort(); /* NOTREACHED */
49a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#ifdef CAMLnoreturn
50a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen  CAMLnoreturn; /* Silences warnings, but is missing in some versions. */
51a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#endif
52da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
544733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksenstatic value alloc_variant(int tag, void *Value) {
554733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Iter = alloc_small(1, tag);
564733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  Field(Iter, 0) = Val_op(Value);
574733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Iter;
584733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
594733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
604733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* Macro to convert the C first/next/last/prev idiom to the Ocaml llpos/
614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen   llrev_pos idiom. */
624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen#define DEFINE_ITERATORS(camlname, cname, pty, cty, pfun) \
634733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llpos */                        \
644733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_begin(pty Mom) {       \
654733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty First = LLVMGetFirst##cname(Mom);                 \
664733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (First)                                            \
674733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, First);                     \
684733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
704733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
714733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llpos */                         \
724733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_succ(cty Kid) {        \
734733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Next = LLVMGetNext##cname(Kid);                   \
744733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Next)                                             \
754733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Next);                      \
76f440691a20eff24cf59ac14e10057234ae182dbeGordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
774733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
784733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
794733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llrev_pos */                    \
804733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_end(pty Mom) {         \
814733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Last = LLVMGetLast##cname(Mom);                   \
824733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Last)                                             \
834733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Last);                      \
844733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
854733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
874733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llrev_pos */                     \
884733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_pred(cty Kid) {        \
894733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Prev = LLVMGetPrevious##cname(Kid);               \
904733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Prev)                                             \
914733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Prev);                      \
924733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }
944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
965371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/*===-- Contexts ----------------------------------------------------------===*/
975371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
985371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
995371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_create_context(value Unit) {
1005371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMContextCreate();
1015371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1025371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1035371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> unit */
1045371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_dispose_context(LLVMContextRef C) {
1055371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  LLVMContextDispose(C);
1065371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return Val_unit;
1075371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1085371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1095371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
1105371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_global_context(value Unit) {
1115371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetGlobalContext();
1125371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1135371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
11446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> int */
11546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_mdkind_id(LLVMContextRef C, value Name) {
11646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  unsigned MDKindID = LLVMGetMDKindIDInContext(C, String_val(Name),
11746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                               caml_string_length(Name));
11846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_int(MDKindID);
11946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
12046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
1218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/
1228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
123263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar/* llcontext -> string -> llmodule */
124263d989a719c1864862fc91f59193a6c2b55ca48Erick TryzelaarCAMLprim LLVMModuleRef llvm_create_module(LLVMContextRef C, value ModuleID) {
125263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar  return LLVMModuleCreateWithNameInContext(String_val(ModuleID), C);
1268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */
12946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) {
13046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeModule(M);
1318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
134a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
135a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_target_triple(LLVMModuleRef M) {
136a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetTarget(M));
137a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
138a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
139a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
140a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_target_triple(value Trip, LLVMModuleRef M) {
141a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetTarget(M, String_val(Trip));
142a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
143a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
144a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
145a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
146a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_data_layout(LLVMModuleRef M) {
147a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetDataLayout(M));
148a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
149a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
150a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
151a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_data_layout(value Layout, LLVMModuleRef M) {
152a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetDataLayout(M, String_val(Layout));
153a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
154a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
155a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
156af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen/* llmodule -> unit */
157af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon HenriksenCAMLprim value llvm_dump_module(LLVMModuleRef M) {
158af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  LLVMDumpModule(M);
159af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  return Val_unit;
160af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen}
161af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen
1620941534c712d77243d9dda5e8c1d927563b4edffChris Lattner/* llmodule -> string -> unit */
1630941534c712d77243d9dda5e8c1d927563b4edffChris LattnerCAMLprim value llvm_set_module_inline_asm(LLVMModuleRef M, value Asm) {
1640941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMSetModuleInlineAsm(M, String_val(Asm));
1650941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  return Val_unit;
1660941534c712d77243d9dda5e8c1d927563b4edffChris Lattner}
1678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/
1698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
170404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* lltype -> TypeKind.t */
17146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) {
17246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetTypeKind(Ty));
1738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
175ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok EdwinCAMLprim value llvm_type_is_sized(LLVMTypeRef Ty) {
176ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin    return Val_bool(LLVMTypeIsSized(Ty));
177ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin}
178ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin
1795371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* lltype -> llcontext */
1805371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_type_context(LLVMTypeRef Ty) {
1815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetTypeContext(Ty);
1825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/
1858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
186b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
187b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i1_type (LLVMContextRef Context) {
188b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt1TypeInContext(Context);
189b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
190b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
191b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
192b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i8_type (LLVMContextRef Context) {
193b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt8TypeInContext(Context);
194b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
195b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
196b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
197b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i16_type (LLVMContextRef Context) {
198b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt16TypeInContext(Context);
199b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
200b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
201b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
202b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i32_type (LLVMContextRef Context) {
203b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt32TypeInContext(Context);
204b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
205b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
206b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
207b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i64_type (LLVMContextRef Context) {
208b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt64TypeInContext(Context);
209b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
2108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
211b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> int -> lltype */
212b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_integer_type(LLVMContextRef Context, value Width) {
213b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMIntTypeInContext(Context, Int_val(Width));
2148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
21746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) {
21846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetIntTypeWidth(IntegerTy));
2198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/
2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
223b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
224b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_float_type(LLVMContextRef Context) {
225b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFloatTypeInContext(Context);
2268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
228b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
229b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_double_type(LLVMContextRef Context) {
230b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMDoubleTypeInContext(Context);
2318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
233b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
234b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_x86fp80_type(LLVMContextRef Context) {
235b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMX86FP80TypeInContext(Context);
2368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
238b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
239b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_fp128_type(LLVMContextRef Context) {
240b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFP128TypeInContext(Context);
2418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
243b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
244b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_ppc_fp128_type(LLVMContextRef Context) {
245b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMPPCFP128TypeInContext(Context);
2468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
248bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen/* llcontext -> lltype */
249bb811a244567aa8a1522203f15588f4d001b7353Dale JohannesenCAMLprim LLVMTypeRef llvm_x86mmx_type(LLVMContextRef Context) {
250bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen  return LLVMX86MMXTypeInContext(Context);
251bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen}
252bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen
2538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/
2548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
255957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
256957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) {
25781a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
258957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 0);
259957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
260957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
261957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
262957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy,
263957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                                                value ParamTys) {
264957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
265957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 1);
2668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */
26946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) {
27046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsFunctionVarArg(FunTy));
2718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
27446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
27546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
27646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
27746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/
2818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
2835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_struct_type(LLVMContextRef C, value ElementTypes) {
2845371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
2855371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 0);
286957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
287957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
2885371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
2895371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C,
2905371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                             value ElementTypes) {
2915371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
2925371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 1);
2938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
295c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin/* lltype -> string option */
296c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok EdwinCAMLprim value llvm_struct_name(LLVMTypeRef Ty)
297c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin{
29831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
29931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *C = LLVMGetStructName(Ty);
30031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (C) {
30131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal1(result);
30231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    result = caml_alloc_small(1, 0);
30331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(result, 0, caml_copy_string(C));
30431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(result);
30531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
30631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
307c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin}
308c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin
3098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
3101940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) {
31146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
31246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
31346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
3148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
31646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */
31746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
31846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsPackedStruct(StructTy));
3198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/
3228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
324957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) {
32581a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMArrayType(ElementTy, Int_val(Count));
3268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
32857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */
32957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) {
33057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, 0);
33157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
33257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
33357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */
33457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy,
33557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen                                                 value AddressSpace) {
33657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, Int_val(AddressSpace));
33757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
33857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
3398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
340957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) {
34181a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMVectorType(ElementTy, Int_val(Count));
3428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
34546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
34646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetArrayLength(ArrayTy));
3478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
35057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) {
35157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return Val_int(LLVMGetPointerAddressSpace(PtrTy));
35257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
35357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
35457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */
35546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
35646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVectorSize(VectorTy));
3578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/
3608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
361b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
362b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) {
363b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMVoidTypeInContext(Context);
364b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
365b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
366b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
367b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) {
368b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMLabelTypeInContext(Context);
369b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
3708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/
3728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */
37446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
37546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMTypeOf(Val);
3768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
37946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) {
38046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetValueName(Val));
3818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
38446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
38546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetValueName(Val, String_val(Name));
3868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
3878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
38988cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */
39088cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) {
39188cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  LLVMDumpValue(Val);
39288cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  return Val_unit;
39388cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen}
39488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen
395b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/
396b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
397b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */
398b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) {
399b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar  return LLVMGetOperand(V, Int_val(I));
400b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar}
401b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
402f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
403f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) {
404f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  LLVMSetOperand(U, Int_val(I), V);
405f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_unit;
406f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
407f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
408f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */
409f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) {
410f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_int(LLVMGetNumOperands(V));
411f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
412f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
4138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
4148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
41646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
41746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
418344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
419344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
420344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
42146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
42246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
4238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
425344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
42646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
42746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
428344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
429344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
4306563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
4316563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) {
4326563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return LLVMIsAConstantExpr(Val) ?
4336563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      Val_int(LLVMGetConstOpcode(Val)) : Val_int(0);
4346563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
4356563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
43646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/
43746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
43846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */
43946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) {
44046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_bool(LLVMHasMetadata(Val));
44146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
44246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
44346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */
44446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) {
44546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam1(MDKindID);
44646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef MD;
44746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) {
44846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
44946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) MD;
45046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
45146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
45246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
45346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
45446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
45546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
45646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID,
45746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                 LLVMValueRef MD) {
45846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), MD);
45946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
46046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
46146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
46246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */
46346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) {
46446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), NULL);
46546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
46646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
46746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
46846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
46946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/
47046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
47146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */
47246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) {
47346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDStringInContext(C, String_val(S), caml_string_length(S));
47446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
47546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
47646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */
47746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) {
47846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals),
47946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                             Wosize_val(ElementVals));
48046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
48146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
4824f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */
4834f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) {
48431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
48531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *S;
48631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  unsigned Len;
48731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
48831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if ((S = LLVMGetMDString(V, &Len))) {
48931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal2(Option, Str);
49031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
49131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Str = caml_alloc_string(Len);
49231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    memcpy(String_val(Str), S, Len);
49331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Option = alloc(1,0);
49431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(Option, 0, Str);
49531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
49631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
49731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
4984f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
4994f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin
5004f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value name)
5014f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{
5024f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLparam1(name);
5034f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLlocal1(Nodes);
5044f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(name)), 0);
5054f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  LLVMGetNamedMetadataOperands(M, String_val(name), (LLVMValueRef *) Nodes);
5064f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLreturn(Nodes);
5074f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
5088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
5098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
510e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */
511e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) {
512e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, (long long) Int_val(N), 1);
5138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
515344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
516e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
517e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                                          value SExt) {
518e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
519344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
520344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
5216563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */
5226563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const)
5236563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{
5246563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLparam0();
5256563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  if (LLVMIsAConstantInt(Const) &&
5266563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) {
5276563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    value Option = alloc(1, 0);
5286563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const));
5296563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    CAMLreturn(Option);
5306563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  }
5316563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLreturn(Val_int(0));
5326563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
5336563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
53445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */
53545d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
53645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                               value Radix) {
53745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S),
53845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                     Int_val(Radix));
53945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
54045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
5418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
542e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) {
543e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstReal(RealTy, Double_val(N));
5448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
54645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */
54745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) {
54845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstRealOfStringAndSize(RealTy, String_val(S),
54945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                      caml_string_length(S));
55045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
55145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
5528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
5538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
554b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
555b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str,
556b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                        value NullTerminate) {
557b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
558b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  1);
559e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
560e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
561b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
562b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str,
563b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                         value NullTerminate) {
564b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
565b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  0);
5668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
569e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy,
57046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
571e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
572e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                        Wosize_val(ElementVals));
573e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
574e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
5755371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
5765371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) {
5775371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
5785371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 0);
5798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
5825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C,
5835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                               value ElementVals) {
5845371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
5855371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 1);
5868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
589e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
590e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals),
591e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals));
5924647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
5934647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5944647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/
5954647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
596404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */
5974647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred,
5984647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
5994647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
6004647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant);
6014647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6024647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
603404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */
6044647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred,
6054647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
6064647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
6074647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant);
6084647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6094647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
6104647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */
6114647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) {
6124647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
6134647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                      Wosize_val(Indices));
6148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6161b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */
6171b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal,
6181b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                               value Indices) {
6191b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
6201b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                              Wosize_val(Indices));
6211b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
6221b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
6231b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */
6241b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate,
6251b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                              value Indices) {
6261b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
6271b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
6281b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
6291b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
6301b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
6311b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
6321b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
6331b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
6341b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
6351b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
6361b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstExtractValue(Aggregate, idxs, size);
6371b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
6381b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
6391b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
6401b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
6411b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */
6421b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate,
6431b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                             LLVMValueRef Val, value Indices) {
6441b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
6451b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
6461b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
6471b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
6481b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
6491b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
6501b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
6511b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
6521b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
6531b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
6541b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstInsertValue(Aggregate, Val, idxs, size);
6551b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
6561b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
6571b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
6581b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
659ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */
660ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm,
661ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value Constraints, value HasSideEffects,
662ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value IsAlignStack) {
663ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar  return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints),
664ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                            Bool_val(HasSideEffects), Bool_val(IsAlignStack));
665ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar}
666ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar
6678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
6688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
67046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
67146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
6728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
674404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */
67546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
67646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
6778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
679404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */
68046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
68146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
6828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
6838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
68646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
68746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
6888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
69146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
69246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
6938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
6948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
696404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */
69746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
69846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
6998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
701404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */
70246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
70346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
7048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
70846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
70946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
7108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
71346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
71446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
7158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
718705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/
719705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
720705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */
721705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) {
722705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
723705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef First;
724705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((First = LLVMGetFirstUse(Val))) {
725705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
726705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) First;
727705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
728705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
729705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
730705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
731705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
732705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */
733705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) {
734705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
735705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef Next;
736705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((Next = LLVMGetNextUse(U))) {
737705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
738705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) Next;
739705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
740705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
741705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
742705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
743705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
744705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
745705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) {
746705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUser(UR);
747705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
748705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
749705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
750705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) {
751705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUsedValue(UR);
752705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
753705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
7548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
7558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7564733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef,
7574733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
7584733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
7598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
76046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
76146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
7626d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
7636d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
7646d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
76557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0));
7666d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return GlobalVar;
7676d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
76846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
7698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7718e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */
7728e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name,
7738e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    value AddressSpace,
7748e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    LLVMModuleRef M) {
7758e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar;
7768e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
7778e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
7788e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar      return LLVMConstBitCast(GlobalVar,
7798e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                              LLVMPointerType(Ty, Int_val(AddressSpace)));
7808e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    return GlobalVar;
7818e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  }
7828e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return LLVMAddGlobal(M, Ty, String_val(Name));
7838e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
7848e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
7856d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
7866d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
7876d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
7886d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
7896d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
79075e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
7916d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) GlobalVar;
7926d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
7936d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
7946d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
7956d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
7966d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
7978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
79846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
79946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
80046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
8018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
8028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
80346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
8048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8068e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */
8078e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name,
8088e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMValueRef Initializer,
8098e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   value AddressSpace,
8108e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMModuleRef M) {
8118e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M,
8128e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       LLVMTypeOf(Initializer),
8138e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       String_val(Name),
8148e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       Int_val(AddressSpace));
8158e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMSetInitializer(GlobalVar, Initializer);
8168e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return GlobalVar;
8178e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
8188e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
8198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
82046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
82146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
8228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
82646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
82746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
82846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
8298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
83346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
83446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
8358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
83946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
84046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
8418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
84446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
84546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
84646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
84746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
84846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
84946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
850c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */
851c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) {
852c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_bool(LLVMIsGlobalConstant(GlobalVar));
853c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
854c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
855c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */
856c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) {
857c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag));
858c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_unit;
859c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
860c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
8616ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/
8626ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
8636ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty,
8646ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar                                     LLVMValueRef Aliasee, value Name) {
8656ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar  return LLVMAddAlias(M, Ty, Aliasee, String_val(Name));
8666ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar}
8676ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
86846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
86946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
8704733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef,
8714733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
8724733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
87346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
87446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
87546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
8766d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
8776d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
8786d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty)
87957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0));
8806d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return Fn;
8816d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
88246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
88346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
88446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
8856d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
8866d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
8876d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
8886d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
8896d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
89075e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
8916d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) Fn;
8926d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
8936d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
8946d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
8956d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
8966d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
89746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
89846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
89946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
90046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
901b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry");
90246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
90346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
90446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
90546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
90646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
90746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
90846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
90946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
91046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
91146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
91246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
91346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
91446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
91546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
91646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
91746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
91846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
91946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
92046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
92146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
92246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
92346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
92446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
92546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
92646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
92780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */
9285eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) {
9295eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  const char *GC;
93080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLparam0();
93180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLlocal2(Name, Option);
93280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
9335eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  if ((GC = LLVMGetGC(Fn))) {
9345eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    Name = copy_string(GC);
93580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
93680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Option = alloc(1, 0);
93780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Field(Option, 0) = Name;
93880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Option);
93980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  } else {
94080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Val_int(0));
94180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  }
94280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
94380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
94480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */
9455eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) {
9465eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
94780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  return Val_unit;
94880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
94980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
950e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
951e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) {
9520941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMAddFunctionAttr(Arg, Int_val(PA));
953e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
954e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
955e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
956e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
957e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) {
9580941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMRemoveFunctionAttr(Arg, Int_val(PA));
959e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
960e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
9614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/
9624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
9634733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent)
9644733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
9654733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */
9664733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
9674733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
9684733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
9694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
970e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */
971e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) {
9724733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
9734733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
9744733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Params;
9754733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
9764733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
977e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
978e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) {
9790941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMAddAttribute(Arg, Int_val(PA));
980e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
981e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
982e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
983e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */
984e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) {
9850941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMRemoveAttribute(Arg, Int_val(PA));
986e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
987e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
988e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
989e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */
990e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
991e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  LLVMSetParamAlignment(Arg, Int_val(align));
992e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
993e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
994e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
99546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
99646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
9974733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(
9984733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent)
9994733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
100046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
100146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
100246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
100346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
100446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
100546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
100646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
100746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
100846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
100946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
101046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
101146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
101246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
101346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
1014b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name,
1015b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMValueRef Fn) {
1016b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name));
101746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
101846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
101946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
1020b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name,
1021b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMBasicBlockRef BB) {
1022b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name));
102346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
102446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
102546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
102646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
102746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
102846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
102946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1030033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/
1031033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
1032033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
1033033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen                 LLVMGetInstructionParent)
1034033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
10356563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
10366563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
10376563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  LLVMOpcode o = LLVMGetInstructionOpcode(Inst);
10386563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  assert (o <= LLVMUnwind );
10396563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return Val_int(o);
10406563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
1041033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
10424917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin/* llvalue -> ICmp.t */
10434917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
104431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
104531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  int x = LLVMGetICmpPredicate(Val);
104631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (x) {
104731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    value Option = alloc(1, 0);
104831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Field(Option, 0) = Val_int(x - LLVMIntEQ);
104931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
105031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
105131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
10524917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin}
10534917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
10544917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
1055cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/
1056cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1057cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */
1058cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
1059cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_int(LLVMGetInstructionCallConv(Inst));
1060cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1061cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1062cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */
1063cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
1064cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  LLVMSetInstructionCallConv(Inst, Int_val(CC));
1065cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_unit;
1066cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1067cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1068e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */
1069e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr,
1070e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value index,
1071e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value PA) {
10720941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMAddInstrAttribute(Instr, Int_val(index), Int_val(PA));
1073e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1074e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1075e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1076e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */
1077e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr,
1078e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value index,
1079e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value PA) {
10800941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMRemoveInstrAttribute(Instr, Int_val(index), Int_val(PA));
1081e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1082e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1083e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
108407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/
108507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
108607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */
108707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
108807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_bool(LLVMIsTailCall(CallInst));
108907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
109007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
109107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */
109207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall,
109307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen                                  LLVMValueRef CallInst) {
109407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  LLVMSetTailCall(CallInst, Bool_val(IsTailCall));
109507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_unit;
109607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
109707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
10982618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/
10992618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11002618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */
11012618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
11022618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMAddIncoming(PhiNode,
11032618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMValueRef*) &Field(Incoming, 0),
11042618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMBasicBlockRef*) &Field(Incoming, 1),
11052618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  1);
11062618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return Val_unit;
11072618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
11082618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11092618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */
11102618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
11112618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  unsigned I;
11122618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLparam0();
11132618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLlocal3(Hd, Tl, Tmp);
11142618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11152618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  /* Build a tuple list of them. */
11162618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Tl = Val_int(0);
11172618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
11182618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Hd = alloc(2, 0);
11192618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
11202618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
11212618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11222618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tmp = alloc(2, 0);
11232618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 0, Hd);
11242618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 1, Tl);
11252618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tl = Tmp;
11262618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
11272618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
11282618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLreturn(Tl);
11292618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
11302618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
113146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
113246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
113346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
113446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
113546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1136a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) {
113746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
113846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
113946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
114046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
114189f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  (char *) "IRBuilder",
114246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
114346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
114446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
114546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
114646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
114746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
114846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1149a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) {
1150a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
1151a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  Builder_val(V) = B;
1152a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  return V;
1153a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1154a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
11555371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */
11565371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) {
11575371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return alloc_builder(LLVMCreateBuilderInContext(C));
1158a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1159a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
1160033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */
1161033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) {
1162033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  if (Tag_val(Pos) == 0) {
1163033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0));
1164033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderAtEnd(Builder_val(B), BB);
1165033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  } else {
1166033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0));
1167033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderBefore(Builder_val(B), I);
1168033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  }
11698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
11708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
117146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1172dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */
1173628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) {
1174dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B));
1175dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  if (!InsertBlock)
1176dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen    raise_not_found();
1177dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  return InsertBlock;
1178dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen}
1179dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen
11805c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */
1181628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) {
1182628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar  LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name));
11835c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar  return Val_unit;
11845c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar}
11855c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar
118646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/
118746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
118846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
118946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) {
119046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), V);
119146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
119246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
119346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
119446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */
119546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) {
119646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), NULL);
119746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
119846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
119946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
120046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */
120146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) {
120246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam0();
120346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef L;
120446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) {
120546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
120646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) L;
120746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
120846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
120946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
121046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
121146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
121246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
121346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) {
121446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetInstDebugLocation(Builder_val(B), V);
121546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
121646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
121746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
121846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
121946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
122046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
122146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
122246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
122346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
122446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
122546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
122646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
122746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
122846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
122946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
123046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
12316793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */
12326793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) {
12336793dd9769047706acf34420586716450344fb66Erick Tryzelaar  return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals),
12346793dd9769047706acf34420586716450344fb66Erick Tryzelaar                               Wosize_val(RetVals));
12356793dd9769047706acf34420586716450344fb66Erick Tryzelaar}
12366793dd9769047706acf34420586716450344fb66Erick Tryzelaar
123746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
123846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
123946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
124046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
124146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
124246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
124346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
124446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
124546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
124646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
124746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
124846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
124946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
125046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
125146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
125246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
125346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
125446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
125546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
125646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
125746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
12581430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
12591430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal,
126021491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen                             LLVMBasicBlockRef Dest) {
126121491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  LLVMAddCase(Switch, OnVal, Dest);
126221491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  return Val_unit;
126321491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen}
126421491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen
1265c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */
1266c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr,
1267c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value EstimatedDests,
1268c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value B) {
1269c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests);
1270c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1271c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
1272c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
1273c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr,
1274c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                    LLVMBasicBlockRef Dest) {
1275c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  LLVMAddDestination(IndirectBr, Dest);
1276c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return Val_unit;
1277c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1278c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
127946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
128046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
128146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
128246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
128346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
128446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
128546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
128646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
128746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
128846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
128946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
129046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
129146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
129246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
129346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
129446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
129546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
129646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
129746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
129848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn,
129948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value NumClauses,  value Name,
130048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value B) {
130148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses),
130248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                               String_val(Name));
130348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
130448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
130548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)
130648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{
130748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    LLVMSetCleanup(LandingPadInst, Bool_val(flag));
130848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return Val_unit;
130948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
131048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
131146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
131246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
131346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
131446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
131546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
131646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
131746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
131846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
131946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
132046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
132146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
132246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
132346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
132446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1325e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS,
1326e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1327e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name));
1328e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1329e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1330e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
133119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS,
133219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
133319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name));
133419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
133519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
133619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1337e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS,
1338e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1339e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name));
1340e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1341e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1342e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
134346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
134446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
134546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
134646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
134746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
134846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
134919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
135019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
135119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name));
135219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
135319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
135419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
135519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
135619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
135719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name));
135819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
135919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
136019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1361e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS,
1362e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1363e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name));
1364e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1365e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1366e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
136746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
136846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
136946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
137046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
137146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
137246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
137319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
137419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
137519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name));
137619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
137719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
137819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
137919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
138019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
138119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name));
138219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
138319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
138419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1385e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS,
1386e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1387e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name));
1388e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1389e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1390e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
139146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
139246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
139346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
139446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
139546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
139646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
139746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
139846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
139946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
140046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
140146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
140246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1403e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
1404e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                            value Name, value B) {
1405e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name));
1406e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1407e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1408e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
140946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
141046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
141146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
141246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
141346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
141446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
141546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
141646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
141746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
141846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
141946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
142046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
142146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
142246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
142346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
142446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
142546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
142646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
142746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
142846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
142946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
143046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
143146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
143246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
143346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
143446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
143546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
143646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
143746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
143846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
143946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
144046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
144146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
144246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
144346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
144446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
144546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
144646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
144746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
144846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
144946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
145046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
145146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
145246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
145346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
145446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
145546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
145646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
145746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
145846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
145946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
146046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
146146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
146246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
146346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
146446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
146546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
146646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
146746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
146846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
146946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
147046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
147146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
147246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
147346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
147446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
147519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X,
147619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
147719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name));
147819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
147919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
148019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
148119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X,
148219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
148319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name));
148419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
148519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
148619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
148719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X,
148819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                     value Name, value B) {
148919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildFNeg(Builder_val(B), X, String_val(Name));
149019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
149119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
149219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
149446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
149546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
149646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
149746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
149946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
150546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
150646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
150746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
150846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
150946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
151046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
151146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
151246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
151346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
151446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
151546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
151646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
151746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
152146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
152246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
152546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
152646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
152746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
152846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
152946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
153046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
153146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1532e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
1533e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer,
1534e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value Indices, value Name,
1535e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1536e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInBoundsGEP(Builder_val(B), Pointer,
1537e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              (LLVMValueRef *) Op_val(Indices),
1538e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              Wosize_val(Indices), String_val(Name));
1539e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1540e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1541e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1542e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer,
1543c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                                               value Index, value Name,
1544e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1545c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner  return LLVMBuildStructGEP(Builder_val(B), Pointer,
1546c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                              Int_val(Index), String_val(Name));
1547e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1548e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1549e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1550e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) {
1551e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalString(Builder_val(B), String_val(Str),
1552e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1553e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1554e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1555e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1556e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name,
1557e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1558e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str),
1559e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                  String_val(Name));
1560e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1561e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
156246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
156346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
156446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
156546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
156646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
156746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
156846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
156946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
157046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
157146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
157246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
157346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
157446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
157546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
157646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
157746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
157846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
157946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
158046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
158146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
158246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
158346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
158446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
158546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
158646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
158746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
158846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
158946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
159046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
159146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
159246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
159346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
159446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
159546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
159646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
159746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
159846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
159946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
160146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
160246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
160346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
160446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
160546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
160746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
160846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
160946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
161046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
161146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
161246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
161346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
161446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
161546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
161646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
161746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
161846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
161946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
162046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
162146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
162246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
162346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
162446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
162546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
162646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
162746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
162846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
162946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
163046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
163146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
163246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
163346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
163446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
163546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1636e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1637e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1638e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1639e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1640e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1641e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1642e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1643e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1644e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1645e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1646e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1647e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1648e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1649e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X,
1650e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  LLVMTypeRef Ty, value Name,
1651e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1652e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1653e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1654e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1655e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1656e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty,
1657e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1658e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name));
1659e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1660e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1661e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1662e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty,
1663e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1664e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name));
1665e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1666e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1667e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1668e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty,
1669e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                        value Name, value B) {
1670e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name));
1671e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1672e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
167346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
167446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1675404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
167646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
167746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
167846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
167946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
168046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
168146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1683404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
168446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
168546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
168646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
168746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
168846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
168946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
169046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
169246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
16932618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
16942618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
16952618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  value Hd, Tl;
16962618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMValueRef FirstValue, PhiNode;
16972618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
16982618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
16992618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17002618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Hd = Field(Incoming, 0);
17012618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  FirstValue = (LLVMValueRef) Field(Hd, 0);
17022618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
17032618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                         String_val(Name));
17042618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17052618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
17062618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    value Hd = Field(Tl, 0);
17072618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
17082618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                    (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
17092618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
17102618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
17112618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return PhiNode;
171246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
171346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
171446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
171546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
171646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
171746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
171846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
171946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
172046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
172146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
172246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
172346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
172446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
172546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
172646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
172746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
172846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
172946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
173046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
173146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
173246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
173346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
173446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
173546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
173646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
173746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
173846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
173946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
174146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
174246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
174346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
174446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
174546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
174646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
174746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
174846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
175146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
175246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
175346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
175446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
175546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
175646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1757e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1758e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate,
1759e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                              value Idx, value Name, value B) {
1760e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx),
1761e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1762e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1763e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1764e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */
1765e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate,
1766e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             LLVMValueRef Val, value Idx,
1767e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1768e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx),
1769e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              String_val(Name));
1770e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1771e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1772e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1773e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name,
1774e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value B) {
1775e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name));
1776e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1777e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1778e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1779e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name,
1780e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value B) {
1781e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name));
1782e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1783e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1784e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1785e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS,
1786e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1787e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name));
1788e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
17891ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
1790da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1791da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/
1792da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1793da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer
1794da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1795da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) {
1796da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Path);
1797da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1798da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1799da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1800da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path),
1801da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen                                               &MemBuf, &Message))
1802da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1803da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1804da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLreturn((value) MemBuf);
1805da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1806da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1807da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer
1808da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1809da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
1810da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1811da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1812da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1813da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message))
1814da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1815da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1816da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return MemBuf;
1817da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1818da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1819da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */
1820da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
1821da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMemoryBuffer(MemBuf);
1822da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
1823da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1824da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1825d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/
1826d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1827d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */
1828d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) {
1829d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return LLVMCreatePassManager();
1830d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1831d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1832d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */
1833d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M,
1834d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                           LLVMPassManagerRef PM) {
1835d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunPassManager(PM, M));
1836d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1837d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1838d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
1839d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) {
1840d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMInitializeFunctionPassManager(FPM));
1841d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1842d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1843d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */
1844d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F,
1845d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                             LLVMPassManagerRef FPM) {
1846d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunFunctionPassManager(FPM, F));
1847d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1848d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1849d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
1850d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) {
1851d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMFinalizeFunctionPassManager(FPM));
1852d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1853d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
1854d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */
1855d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) {
1856d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  LLVMDisposePassManager(PM);
1857d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_unit;
1858d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
1859