llvm_ocaml.c revision dfc58e3bcfcb8f37796b2ca1c289dd202f26d03c
1dfc58e3bcfcb8f37796b2ca1c289dd202f26d03cSylvestre Ledru/*===-- llvm_ocaml.c - LLVM OCaml Glue --------------------------*- C++ -*-===*\
28ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
38ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                     The LLVM Compiler Infrastructure                       *|
48ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
5234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* This file is distributed under the University of Illinois Open Source      *|
6234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* License. See LICENSE.TXT for details.                                      *|
78ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
88ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*===----------------------------------------------------------------------===*|
98ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
10dfc58e3bcfcb8f37796b2ca1c289dd202f26d03cSylvestre Ledru|* This file glues LLVM's OCaml interface to its C interface. These functions *|
118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* are by and large transparent wrappers to the corresponding C functions.    *|
128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* Note that these functions intentionally take liberties with the CAMLparamX *|
148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* macros, since most of the parameters are not GC heap objects.              *|
158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*                                                                            *|
168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen\*===----------------------------------------------------------------------===*/
178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "llvm-c/Core.h"
198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/alloc.h"
2046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#include "caml/custom.h"
218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/memory.h"
22da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/fail.h"
23da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/callback.h"
242618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen#include <assert.h>
25da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include <stdlib.h>
264f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin#include <string.h>
27da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
28da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
29da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Can't use the recommended caml_named_value mechanism for backwards
30da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   compatibility reasons. This is largely equivalent. */
31da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksenstatic value llvm_ioerror_exn;
32da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
33da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_register_core_exns(value IoError) {
34da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  llvm_ioerror_exn = Field(IoError, 0);
35da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  register_global_root(&llvm_ioerror_exn);
36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
38da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void llvm_raise(value Prototype, char *Message) {
40da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Prototype);
41da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLlocal1(CamlMessage);
42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CamlMessage = copy_string(Message);
44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMessage(Message);
45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  raise_with_arg(Prototype, CamlMessage);
472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  abort(); /* NOTREACHED */
48a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#ifdef CAMLnoreturn
49a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen  CAMLnoreturn; /* Silences warnings, but is missing in some versions. */
50a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#endif
51da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
534733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksenstatic value alloc_variant(int tag, void *Value) {
544733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Iter = alloc_small(1, tag);
554733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  Field(Iter, 0) = Val_op(Value);
564733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Iter;
574733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
584733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
594733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* Macro to convert the C first/next/last/prev idiom to the Ocaml llpos/
604733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen   llrev_pos idiom. */
614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen#define DEFINE_ITERATORS(camlname, cname, pty, cty, pfun) \
624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llpos */                        \
634733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_begin(pty Mom) {       \
644733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty First = LLVMGetFirst##cname(Mom);                 \
654733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (First)                                            \
664733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, First);                     \
674733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
684733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
704733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llpos */                         \
714733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_succ(cty Kid) {        \
724733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Next = LLVMGetNext##cname(Kid);                   \
734733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Next)                                             \
744733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Next);                      \
75f440691a20eff24cf59ac14e10057234ae182dbeGordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
764733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
774733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
784733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llmodule -> ('a, 'b) llrev_pos */                    \
794733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_end(pty Mom) {         \
804733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Last = LLVMGetLast##cname(Mom);                   \
814733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Last)                                             \
824733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Last);                      \
834733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, Mom);                         \
844733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }                                                       \
854733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                                                          \
864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  /* llvalue -> ('a, 'b) llrev_pos */                     \
874733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  CAMLprim value llvm_##camlname##_pred(cty Kid) {        \
884733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    cty Prev = LLVMGetPrevious##cname(Kid);               \
894733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    if (Prev)                                             \
904733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen      return alloc_variant(1, Prev);                      \
914733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen    return alloc_variant(0, pfun(Kid));                   \
924733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  }
934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
955371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/*===-- Contexts ----------------------------------------------------------===*/
965371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
975371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
985371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_create_context(value Unit) {
995371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMContextCreate();
1005371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1015371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1025371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> unit */
1035371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_dispose_context(LLVMContextRef C) {
1045371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  LLVMContextDispose(C);
1055371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return Val_unit;
1065371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1075371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1085371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */
1095371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_global_context(value Unit) {
1105371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetGlobalContext();
1115371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1125371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
11346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> int */
11446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_mdkind_id(LLVMContextRef C, value Name) {
11546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  unsigned MDKindID = LLVMGetMDKindIDInContext(C, String_val(Name),
11646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                               caml_string_length(Name));
11746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_int(MDKindID);
11846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
11946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
1208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/
1218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
122263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar/* llcontext -> string -> llmodule */
123263d989a719c1864862fc91f59193a6c2b55ca48Erick TryzelaarCAMLprim LLVMModuleRef llvm_create_module(LLVMContextRef C, value ModuleID) {
124263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar  return LLVMModuleCreateWithNameInContext(String_val(ModuleID), C);
1258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */
12846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) {
12946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeModule(M);
1308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
1318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
133a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
134a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_target_triple(LLVMModuleRef M) {
135a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetTarget(M));
136a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
137a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
138a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
139a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_target_triple(value Trip, LLVMModuleRef M) {
140a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetTarget(M, String_val(Trip));
141a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
142a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
143a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
144a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */
145a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_data_layout(LLVMModuleRef M) {
146a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return copy_string(LLVMGetDataLayout(M));
147a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
148a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
149a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */
150a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_data_layout(value Layout, LLVMModuleRef M) {
151a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  LLVMSetDataLayout(M, String_val(Layout));
152a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  return Val_unit;
153a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen}
154a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
155af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen/* llmodule -> unit */
156af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon HenriksenCAMLprim value llvm_dump_module(LLVMModuleRef M) {
157af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  LLVMDumpModule(M);
158af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  return Val_unit;
159af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen}
160af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen
1610941534c712d77243d9dda5e8c1d927563b4edffChris Lattner/* llmodule -> string -> unit */
1620941534c712d77243d9dda5e8c1d927563b4edffChris LattnerCAMLprim value llvm_set_module_inline_asm(LLVMModuleRef M, value Asm) {
1630941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  LLVMSetModuleInlineAsm(M, String_val(Asm));
1640941534c712d77243d9dda5e8c1d927563b4edffChris Lattner  return Val_unit;
1650941534c712d77243d9dda5e8c1d927563b4edffChris Lattner}
1668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
1678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/
1688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
169404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* lltype -> TypeKind.t */
17046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) {
17146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetTypeKind(Ty));
1728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
1738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
174ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok EdwinCAMLprim value llvm_type_is_sized(LLVMTypeRef Ty) {
175ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin    return Val_bool(LLVMTypeIsSized(Ty));
176ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin}
177ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin
1785371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* lltype -> llcontext */
1795371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_type_context(LLVMTypeRef Ty) {
1805371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMGetTypeContext(Ty);
1815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar}
1825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar
1838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/
1848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
185b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
186b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i1_type (LLVMContextRef Context) {
187b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt1TypeInContext(Context);
188b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
189b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
190b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
191b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i8_type (LLVMContextRef Context) {
192b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt8TypeInContext(Context);
193b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
194b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
195b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
196b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i16_type (LLVMContextRef Context) {
197b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt16TypeInContext(Context);
198b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
199b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
200b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
201b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i32_type (LLVMContextRef Context) {
202b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt32TypeInContext(Context);
203b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
204b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
205b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
206b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i64_type (LLVMContextRef Context) {
207b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInt64TypeInContext(Context);
208b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
2098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
210b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> int -> lltype */
211b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_integer_type(LLVMContextRef Context, value Width) {
212b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMIntTypeInContext(Context, Int_val(Width));
2138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
21646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) {
21746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetIntTypeWidth(IntegerTy));
2188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/
2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
222b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
223b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_float_type(LLVMContextRef Context) {
224b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFloatTypeInContext(Context);
2258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
227b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
228b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_double_type(LLVMContextRef Context) {
229b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMDoubleTypeInContext(Context);
2308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
232b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
233b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_x86fp80_type(LLVMContextRef Context) {
234b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMX86FP80TypeInContext(Context);
2358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
237b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
238b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_fp128_type(LLVMContextRef Context) {
239b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMFP128TypeInContext(Context);
2408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
242b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
243b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_ppc_fp128_type(LLVMContextRef Context) {
244b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMPPCFP128TypeInContext(Context);
2458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
247bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen/* llcontext -> lltype */
248bb811a244567aa8a1522203f15588f4d001b7353Dale JohannesenCAMLprim LLVMTypeRef llvm_x86mmx_type(LLVMContextRef Context) {
249bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen  return LLVMX86MMXTypeInContext(Context);
250bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen}
251bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen
2528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/
2538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
254957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
255957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) {
25681a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
257957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 0);
258957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
259957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
260957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */
261957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy,
262957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                                                value ParamTys) {
263957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen  return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys,
264957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen                          Wosize_val(ParamTys), 1);
2658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */
26846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) {
26946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsFunctionVarArg(FunTy));
2708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
27346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) {
27446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountParamTypes(FunTy), 0);
27546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys);
27646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
2778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/
2808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
2825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_struct_type(LLVMContextRef C, value ElementTypes) {
2835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
2845371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 0);
285957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen}
286957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen
2875371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */
2885371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C,
2895371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                             value ElementTypes) {
2905371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes,
2915371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                 Wosize_val(ElementTypes), 1);
2928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
2938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
2946b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* llcontext -> string -> lltype */
2956b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMTypeRef llvm_named_struct_type(LLVMContextRef C,
2966b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                            value Name) {
2976b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return LLVMStructCreateNamed(C, String_val(Name));
2986b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
2996b228e506f42972c003599f4873a24910f8a530aTorok Edwin
3006b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_struct_set_body(LLVMTypeRef Ty,
3016b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                    value ElementTypes,
3026b228e506f42972c003599f4873a24910f8a530aTorok Edwin                                    value Packed) {
3036b228e506f42972c003599f4873a24910f8a530aTorok Edwin  LLVMStructSetBody(Ty, (LLVMTypeRef *) ElementTypes,
3046b228e506f42972c003599f4873a24910f8a530aTorok Edwin                    Wosize_val(ElementTypes), Bool_val(Packed));
3056b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return Val_unit;
3066b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3076b228e506f42972c003599f4873a24910f8a530aTorok Edwin
308c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin/* lltype -> string option */
309c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok EdwinCAMLprim value llvm_struct_name(LLVMTypeRef Ty)
310c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin{
31131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
31231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *C = LLVMGetStructName(Ty);
31331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (C) {
31431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal1(result);
31531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    result = caml_alloc_small(1, 0);
31631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(result, 0, caml_copy_string(C));
31731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(result);
31831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
31931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
320c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin}
321c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin
3228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */
3231940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) {
32446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0);
32546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys);
32646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Tys;
3278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
32946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */
33046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) {
33146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsPackedStruct(StructTy));
3328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3346b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> bool */
3356b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_is_opaque(LLVMTypeRef StructTy) {
3366b228e506f42972c003599f4873a24910f8a530aTorok Edwin  return Val_bool(LLVMIsOpaqueStruct(StructTy));
3376b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
3386b228e506f42972c003599f4873a24910f8a530aTorok Edwin
3398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/
3408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
342957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) {
34381a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMArrayType(ElementTy, Int_val(Count));
3448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
34657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */
34757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) {
34857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, 0);
34957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
35057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
35157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */
35257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy,
35357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen                                                 value AddressSpace) {
35457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return LLVMPointerType(ElementTy, Int_val(AddressSpace));
35557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
35657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
3578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */
358957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) {
35981a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  return LLVMVectorType(ElementTy, Int_val(Count));
3608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
36346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) {
36446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetArrayLength(ArrayTy));
3658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */
36857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) {
36957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  return Val_int(LLVMGetPointerAddressSpace(PtrTy));
37057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen}
37157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
37257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */
37346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) {
37446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVectorSize(VectorTy));
3758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
3768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
3778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/
3788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
379b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
380b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) {
381b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMVoidTypeInContext(Context);
382b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
383b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar
384b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */
385b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) {
386b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMLabelTypeInContext(Context);
387b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar}
3888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
389ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_type_by_name(LLVMModuleRef M, value Name)
390ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
391ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLparam1(Name);
392ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMTypeRef Ty = LLVMGetTypeByName(M, String_val(Name));
393ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  if (Ty) {
394ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    value Option = alloc(1, 0);
395ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    Field(Option, 0) = (value) Ty;
396ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    CAMLreturn(Option);
397ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  }
398ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLreturn(Val_int(0));
399ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
400ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
4018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/
4028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */
40446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) {
40546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMTypeOf(Val);
4068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4083dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* keep in sync with ValueKind.t */
4093dd16741864302af14b31b7f75375c09d8544a35Torok Edwinenum ValueKind {
4103dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  NullValue=0,
4113dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Argument,
4123dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BasicBlock,
4133dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  InlineAsm,
4143dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDNode,
4153dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  MDString,
4163dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  BlockAddress,
4173dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantAggregateZero,
4183dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantArray,
4193dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantExpr,
4203dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantFP,
4213dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantInt,
4223dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantPointerNull,
4233dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantStruct,
4243dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  ConstantVector,
4253dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Function,
4263dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalAlias,
4273dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  GlobalVariable,
4283dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  UndefValue,
4293dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  Instruction
4303dd16741864302af14b31b7f75375c09d8544a35Torok Edwin};
4313dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4323dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* llvalue -> ValueKind.t */
4333dd16741864302af14b31b7f75375c09d8544a35Torok Edwin#define DEFINE_CASE(Val, Kind) \
4343dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    do {if (LLVMIsA##Kind(Val)) CAMLreturn(Val_int(Kind));} while(0)
4353dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4363dd16741864302af14b31b7f75375c09d8544a35Torok EdwinCAMLprim value llvm_classify_value(LLVMValueRef Val) {
4373dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  CAMLparam0();
4383dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!Val)
4393dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(Val_int(NullValue));
4403dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAConstant(Val)) {
4413dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, BlockAddress);
4423dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantAggregateZero);
4433dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantArray);
4443dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantExpr);
4453dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantFP);
4463dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantInt);
4473dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantPointerNull);
4483dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantStruct);
4493dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, ConstantVector);
4503dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4513dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAInstruction(Val)) {
4523dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLlocal1(result);
4533dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    result = caml_alloc_small(1, 0);
4543dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val)));
4553dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    CAMLreturn(result);
4563dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4573dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (LLVMIsAGlobalValue(Val)) {
4583dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, Function);
4593dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalAlias);
4603dd16741864302af14b31b7f75375c09d8544a35Torok Edwin    DEFINE_CASE(Val, GlobalVariable);
4613dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  }
4623dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, Argument);
4633dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, BasicBlock);
4643dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, InlineAsm);
4653dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDNode);
4663dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, MDString);
4673dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  DEFINE_CASE(Val, UndefValue);
4683dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  failwith("Unknown Value class");
4693dd16741864302af14b31b7f75375c09d8544a35Torok Edwin}
4703dd16741864302af14b31b7f75375c09d8544a35Torok Edwin
4718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
47246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) {
47346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetValueName(Val));
4748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
4768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
47746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) {
47846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetValueName(Val, String_val(Name));
4798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
4808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
4818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
48288cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */
48388cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) {
48488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  LLVMDumpValue(Val);
48588cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen  return Val_unit;
48688cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen}
48788cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen
488b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/
489b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
490b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */
491b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) {
492b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar  return LLVMGetOperand(V, Int_val(I));
493b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar}
494b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
495f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
496f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) {
497f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  LLVMSetOperand(U, Int_val(I), V);
498f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_unit;
499f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
500f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
501f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */
502f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) {
503f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_int(LLVMGetNumOperands(V));
504f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
505f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
5068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
5078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
50946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
51046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
511344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
512344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
513344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
51446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
51546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
5168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
518344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
51946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
52046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
521344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
522344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
5236563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
5246563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) {
5256563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return LLVMIsAConstantExpr(Val) ?
5266563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      Val_int(LLVMGetConstOpcode(Val)) : Val_int(0);
5276563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
5286563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
52946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/
53046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
53146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */
53246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) {
53346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_bool(LLVMHasMetadata(Val));
53446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
53546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
53646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */
53746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) {
53846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam1(MDKindID);
53946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef MD;
54046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) {
54146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
54246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) MD;
54346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
54446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
54546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
54646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
54746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
54846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
54946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID,
55046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                 LLVMValueRef MD) {
55146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), MD);
55246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
55346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
55446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
55546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */
55646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) {
55746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), NULL);
55846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
55946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
56046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
56146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
56246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/
56346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
56446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */
56546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) {
56646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDStringInContext(C, String_val(S), caml_string_length(S));
56746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
56846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
56946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */
57046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) {
57146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals),
57246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                             Wosize_val(ElementVals));
57346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
57446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
5754f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */
5764f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) {
57731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
57831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *S;
57931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  unsigned Len;
58031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
58131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if ((S = LLVMGetMDString(V, &Len))) {
58231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal2(Option, Str);
58331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
58431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Str = caml_alloc_string(Len);
58531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    memcpy(String_val(Str), S, Len);
58631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Option = alloc(1,0);
58731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(Option, 0, Str);
58831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
58931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
59031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
5914f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
5924f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin
5934f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value name)
5944f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{
5954f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLparam1(name);
5964f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLlocal1(Nodes);
5974f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(name)), 0);
5984f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  LLVMGetNamedMetadataOperands(M, String_val(name), (LLVMValueRef *) Nodes);
5994f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLreturn(Nodes);
6004f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
6018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
6028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
603e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */
604e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) {
605e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, (long long) Int_val(N), 1);
6068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
608344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
609e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
610e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                                          value SExt) {
611e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
612344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
613344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
6146563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */
6156563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const)
6166563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{
6176563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLparam0();
6186563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  if (LLVMIsAConstantInt(Const) &&
6196563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) {
6206563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    value Option = alloc(1, 0);
6216563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const));
6226563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    CAMLreturn(Option);
6236563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  }
6246563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLreturn(Val_int(0));
6256563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
6266563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
62745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */
62845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
62945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                               value Radix) {
63045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S),
63145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                     Int_val(Radix));
63245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
63345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
635e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) {
636e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstReal(RealTy, Double_val(N));
6378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
63945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */
64045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) {
64145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstRealOfStringAndSize(RealTy, String_val(S),
64245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                      caml_string_length(S));
64345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
64445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
6468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
647b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
648b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str,
649b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                        value NullTerminate) {
650b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
651b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  1);
652e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
653e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
654b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
655b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str,
656b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                         value NullTerminate) {
657b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
658b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  0);
6598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
662e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy,
66346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
664e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
665e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                        Wosize_val(ElementVals));
666e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
667e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
6685371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
6695371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) {
6705371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
6715371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 0);
6728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6746b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> llvalue array -> llvalue */
6756b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMValueRef llvm_const_named_struct(LLVMTypeRef Ty, value ElementVals) {
6766b228e506f42972c003599f4873a24910f8a530aTorok Edwin    return LLVMConstNamedStruct(Ty, (LLVMValueRef *) Op_val(ElementVals),  Wosize_val(ElementVals));
6776b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
6786b228e506f42972c003599f4873a24910f8a530aTorok Edwin
6795371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
6805371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C,
6815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                               value ElementVals) {
6825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
6835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 1);
6848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
687e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
688e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals),
689e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals));
6904647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6914647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
6924647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/
6934647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
694404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */
6954647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred,
6964647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
6974647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
6984647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant);
6994647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7004647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
701404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */
7024647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred,
7034647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
7044647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
7054647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant);
7064647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7074647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
7084647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */
7094647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) {
7104647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7114647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                      Wosize_val(Indices));
7128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7141b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */
7151b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal,
7161b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                               value Indices) {
7171b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7181b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                              Wosize_val(Indices));
7191b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7201b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7211b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */
7221b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate,
7231b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                              value Indices) {
7241b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7251b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
7261b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
7271b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
7281b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7291b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
7301b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
7311b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
7321b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
7331b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7341b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstExtractValue(Aggregate, idxs, size);
7351b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
7361b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
7371b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7381b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7391b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */
7401b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate,
7411b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                             LLVMValueRef Val, value Indices) {
7421b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7431b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
7441b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
7451b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
7461b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7471b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
7481b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
7491b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
7501b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
7511b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7521b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstInsertValue(Aggregate, Val, idxs, size);
7531b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
7541b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
7551b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7561b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
757ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */
758ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm,
759ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value Constraints, value HasSideEffects,
760ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value IsAlignStack) {
761ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar  return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints),
762ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                            Bool_val(HasSideEffects), Bool_val(IsAlignStack));
763ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar}
764ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar
7658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
7668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
76846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
76946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
7708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
772404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */
77346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
77446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
7758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
777404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */
77846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
77946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
7808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
78446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
78546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
7868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
78946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
79046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
7918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
794404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */
79546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
79646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
7978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
799404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */
80046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
80146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
8028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
80646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
80746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
8088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
81146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
81246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
8138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
816705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/
817705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
818705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */
819705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) {
820705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
821705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef First;
822705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((First = LLVMGetFirstUse(Val))) {
823705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
824705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) First;
825705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
826705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
827705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
828705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
829705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
830705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */
831705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) {
832705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
833705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef Next;
834705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((Next = LLVMGetNextUse(U))) {
835705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
836705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) Next;
837705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
838705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
839705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
840705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
841705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
842705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
843705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) {
844705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUser(UR);
845705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
846705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
847705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
848705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) {
849705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUsedValue(UR);
850705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
851705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
8528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
8538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8544733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef,
8554733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
8564733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
8578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
85846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
85946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
8606d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
8616d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
8626d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
86357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0));
8646d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return GlobalVar;
8656d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
86646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
8678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8698e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */
8708e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name,
8718e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    value AddressSpace,
8728e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    LLVMModuleRef M) {
8738e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar;
8748e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
8758e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
8768e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar      return LLVMConstBitCast(GlobalVar,
8778e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                              LLVMPointerType(Ty, Int_val(AddressSpace)));
8788e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    return GlobalVar;
8798e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  }
8808e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return LLVMAddGlobal(M, Ty, String_val(Name));
8818e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
8828e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
8836d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
8846d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
8856d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
8866d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
8876d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
88875e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
8896d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) GlobalVar;
8906d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
8916d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
8926d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
8936d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
8946d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
8958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
89646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
89746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
89846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
8998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
9008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
90146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
9028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9048e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */
9058e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name,
9068e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMValueRef Initializer,
9078e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   value AddressSpace,
9088e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMModuleRef M) {
9098e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M,
9108e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       LLVMTypeOf(Initializer),
9118e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       String_val(Name),
9128e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       Int_val(AddressSpace));
9138e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMSetInitializer(GlobalVar, Initializer);
9148e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return GlobalVar;
9158e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
9168e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
9178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
91846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
91946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
9208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
92446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
92546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
92646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
9278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
93146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
93246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
9338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
93746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
93846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
9398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
94246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
94346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
94446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
94546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
94646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
94746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
948c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */
949c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) {
950c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_bool(LLVMIsGlobalConstant(GlobalVar));
951c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
952c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
953c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */
954c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) {
955c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag));
956c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_unit;
957c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
958c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
9596ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/
9606ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
9616ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty,
9626ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar                                     LLVMValueRef Aliasee, value Name) {
9636ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar  return LLVMAddAlias(M, Ty, Aliasee, String_val(Name));
9646ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar}
9656ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
96646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
96746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
9684733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef,
9694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
9704733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
97146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
97246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
97346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
9746d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
9756d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
9766d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty)
97757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0));
9786d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return Fn;
9796d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
98046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
98146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
98246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
9836d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
9846d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
9856d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
9866d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
9876d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
98875e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
9896d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) Fn;
9906d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
9916d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
9926d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
9936d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
9946d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
99546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
99646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
99746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
99846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
999b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry");
100046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
100146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
100246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
100346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
100446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
100546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
100646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
100746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
100846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
100946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
101046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
101146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
101246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
101346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
101446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
101546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
101646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
101746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
101846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
101946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
102046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
102146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
102246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
102346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
102446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
102580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */
10265eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) {
10275eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  const char *GC;
102880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLparam0();
102980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLlocal2(Name, Option);
103080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
10315eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  if ((GC = LLVMGetGC(Fn))) {
10325eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    Name = copy_string(GC);
103380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
103480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Option = alloc(1, 0);
103580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Field(Option, 0) = Name;
103680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Option);
103780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  } else {
103880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Val_int(0));
103980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  }
104080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
104180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
104280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */
10435eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) {
10445eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
104580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  return Val_unit;
104680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
104780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
10480be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1049e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) {
10500be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddFunctionAttr(Arg, Int32_val(PA));
1051e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1052e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1053e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
10540be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 */
10550be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_function_attr(LLVMValueRef Fn)
10560be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
10570be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
10580be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetFunctionAttr(Fn)));
10590be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
10600be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
10610be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1062e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) {
10630be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveFunctionAttr(Arg, Int32_val(PA));
1064e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1065e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
10664733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/
10674733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10684733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent)
10694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10704733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */
10714733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
10724733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
10734733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
10744733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10750be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int */
10760be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_param_attr(LLVMValueRef Param)
10770be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
10780be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
10790be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetAttribute(Param)));
10800be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
10810be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
1082e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */
1083e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) {
10844733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
10854733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
10864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Params;
10874733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
10884733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10890be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1090e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) {
10910be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddAttribute(Arg, Int32_val(PA));
1092e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1093e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1094e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
10950be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1096e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) {
10970be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveAttribute(Arg, Int32_val(PA));
1098e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1099e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1100e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1101e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */
1102e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
1103e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  LLVMSetParamAlignment(Arg, Int_val(align));
1104e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1105e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1106e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
110746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
110846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
11094733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(
11104733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent)
11114733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1112ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llbasicblock -> llvalue option */
1113ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_block_terminator(LLVMBasicBlockRef Block)
1114ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1115ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLparam0();
1116ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMValueRef Term = LLVMGetBasicBlockTerminator(Block);
1117ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  if (Term) {
1118ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    value Option = alloc(1, 0);
1119ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    Field(Option, 0) = (value) Term;
1120ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    CAMLreturn(Option);
1121ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  }
1122ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLreturn(Val_int(0));
1123ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1124ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
112546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
112646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
112746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
112846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
112946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
113046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
113146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
113246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
113346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
113446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
113546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
113646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
113746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
113846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
1139b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name,
1140b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMValueRef Fn) {
1141b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name));
114246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
114346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
114446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
1145b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name,
1146b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMBasicBlockRef BB) {
1147b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name));
114846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
114946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
115046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
115146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
115246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
115346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
115446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1155033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/
1156033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
1157033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
1158033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen                 LLVMGetInstructionParent)
1159033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
11606563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
11616563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
11623dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  LLVMOpcode o;
11633dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!LLVMIsAInstruction(Inst))
11643dd16741864302af14b31b7f75375c09d8544a35Torok Edwin      failwith("Not an instruction");
11653dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  o = LLVMGetInstructionOpcode(Inst);
1166efde86753d6f324ac9d0b42e48fd3ebf40c17905Benjamin Kramer  assert (o <= LLVMLandingPad);
11676563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return Val_int(o);
11686563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
1169033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
11704917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin/* llvalue -> ICmp.t */
11714917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
117231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
117331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  int x = LLVMGetICmpPredicate(Val);
117431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (x) {
117531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    value Option = alloc(1, 0);
117631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Field(Option, 0) = Val_int(x - LLVMIntEQ);
117731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
117831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
117931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
11804917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin}
11814917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
11824917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
1183cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/
1184cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1185cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */
1186cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
1187cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_int(LLVMGetInstructionCallConv(Inst));
1188cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1189cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1190cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */
1191cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
1192cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  LLVMSetInstructionCallConv(Inst, Int_val(CC));
1193cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_unit;
1194cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1195cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
11960be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1197e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr,
1198e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value index,
1199e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value PA) {
12000be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1201e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1202e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1203e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
12040be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1205e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr,
1206e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value index,
1207e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value PA) {
12080be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1209e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1210e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1211e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
121207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/
121307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
121407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */
121507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
121607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_bool(LLVMIsTailCall(CallInst));
121707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
121807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
121907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */
122007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall,
122107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen                                  LLVMValueRef CallInst) {
122207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  LLVMSetTailCall(CallInst, Bool_val(IsTailCall));
122307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_unit;
122407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
122507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
12262618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/
12272618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12282618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */
12292618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
12302618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMAddIncoming(PhiNode,
12312618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMValueRef*) &Field(Incoming, 0),
12322618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMBasicBlockRef*) &Field(Incoming, 1),
12332618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  1);
12342618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return Val_unit;
12352618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
12362618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12372618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */
12382618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
12392618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  unsigned I;
12402618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLparam0();
12412618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLlocal3(Hd, Tl, Tmp);
12422618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12432618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  /* Build a tuple list of them. */
12442618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Tl = Val_int(0);
12452618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
12462618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Hd = alloc(2, 0);
12472618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
12482618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
12492618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12502618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tmp = alloc(2, 0);
12512618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 0, Hd);
12522618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 1, Tl);
12532618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tl = Tmp;
12542618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
12552618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12562618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLreturn(Tl);
12572618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
12582618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
1259ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> unit */
1260ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_delete_instruction(LLVMValueRef Instruction) {
1261ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMInstructionEraseFromParent(Instruction);
1262ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return Val_unit;
1263ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
126446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
126546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
126646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
126746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
126846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1269a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) {
127046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
127146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
127246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
127346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
127489f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  (char *) "IRBuilder",
127546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
127646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
127746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
127846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
127946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
12804d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#ifdef custom_compare_ext_default
12814d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes  , custom_compare_ext_default
12824d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#endif
128346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
128446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1285a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) {
1286a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
1287a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  Builder_val(V) = B;
1288a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  return V;
1289a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1290a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
12915371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */
12925371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) {
12935371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return alloc_builder(LLVMCreateBuilderInContext(C));
1294a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1295a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
1296033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */
1297033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) {
1298033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  if (Tag_val(Pos) == 0) {
1299033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0));
1300033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderAtEnd(Builder_val(B), BB);
1301033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  } else {
1302033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0));
1303033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderBefore(Builder_val(B), I);
1304033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  }
13058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
13068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
130746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1308dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */
1309628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) {
1310dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B));
1311dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  if (!InsertBlock)
1312dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen    raise_not_found();
1313dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  return InsertBlock;
1314dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen}
1315dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen
13165c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */
1317628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) {
1318628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar  LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name));
13195c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar  return Val_unit;
13205c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar}
13215c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar
132246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/
132346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
132446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
132546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) {
132646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), V);
132746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
132846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
132946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
133046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */
133146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) {
133246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), NULL);
133346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
133446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
133546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
133646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */
133746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) {
133846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam0();
133946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef L;
134046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) {
134146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
134246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) L;
134346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
134446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
134546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
134646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
134746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
134846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
134946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) {
135046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetInstDebugLocation(Builder_val(B), V);
135146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
135246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
135346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
135446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
135546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
135646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
135746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
135846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
135946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
136046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
136146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
136246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
136346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
136446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
136546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
136646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
13676793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */
13686793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) {
13696793dd9769047706acf34420586716450344fb66Erick Tryzelaar  return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals),
13706793dd9769047706acf34420586716450344fb66Erick Tryzelaar                               Wosize_val(RetVals));
13716793dd9769047706acf34420586716450344fb66Erick Tryzelaar}
13726793dd9769047706acf34420586716450344fb66Erick Tryzelaar
137346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
137446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
137546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
137646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
137746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
137846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
137946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
138046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
138146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
138246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
138346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
138446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
138546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
138646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
138746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
138846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
138946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
139046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
139146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
139246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
139346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1394ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> string -> llbuilder -> llvalue */
1395ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_malloc(LLVMTypeRef Ty, value Name,
1396ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                        value B)
1397ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1398ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildMalloc(Builder_val(B), Ty, String_val(Name));
1399ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1400ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1401ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> string -> llbuilder -> llvalue */
1402ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_array_malloc(LLVMTypeRef Ty,
1403ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              LLVMValueRef Val,
1404ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              value Name, value B)
1405ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1406ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildArrayMalloc(Builder_val(B), Ty, Val, String_val(Name));
1407ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1408ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1409ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1410ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_free(LLVMValueRef P, value B)
1411ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1412ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildFree(Builder_val(B), P);
1413ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1414ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
14151430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
14161430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal,
141721491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen                             LLVMBasicBlockRef Dest) {
141821491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  LLVMAddCase(Switch, OnVal, Dest);
141921491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  return Val_unit;
142021491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen}
142121491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen
1422c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */
1423c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr,
1424c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value EstimatedDests,
1425c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value B) {
1426c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests);
1427c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1428c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
1429c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
1430c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr,
1431c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                    LLVMBasicBlockRef Dest) {
1432c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  LLVMAddDestination(IndirectBr, Dest);
1433c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return Val_unit;
1434c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1435c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
143646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
143746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
143846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
143946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
144046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
144146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
144246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
144346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
144446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
144546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
144646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
144746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
144846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
144946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
145046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
145146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
145246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
145346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
145446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1455ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> int -> string -> llbuilder -> llvalue */
145648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn,
145748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value NumClauses,  value Name,
145848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value B) {
145948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses),
146048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                               String_val(Name));
146148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
146248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1463ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llvalue -> unit */
1464ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_add_clause(LLVMValueRef LandingPadInst, LLVMValueRef ClauseVal)
1465ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1466ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    LLVMAddClause(LandingPadInst, ClauseVal);
1467ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return Val_unit;
1468ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1469ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1470ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1471ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> bool -> unit */
147248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)
147348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{
147448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    LLVMSetCleanup(LandingPadInst, Bool_val(flag));
147548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return Val_unit;
147648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
147748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1478ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1479ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_resume(LLVMValueRef Exn, value B)
1480ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1481ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return LLVMBuildResume(Builder_val(B), Exn);
1482ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1483ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
148446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
148546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
148646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
148746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
148846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
148946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
149046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
149246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
149446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
149546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
149646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1498e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS,
1499e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1500e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name));
1501e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1502e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1503e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
150419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS,
150519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
150619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name));
150719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
150819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
150919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1510e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS,
1511e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1512e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name));
1513e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1514e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1515e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
151646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
151746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
152219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
152319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
152419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name));
152519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
152619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
152719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
152819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
152919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
153019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name));
153119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
153219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
153319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1534e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS,
1535e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1536e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name));
1537e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1538e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1539e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
154046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
154146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
154246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
154346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
154446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
154546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
154619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
154719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
154819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name));
154919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
155019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
155119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
155219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
155319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
155419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name));
155519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
155619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
155719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1558e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS,
1559e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1560e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name));
1561e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1562e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1563e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
156446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
156546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
156646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
156746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
156846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
156946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
157046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
157146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
157246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
157346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
157446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
157546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1576e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
1577e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                            value Name, value B) {
1578e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name));
1579e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1580e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1581e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
158246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
158346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
158446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
158546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
158646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
158746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
158846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
158946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
159046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
159146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
159246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
159346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
159446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
159546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
159646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
159746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
159846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
159946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
160046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
160146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
160246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
160346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
160446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
160646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
160746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
160846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
160946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
161046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
161146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
161246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
161346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
161446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
161546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
161646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
161746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
161846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
161946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
162046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
162146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
162246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
162346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
162446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
162546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
162646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
162746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
162846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
162946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
163046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
163146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
163246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
163346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
163446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
163546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
163646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
163746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
163846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
163946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
164046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
164146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
164246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
164346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
164446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
164546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
164646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
164746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
164819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X,
164919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
165019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name));
165119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
165219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
165319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
165419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X,
165519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
165619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name));
165719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
165819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
165919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
166019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X,
166119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                     value Name, value B) {
166219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildFNeg(Builder_val(B), X, String_val(Name));
166319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
166419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
166519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
166646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
166746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
166846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
166946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
167046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
167146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
167246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
167346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
167446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
167546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
167646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
167746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
167846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
167946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
168046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
168146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
168246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
168346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
168546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
168646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
168746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
168846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
168946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
169046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
169246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
169346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
169446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
169546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
169646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
169846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
169946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
170046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
170146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
170246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
170346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
170446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1705e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
1706e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer,
1707e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value Indices, value Name,
1708e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1709e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInBoundsGEP(Builder_val(B), Pointer,
1710e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              (LLVMValueRef *) Op_val(Indices),
1711e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              Wosize_val(Indices), String_val(Name));
1712e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1713e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1714e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1715e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer,
1716c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                                               value Index, value Name,
1717e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1718c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner  return LLVMBuildStructGEP(Builder_val(B), Pointer,
1719c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                              Int_val(Index), String_val(Name));
1720e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1721e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1722e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1723e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) {
1724e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalString(Builder_val(B), String_val(Str),
1725e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1726e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1727e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1728e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1729e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name,
1730e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1731e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str),
1732e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                  String_val(Name));
1733e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1734e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
173546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
173646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
173746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
173846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
173946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
174046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
174146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
174346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
174446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
174546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
174646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
174746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
174946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
175046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
175146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
175246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
175346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
175446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
175646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
175746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
175846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
175946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
176046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
176146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
176246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
176346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
176446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
176546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
176646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
176746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
176846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
176946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
177046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
177146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
177346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
177446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
177546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
177646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
177746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
177946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
178046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
178146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
178246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
178346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
178446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
178646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
178746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
178846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
178946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
179146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
179246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
179346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
179446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
179546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
179746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
179846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
179946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
180046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
180146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
180346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
180446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
180546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
180646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
180746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1809e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1810e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1811e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1812e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1813e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1814e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1815e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1816e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1817e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1818e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1819e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1820e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1821e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1822e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X,
1823e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  LLVMTypeRef Ty, value Name,
1824e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1825e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1826e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1827e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1828e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1829e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty,
1830e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1831e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name));
1832e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1833e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1834e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1835e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty,
1836e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1837e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name));
1838e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1839e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1840e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1841e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty,
1842e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                        value Name, value B) {
1843e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name));
1844e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1845e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
184646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
184746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1848404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
184946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
185046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
185146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
185246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
185346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
185446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
185546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1856404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
185746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
185846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
185946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
186046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
186146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
186246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
186346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
186446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
186546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
18662618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
18672618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
18682618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  value Hd, Tl;
18692618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMValueRef FirstValue, PhiNode;
18702618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
18712618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
18722618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
18732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Hd = Field(Incoming, 0);
18742618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  FirstValue = (LLVMValueRef) Field(Hd, 0);
18752618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
18762618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                         String_val(Name));
18772618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
18782618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
18792618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    value Hd = Field(Tl, 0);
18802618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
18812618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                    (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
18822618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
18832618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
18842618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return PhiNode;
188546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
188646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
188746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
188846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
188946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
189046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
189146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
189246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
189346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
189446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
189546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
189646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
189746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
189846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
189946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
190046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
190146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
190246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
190346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
190446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
190546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
190646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
190746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
190846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
190946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
191046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
191146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
191246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
191346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
191446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
191546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
191646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
191746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
191846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
191946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
192046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
192146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
192346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
192446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
192546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
192646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
192746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
192846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1930e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1931e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate,
1932e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                              value Idx, value Name, value B) {
1933e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx),
1934e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1935e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1936e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1937e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */
1938e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate,
1939e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             LLVMValueRef Val, value Idx,
1940e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1941e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx),
1942e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              String_val(Name));
1943e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1944e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1945e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1946e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name,
1947e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value B) {
1948e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name));
1949e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1950e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1951e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1952e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name,
1953e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value B) {
1954e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name));
1955e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1956e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1957e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1958e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS,
1959e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1960e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name));
1961e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
19621ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
1963da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1964da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/
1965da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1966da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer
1967da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1968da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) {
1969da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Path);
1970da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1971da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1972da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1973da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path),
1974da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen                                               &MemBuf, &Message))
1975da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1976da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1977da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLreturn((value) MemBuf);
1978da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1979da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1980da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer
1981da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1982da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
1983da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1984da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1985da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1986da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message))
1987da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1988da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1989da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return MemBuf;
1990da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1991da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1992da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */
1993da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
1994da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMemoryBuffer(MemBuf);
1995da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
1996da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1997da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1998d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/
1999d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2000d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */
2001d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) {
2002d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return LLVMCreatePassManager();
2003d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2004d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2005d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */
2006d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M,
2007d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                           LLVMPassManagerRef PM) {
2008d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunPassManager(PM, M));
2009d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2010d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2011d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2012d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) {
2013d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMInitializeFunctionPassManager(FPM));
2014d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2015d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2016d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */
2017d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F,
2018d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                             LLVMPassManagerRef FPM) {
2019d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunFunctionPassManager(FPM, F));
2020d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2021d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2022d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2023d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) {
2024d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMFinalizeFunctionPassManager(FPM));
2025d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2026d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2027d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */
2028d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) {
2029d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  LLVMDisposePassManager(PM);
2030d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_unit;
2031d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2032