llvm_ocaml.c revision e5de63c7de04c81d7d8484e5b64f47941143c739
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
48888d74c3093de563408ceb834d999613038195e98Peter Zotov/* llvalue -> llvalue -> unit */
48988d74c3093de563408ceb834d999613038195e98Peter ZotovCAMLprim value llvm_replace_all_uses_with(LLVMValueRef OldVal,
49088d74c3093de563408ceb834d999613038195e98Peter Zotov                                          LLVMValueRef NewVal) {
49188d74c3093de563408ceb834d999613038195e98Peter Zotov  LLVMReplaceAllUsesWith(OldVal, NewVal);
49288d74c3093de563408ceb834d999613038195e98Peter Zotov  return Val_unit;
49388d74c3093de563408ceb834d999613038195e98Peter Zotov}
49488d74c3093de563408ceb834d999613038195e98Peter Zotov
495b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/
496b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
497b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */
498b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) {
499b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar  return LLVMGetOperand(V, Int_val(I));
500b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar}
501b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar
502f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
503f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) {
504f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  LLVMSetOperand(U, Int_val(I), V);
505f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_unit;
506f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
507f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
508f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */
509f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) {
510f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar  return Val_int(LLVMGetNumOperands(V));
511f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar}
512f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar
5138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/
5148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
5158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
51646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) {
51746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsConstant(Val));
518344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
519344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
520344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
52146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) {
52246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsNull(Val));
5238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
5248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
525344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */
52646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) {
52746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsUndef(Val));
528344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
529344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
5306563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
5316563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) {
5326563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return LLVMIsAConstantExpr(Val) ?
5336563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      Val_int(LLVMGetConstOpcode(Val)) : Val_int(0);
5346563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
5356563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
53646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/
53746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
53846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */
53946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) {
54046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_bool(LLVMHasMetadata(Val));
54146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
54246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
54346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */
54446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) {
54546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam1(MDKindID);
54646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef MD;
54746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) {
54846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
54946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) MD;
55046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
55146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
55246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
55346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
55446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
55546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */
55646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID,
55746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                                 LLVMValueRef MD) {
55846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), MD);
55946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
56046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
56146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
56246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */
56346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) {
56446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetMetadata(Val, Int_val(MDKindID), NULL);
56546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
56646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
56746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
56846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
56946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/
57046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
57146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */
57246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) {
57346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDStringInContext(C, String_val(S), caml_string_length(S));
57446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
57546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
57646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */
57746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) {
57846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals),
57946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar                             Wosize_val(ElementVals));
58046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
58146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
5824f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */
5834f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) {
58431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
58531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  const char *S;
58631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  unsigned Len;
58731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
58831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if ((S = LLVMGetMDString(V, &Len))) {
58931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLlocal2(Option, Str);
59031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin
59131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Str = caml_alloc_string(Len);
59231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    memcpy(String_val(Str), S, Len);
59331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Option = alloc(1,0);
59431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Store_field(Option, 0, Str);
59531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
59631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
59731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
5984f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
5994f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin
600e5de63c7de04c81d7d8484e5b64f47941143c739Peter ZotovCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value Name)
6014f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{
602e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  CAMLparam1(Name);
6034f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLlocal1(Nodes);
604e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(Name)), 0);
605e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov  LLVMGetNamedMetadataOperands(M, String_val(Name), (LLVMValueRef *) Nodes);
6064f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin  CAMLreturn(Nodes);
6074f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin}
6088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/
6098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
610e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */
611e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) {
612e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, (long long) Int_val(N), 1);
6138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
615344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */
616e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N,
617e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                                          value SExt) {
618e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt));
619344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen}
620344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
6216563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */
6226563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const)
6236563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{
6246563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLparam0();
6256563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  if (LLVMIsAConstantInt(Const) &&
6266563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin      LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) {
6276563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    value Option = alloc(1, 0);
6286563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const));
6296563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin    CAMLreturn(Option);
6306563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  }
6316563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  CAMLreturn(Val_int(0));
6326563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
6336563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin
63445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */
63545d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S,
63645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                               value Radix) {
63745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S),
63845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                     Int_val(Radix));
63945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
64045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */
642e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) {
643e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstReal(RealTy, Double_val(N));
6448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
64645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */
64745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) {
64845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar  return LLVMConstRealOfStringAndSize(RealTy, String_val(S),
64945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar                                      caml_string_length(S));
65045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar}
65145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar
6528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/
6538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
654b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
655b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str,
656b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                        value NullTerminate) {
657b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
658b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  1);
659e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
660e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
661b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */
662b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str,
663b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                         value NullTerminate) {
664b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMConstStringInContext(Context, String_val(Str), string_length(Str),
665b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                  0);
6668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */
669e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy,
67046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value ElementVals) {
671e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals),
672e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                        Wosize_val(ElementVals));
673e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen}
674e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
6755371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
6765371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) {
6775371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
6785371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 0);
6798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6816b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> llvalue array -> llvalue */
6826b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMValueRef llvm_const_named_struct(LLVMTypeRef Ty, value ElementVals) {
6836b228e506f42972c003599f4873a24910f8a530aTorok Edwin    return LLVMConstNamedStruct(Ty, (LLVMValueRef *) Op_val(ElementVals),  Wosize_val(ElementVals));
6846b228e506f42972c003599f4873a24910f8a530aTorok Edwin}
6856b228e506f42972c003599f4873a24910f8a530aTorok Edwin
6865371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */
6875371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C,
6885371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                               value ElementVals) {
6895371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals),
6905371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar                                  Wosize_val(ElementVals), 1);
6918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
6928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
6938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */
694e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
695e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals),
696e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen                         Wosize_val(ElementVals));
6974647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
6984647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
6994647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/
7004647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
701404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */
7024647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred,
7034647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
7044647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
7054647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant);
7064647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7074647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
708404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */
7094647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred,
7104647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef LHSConstant,
7114647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                      LLVMValueRef RHSConstant) {
7124647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant);
7134647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
7144647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
7154647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */
7164647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) {
7174647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7184647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                      Wosize_val(Indices));
7198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7211b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */
7221b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal,
7231b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                               value Indices) {
7241b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices),
7251b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                              Wosize_val(Indices));
7261b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7271b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7281b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */
7291b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate,
7301b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                              value Indices) {
7311b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7321b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
7331b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
7341b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
7351b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7361b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
7371b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
7381b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
7391b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
7401b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7411b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstExtractValue(Aggregate, idxs, size);
7421b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
7431b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
7441b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7451b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7461b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */
7471b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate,
7481b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar                                             LLVMValueRef Val, value Indices) {
7491b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLparam1(Indices);
7501b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int size = Wosize_val(Indices);
7511b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  int i;
7521b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  LLVMValueRef result;
7531b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7541b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned));
7551b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  for (i = 0; i < size; i++) {
7561b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar    idxs[i] = Int_val(Field(Indices, i));
7571b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  }
7581b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
7591b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  result = LLVMConstInsertValue(Aggregate, Val, idxs, size);
7601b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  free(idxs);
7611b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar  CAMLreturnT(LLVMValueRef, result);
7621b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar}
7631b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar
764ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */
765ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm,
766ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value Constraints, value HasSideEffects,
767ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                                     value IsAlignStack) {
768ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar  return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints),
769ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar                            Bool_val(HasSideEffects), Bool_val(IsAlignStack));
770ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar}
771ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar
7728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/
7738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
77546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) {
77646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsDeclaration(Global));
7778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
779404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */
78046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) {
78146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetLinkage(Global));
7828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
784404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */
78546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) {
78646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetLinkage(Global, Int_val(Linkage));
7878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */
79146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) {
79246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return copy_string(LLVMGetSection(Global));
7938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
7948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
7958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */
79646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) {
79746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetSection(Global, String_val(Section));
7988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
7998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
801404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */
80246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) {
80346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetVisibility(Global));
8048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
806404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */
80746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) {
80846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetVisibility(Global, Int_val(Viz));
8098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */
81346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) {
81446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetAlignment(Global));
8158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */
81846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) {
81946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetAlignment(Global, Int_val(Bytes));
8208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
8218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
823705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/
824705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
825705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */
826705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) {
827705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
828705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef First;
829705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((First = LLVMGetFirstUse(Val))) {
830705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
831705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) First;
832705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
833705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
834705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
835705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
836705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
837705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */
838705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) {
839705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLparam0();
840705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  LLVMUseRef Next;
841705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  if ((Next = LLVMGetNextUse(U))) {
842705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    value Option = alloc(1, 0);
843705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    Field(Option, 0) = (value) Next;
844705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar    CAMLreturn(Option);
845705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  }
846705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  CAMLreturn(Val_int(0));
847705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
848705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
849705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
850705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) {
851705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUser(UR);
852705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
853705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
854705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */
855705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) {
856705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar  return LLVMGetUsedValue(UR);
857705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar}
858705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar
8598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/
8608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8614733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef,
8624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
8634733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
8648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */
86546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
86646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          LLVMModuleRef M) {
8676d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
8686d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
8696d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
87057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0));
8716d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return GlobalVar;
8726d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
87346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddGlobal(M, Ty, String_val(Name));
8748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
8758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
8768e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */
8778e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name,
8788e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    value AddressSpace,
8798e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                    LLVMModuleRef M) {
8808e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar;
8818e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
8828e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
8838e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar      return LLVMConstBitCast(GlobalVar,
8848e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                              LLVMPointerType(Ty, Int_val(AddressSpace)));
8858e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar    return GlobalVar;
8868e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  }
8878e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return LLVMAddGlobal(M, Ty, String_val(Name));
8888e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
8898e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
8906d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
8916d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
8926d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
8936d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef GlobalVar;
8946d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
89575e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
8966d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) GlobalVar;
8976d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
8986d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
8996d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
9006d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
9016d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
9028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */
90346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
90446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMModuleRef M) {
90546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer),
9068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen                                         String_val(Name));
9078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  LLVMSetInitializer(GlobalVar, Initializer);
90846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return GlobalVar;
9098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9118e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */
9128e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name,
9138e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMValueRef Initializer,
9148e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   value AddressSpace,
9158e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                   LLVMModuleRef M) {
9168e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M,
9178e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       LLVMTypeOf(Initializer),
9188e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       String_val(Name),
9198e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar                                                       Int_val(AddressSpace));
9208e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  LLVMSetInitializer(GlobalVar, Initializer);
9218e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar  return GlobalVar;
9228e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar}
9238e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar
9248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
92546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
92646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteGlobal(GlobalVar);
9278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */
93146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
93246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    LLVMValueRef GlobalVar) {
93346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, ConstantVal);
9348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */
93846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) {
93946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetInitializer(GlobalVar, NULL);
9408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
9418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */
94446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) {
94546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMIsThreadLocal(GlobalVar));
9468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
9478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen
9488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */
94946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal,
95046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     LLVMValueRef GlobalVar) {
95146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal));
95246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
95346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
95446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
955c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */
956c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) {
957c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_bool(LLVMIsGlobalConstant(GlobalVar));
958c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
959c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
960c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */
961c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) {
962c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag));
963c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen  return Val_unit;
964c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen}
965c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen
9666ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/
9676ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
9686ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty,
9696ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar                                     LLVMValueRef Aliasee, value Name) {
9706ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar  return LLVMAddAlias(M, Ty, Aliasee, String_val(Name));
9716ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar}
9726ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar
97346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/
97446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
9754733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef,
9764733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen                 LLVMGetGlobalParent)
9774733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
97846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
97946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty,
98046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMModuleRef M) {
9816d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
9826d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
9836d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty)
98457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0));
9856d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    return Fn;
9866d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
98746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMAddFunction(M, String_val(Name), Ty);
98846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
98946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
9906d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */
9916d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) {
9926d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLparam1(Name);
9936d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  LLVMValueRef Fn;
9946d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) {
99575e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen    value Option = alloc(1, 0);
9966d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    Field(Option, 0) = (value) Fn;
9976d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen    CAMLreturn(Option);
9986d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  }
9996d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen  CAMLreturn(Val_int(0));
10006d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen}
10016d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen
100246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */
100346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty,
100446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                           LLVMModuleRef M) {
100546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty);
1006b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry");
100746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Fn;
100846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
100946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
101046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */
101146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) {
101246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteFunction(Fn);
101346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
101446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
101546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
101646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
101746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) {
101846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMGetIntrinsicID(Fn));
101946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
102046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
102146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */
102246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) {
102346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_int(LLVMGetFunctionCallConv(Fn));
102446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
102546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
102646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */
102746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
102846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMSetFunctionCallConv(Fn, Int_val(Id));
102946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
103046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
103146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
103280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */
10335eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) {
10345eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  const char *GC;
103580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLparam0();
103680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  CAMLlocal2(Name, Option);
103780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
10385eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  if ((GC = LLVMGetGC(Fn))) {
10395eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen    Name = copy_string(GC);
104080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
104180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Option = alloc(1, 0);
104280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    Field(Option, 0) = Name;
104380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Option);
104480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  } else {
104580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen    CAMLreturn(Val_int(0));
104680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  }
104780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
104880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
104980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */
10505eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) {
10515eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen  LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
105280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen  return Val_unit;
105380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen}
105480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen
10550be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1056e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) {
10570be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddFunctionAttr(Arg, Int32_val(PA));
1058e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1059e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1060e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
10610be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 */
10620be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_function_attr(LLVMValueRef Fn)
10630be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
10640be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
10650be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetFunctionAttr(Fn)));
10660be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
10670be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
10680be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1069e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) {
10700be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveFunctionAttr(Arg, Int32_val(PA));
1071e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1072e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
10734733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/
10744733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10754733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent)
10764733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10774733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */
10784733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
10794733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return LLVMGetParam(Fn, Int_val(Index));
10804733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
10814733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10820be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int */
10830be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_param_attr(LLVMValueRef Param)
10840be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{
10850be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLparam0();
10860be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin    CAMLreturn(caml_copy_int32(LLVMGetAttribute(Param)));
10870be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin}
10880be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin
1089e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */
1090e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) {
10914733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  value Params = alloc(LLVMCountParams(Fn), 0);
10924733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params));
10934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  return Params;
10944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen}
10954733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
10960be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1097e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) {
10980be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddAttribute(Arg, Int32_val(PA));
1099e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1100e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1101e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
11020be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */
1103e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) {
11040be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveAttribute(Arg, Int32_val(PA));
1105e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1106e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1107e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
1108e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */
1109e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
1110e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  LLVMSetParamAlignment(Arg, Int_val(align));
1111e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1112e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1113e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
111446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/
111546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
11164733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(
11174733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen  block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent)
11184733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen
1119ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llbasicblock -> llvalue option */
1120ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_block_terminator(LLVMBasicBlockRef Block)
1121ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1122ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLparam0();
1123ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMValueRef Term = LLVMGetBasicBlockTerminator(Block);
1124ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  if (Term) {
1125ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    value Option = alloc(1, 0);
1126ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    Field(Option, 0) = (value) Term;
1127ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    CAMLreturn(Option);
1128ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  }
1129ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  CAMLreturn(Val_int(0));
1130ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1131ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
113246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */
113346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) {
113446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0);
113546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray));
113646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return MLArray;
113746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
113846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
113946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */
114046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) {
114146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDeleteBasicBlock(BB);
114246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_unit;
114346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
114446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
114546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */
1146b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name,
1147b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMValueRef Fn) {
1148b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name));
114946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
115046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
115146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */
1152b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name,
1153b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar                                             LLVMBasicBlockRef BB) {
1154b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar  return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name));
115546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
115646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
115746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */
115846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) {
115946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return Val_bool(LLVMValueIsBasicBlock(Val));
116046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
116146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1162033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/
1163033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
1164033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef,
1165033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen                 LLVMGetInstructionParent)
1166033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
11676563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */
11686563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) {
11693dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  LLVMOpcode o;
11703dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  if (!LLVMIsAInstruction(Inst))
11713dd16741864302af14b31b7f75375c09d8544a35Torok Edwin      failwith("Not an instruction");
11723dd16741864302af14b31b7f75375c09d8544a35Torok Edwin  o = LLVMGetInstructionOpcode(Inst);
1173efde86753d6f324ac9d0b42e48fd3ebf40c17905Benjamin Kramer  assert (o <= LLVMLandingPad);
11746563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin  return Val_int(o);
11756563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin}
1176033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen
11774917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin/* llvalue -> ICmp.t */
11784917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) {
117931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLparam0();
118031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  int x = LLVMGetICmpPredicate(Val);
118131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  if (x) {
118231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    value Option = alloc(1, 0);
118331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    Field(Option, 0) = Val_int(x - LLVMIntEQ);
118431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin    CAMLreturn(Option);
118531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  }
118631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin  CAMLreturn(Val_int(0));
11874917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin}
11884917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
11894917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin
1190cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/
1191cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1192cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */
1193cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) {
1194cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_int(LLVMGetInstructionCallConv(Inst));
1195cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1196cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
1197cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */
1198cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
1199cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  LLVMSetInstructionCallConv(Inst, Int_val(CC));
1200cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen  return Val_unit;
1201cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen}
1202cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen
12030be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1204e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr,
1205e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value index,
1206e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                               value PA) {
12070be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMAddInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1208e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1209e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1210e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
12110be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */
1212e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr,
1213e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value index,
1214e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands                                                  value PA) {
12150be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin  LLVMRemoveInstrAttribute(Instr, Int_val(index), Int32_val(PA));
1216e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands  return Val_unit;
1217e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands}
1218e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands
121907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/
122007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
122107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */
122207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) {
122307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_bool(LLVMIsTailCall(CallInst));
122407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
122507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
122607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */
122707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall,
122807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen                                  LLVMValueRef CallInst) {
122907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  LLVMSetTailCall(CallInst, Bool_val(IsTailCall));
123007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen  return Val_unit;
123107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen}
123207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen
12332618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/
12342618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12352618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */
12362618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) {
12372618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMAddIncoming(PhiNode,
12382618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMValueRef*) &Field(Incoming, 0),
12392618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  (LLVMBasicBlockRef*) &Field(Incoming, 1),
12402618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                  1);
12412618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return Val_unit;
12422618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
12432618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12442618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */
12452618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) {
12462618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  unsigned I;
12472618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLparam0();
12482618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLlocal3(Hd, Tl, Tmp);
12492618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12502618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  /* Build a tuple list of them. */
12512618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Tl = Val_int(0);
12522618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (I = LLVMCountIncoming(PhiNode); I != 0; ) {
12532618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Hd = alloc(2, 0);
12542618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I));
12552618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I));
12562618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12572618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tmp = alloc(2, 0);
12582618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 0, Hd);
12592618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Store_field(Tmp, 1, Tl);
12602618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    Tl = Tmp;
12612618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
12622618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
12632618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  CAMLreturn(Tl);
12642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen}
12652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
1266ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> unit */
1267ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_delete_instruction(LLVMValueRef Instruction) {
1268ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  LLVMInstructionEraseFromParent(Instruction);
1269ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return Val_unit;
1270ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
127146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
127246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/
127346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
127446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v)  (*(LLVMBuilderRef *)(Data_custom_val(v)))
127546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1276a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) {
127746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LLVMDisposeBuilder(Builder_val(B));
127846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
127946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
128046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = {
128189f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  (char *) "IRBuilder",
128246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  llvm_finalize_builder,
128346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_compare_default,
128446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_hash_default,
128546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_serialize_default,
128646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  custom_deserialize_default
12874d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#ifdef custom_compare_ext_default
12884d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes  , custom_compare_ext_default
12894d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#endif
129046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
129146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1292a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) {
1293a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1);
1294a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  Builder_val(V) = B;
1295a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen  return V;
1296a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1297a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
12985371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */
12995371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) {
13005371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar  return alloc_builder(LLVMCreateBuilderInContext(C));
1301a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen}
1302a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen
1303033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */
1304033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) {
1305033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  if (Tag_val(Pos) == 0) {
1306033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0));
1307033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderAtEnd(Builder_val(B), BB);
1308033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  } else {
1309033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0));
1310033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen    LLVMPositionBuilderBefore(Builder_val(B), I);
1311033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen  }
13128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen  return Val_unit;
13138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen}
131446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1315dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */
1316628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) {
1317dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B));
1318dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  if (!InsertBlock)
1319dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen    raise_not_found();
1320dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen  return InsertBlock;
1321dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen}
1322dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen
13235c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */
1324628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) {
1325628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar  LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name));
13265c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar  return Val_unit;
13275c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar}
13285c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar
132946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/
133046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
133146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
133246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) {
133346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), V);
133446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
133546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
133646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
133746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */
133846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) {
133946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetCurrentDebugLocation(Builder_val(B), NULL);
134046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
134146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
134246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
134346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */
134446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) {
134546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLparam0();
134646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMValueRef L;
134746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) {
134846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    value Option = alloc(1, 0);
134946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    Field(Option, 0) = (value) L;
135046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar    CAMLreturn(Option);
135146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  }
135246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  CAMLreturn(Val_int(0));
135346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
135446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
135546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */
135646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) {
135746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  LLVMSetInstDebugLocation(Builder_val(B), V);
135846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar  return Val_unit;
135946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar}
136046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
136146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar
136246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/
136346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
136446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
136546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) {
136646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRetVoid(Builder_val(B));
136746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
136846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
136946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */
137046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) {
137146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildRet(Builder_val(B), Val);
137246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
137346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
13746793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */
13756793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) {
13766793dd9769047706acf34420586716450344fb66Erick Tryzelaar  return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals),
13776793dd9769047706acf34420586716450344fb66Erick Tryzelaar                               Wosize_val(RetVals));
13786793dd9769047706acf34420586716450344fb66Erick Tryzelaar}
13796793dd9769047706acf34420586716450344fb66Erick Tryzelaar
138046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */
138146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) {
138246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBr(Builder_val(B), BB);
138346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
138446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
138546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */
138646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If,
138746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Then,
138846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         LLVMBasicBlockRef Else,
138946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value B) {
139046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCondBr(Builder_val(B), If, Then, Else);
139146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
139246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
139346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */
139446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of,
139546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMBasicBlockRef Else,
139646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value EstimatedCount,
139746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value B) {
139846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount));
139946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
140046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1401ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> string -> llbuilder -> llvalue */
1402ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_malloc(LLVMTypeRef Ty, value Name,
1403ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                        value B)
1404ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1405ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildMalloc(Builder_val(B), Ty, String_val(Name));
1406ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1407ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1408ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> string -> llbuilder -> llvalue */
1409ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_array_malloc(LLVMTypeRef Ty,
1410ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              LLVMValueRef Val,
1411ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin                                              value Name, value B)
1412ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1413ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildArrayMalloc(Builder_val(B), Ty, Val, String_val(Name));
1414ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1415ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1416ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1417ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_free(LLVMValueRef P, value B)
1418ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1419ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin  return LLVMBuildFree(Builder_val(B), P);
1420ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1421ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
14221430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
14231430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal,
142421491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen                             LLVMBasicBlockRef Dest) {
142521491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  LLVMAddCase(Switch, OnVal, Dest);
142621491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen  return Val_unit;
142721491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen}
142821491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen
1429c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */
1430c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr,
1431c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value EstimatedDests,
1432c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                             value B) {
1433c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests);
1434c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1435c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
1436c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */
1437c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr,
1438c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar                                    LLVMBasicBlockRef Dest) {
1439c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  LLVMAddDestination(IndirectBr, Dest);
1440c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar  return Val_unit;
1441c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar}
1442c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar
144346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
144446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
144546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args,
144646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Then,
144746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            LLVMBasicBlockRef Catch,
144846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                            value Name, value B) {
144946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args),
145046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                         Wosize_val(Args), Then, Catch, String_val(Name));
145146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
145246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
145346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string ->
145446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen   llbuilder -> llvalue */
145546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) {
145646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1],
145746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[2],
145846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               (LLVMBasicBlockRef) Args[3],
145946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                               Args[4], Args[5]);
146046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
146146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1462ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> int -> string -> llbuilder -> llvalue */
146348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn,
146448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value NumClauses,  value Name,
146548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                                            value B) {
146648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses),
146748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin                               String_val(Name));
146848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
146948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1470ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llvalue -> unit */
1471ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_add_clause(LLVMValueRef LandingPadInst, LLVMValueRef ClauseVal)
1472ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1473ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    LLVMAddClause(LandingPadInst, ClauseVal);
1474ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return Val_unit;
1475ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1476ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1477ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
1478ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> bool -> unit */
147948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag)
148048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{
148148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    LLVMSetCleanup(LandingPadInst, Bool_val(flag));
148248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin    return Val_unit;
148348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin}
148448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin
1485ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */
1486ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_resume(LLVMValueRef Exn, value B)
1487ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{
1488ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin    return LLVMBuildResume(Builder_val(B), Exn);
1489ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin}
1490ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin
149146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */
149246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) {
149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUnreachable(Builder_val(B));
149446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
149546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/
149746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
149846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
149946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS,
150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name));
150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1505e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS,
1506e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1507e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name));
1508e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1509e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1510e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
151119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS,
151219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
151319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name));
151419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
151519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
151619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1517e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS,
1518e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1519e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name));
1520e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1521e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1522e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
152346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS,
152446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
152546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name));
152646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
152746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
152846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
152919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
153019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
153119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name));
153219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
153319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
153419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
153519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS,
153619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
153719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name));
153819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
153919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
154019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1541e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS,
1542e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1543e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name));
1544e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1545e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1546e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
154746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS,
154846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
154946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name));
155046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
155146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
155246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
155319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
155419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
155519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name));
155619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
155719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
155819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
155919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS,
156019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
156119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name));
156219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
156319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
156419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1565e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS,
1566e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                      value Name, value B) {
1567e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name));
1568e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1569e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1570e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
157146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS,
157246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
157346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name));
157446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
157546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
157646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
157746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
157846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
157946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name));
158046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
158146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
158246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1583e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS,
1584e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                            value Name, value B) {
1585e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name));
1586e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1587e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1588e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
158946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS,
159046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
159146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name));
159246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
159346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
159446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
159546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS,
159646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
159746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name));
159846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
159946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
160146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS,
160246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
160346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name));
160446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
160546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
160646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
160746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS,
160846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
160946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name));
161046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
161146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
161246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
161346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS,
161446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
161546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name));
161646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
161746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
161846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
161946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS,
162046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
162146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name));
162246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
162346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
162446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
162546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS,
162646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
162746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name));
162846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
162946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
163046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
163146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS,
163246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
163346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name));
163446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
163546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
163646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
163746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS,
163846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                    value Name, value B) {
163946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name));
164046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
164146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
164246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
164346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS,
164446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
164546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name));
164646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
164746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
164846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
164946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X,
165046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
165146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNeg(Builder_val(B), X, String_val(Name));
165246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
165346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
165446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
165519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X,
165619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
165719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name));
165819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
165919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
166019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
166119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X,
166219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                         value Name, value B) {
166319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name));
166419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
166519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
166619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
166719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X,
166819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar                                     value Name, value B) {
166919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar  return LLVMBuildFNeg(Builder_val(B), X, String_val(Name));
167019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar}
167119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar
167219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
167346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X,
167446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
167546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildNot(Builder_val(B), X, String_val(Name));
167646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
167746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
167846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/
167946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
168046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */
168146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty,
168246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
168346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name));
168446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
168546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
168646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */
168746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size,
168846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                              value Name, value B) {
168946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name));
169046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
169146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */
169346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer,
169446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
169546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name));
169646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
169746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
169846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */
169946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer,
170046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value B) {
170146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildStore(Builder_val(B), Value, Pointer);
170246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
170346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
170446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
170546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices,
170646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                     value Name, value B) {
170746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildGEP(Builder_val(B), Pointer,
170846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices),
170946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                      String_val(Name));
171046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
171146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1712e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
1713e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer,
1714e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value Indices, value Name,
1715e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1716e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInBoundsGEP(Builder_val(B), Pointer,
1717e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              (LLVMValueRef *) Op_val(Indices),
1718e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              Wosize_val(Indices), String_val(Name));
1719e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1720e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1721e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1722e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer,
1723c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                                               value Index, value Name,
1724e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                               value B) {
1725c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner  return LLVMBuildStructGEP(Builder_val(B), Pointer,
1726c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner                              Int_val(Index), String_val(Name));
1727e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1728e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1729e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1730e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) {
1731e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalString(Builder_val(B), String_val(Str),
1732e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1733e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1734e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1735e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */
1736e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name,
1737e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1738e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str),
1739e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                  String_val(Name));
1740e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1741e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
174246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/
174346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
174446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
174546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty,
174646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
174746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name));
174846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
174946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
175146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty,
175246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
175346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name));
175446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
175546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
175646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
175746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty,
175846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
175946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name));
176046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
176146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
176246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
176346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty,
176446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
176546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name));
176646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
176746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
176846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
176946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty,
177046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
177146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name));
177246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
177446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
177546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty,
177646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
177746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name));
177846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
177946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
178146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty,
178246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
178346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name));
178446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
178546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
178646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
178746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty,
178846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
178946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name));
179046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
179246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
179346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty,
179446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                       value Name, value B) {
179546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name));
179646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
179746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
179846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
179946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty,
180046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
180146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name));
180246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
180446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
180546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty,
180646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                          value Name, value B) {
180746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name));
180846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
180946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
181046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
181146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
181246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                         value Name, value B) {
181346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name));
181446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
181546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1816e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1817e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1818e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1819e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1820e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1821e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1822e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1823e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty,
1824e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                 value Name, value B) {
1825e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1826e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1827e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1828e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1829e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X,
1830e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  LLVMTypeRef Ty, value Name,
1831e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                                  value B) {
1832e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name));
1833e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1834e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1835e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1836e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty,
1837e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1838e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name));
1839e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1840e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1841e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1842e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty,
1843e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1844e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name));
1845e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1846e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1847e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */
1848e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty,
1849e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                        value Name, value B) {
1850e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name));
1851e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1852e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
185346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/
185446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1855404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
185646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred,
185746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
185846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
185946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS,
186046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
186146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
186246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1863404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
186446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred,
186546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      LLVMValueRef LHS, LLVMValueRef RHS,
186646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
186746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS,
186846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       String_val(Name));
186946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
187046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
187146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/
187246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
18732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */
18742618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) {
18752618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  value Hd, Tl;
18762618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  LLVMValueRef FirstValue, PhiNode;
18772618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
18782618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!");
18792618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
18802618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  Hd = Field(Incoming, 0);
18812618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  FirstValue = (LLVMValueRef) Field(Hd, 0);
18822618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue),
18832618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                         String_val(Name));
18842618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
18852618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) {
18862618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    value Hd = Field(Tl, 0);
18872618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen    LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0),
18882618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen                    (LLVMBasicBlockRef*) &Field(Hd, 1), 1);
18892618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  }
18902618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen
18912618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen  return PhiNode;
189246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
189346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
189446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */
189546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params,
189646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                      value Name, value B) {
189746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params),
189846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                       Wosize_val(Params), String_val(Name));
189946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
190046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
190146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
190246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If,
190346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        LLVMValueRef Then, LLVMValueRef Else,
190446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
190546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name));
190646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
190746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
190846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */
190946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty,
191046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                        value Name, value B) {
191146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name));
191246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
191346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
191446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
191546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec,
191646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                LLVMValueRef Idx,
191746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                                value Name, value B) {
191846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name));
191946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
192146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
192246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec,
192346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Element,
192446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Idx,
192546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
192646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx,
192746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                String_val(Name));
192846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
192946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
193046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
193146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
193246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               LLVMValueRef Mask,
193346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen                                               value Name, value B) {
193446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
193546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}
193646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
1937e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */
1938e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate,
1939e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                              value Idx, value Name, value B) {
1940e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx),
1941e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                               String_val(Name));
1942e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1943e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1944e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */
1945e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate,
1946e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             LLVMValueRef Val, value Idx,
1947e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value Name, value B) {
1948e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx),
1949e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                              String_val(Name));
1950e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1951e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1952e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1953e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name,
1954e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value B) {
1955e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name));
1956e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1957e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1958e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */
1959e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name,
1960e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                             value B) {
1961e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name));
1962e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
1963e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar
1964e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */
1965e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS,
1966e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar                                         value Name, value B) {
1967e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar  return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name));
1968e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar}
19691ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
1970da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/
1971da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1972da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer
1973da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1974da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) {
1975da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLparam1(Path);
1976da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1977da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1978da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1979da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path),
1980da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen                                               &MemBuf, &Message))
1981da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1982da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1983da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  CAMLreturn((value) MemBuf);
1984da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1985da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1986da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer
1987da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   raises IoError msg on error */
1988da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
1989da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  char *Message;
1990da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMMemoryBufferRef MemBuf;
1991da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1992da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message))
1993da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    llvm_raise(llvm_ioerror_exn, Message);
1994da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1995da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return MemBuf;
1996da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
1997da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
1998f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* ?name:string -> string -> llmemorybuffer */
1999f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_string(value Name, value String) {
2000f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  const char *NameCStr;
2001f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  if(Name == Val_int(0))
2002f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov    NameCStr = "";
2003f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  else
2004f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov    NameCStr = String_val(Field(Name, 0));
2005f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2006f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  LLVMMemoryBufferRef MemBuf;
2007f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  MemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy(
2008f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov                String_val(String), caml_string_length(String), NameCStr);
2009f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2010f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  return MemBuf;
2011f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov}
2012f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2013f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* llmemorybuffer -> string */
2014f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim value llvm_memorybuffer_as_string(LLVMMemoryBufferRef MemBuf) {
2015f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  value String = caml_alloc_string(LLVMGetBufferSize(MemBuf));
2016f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  memcpy(String_val(String), LLVMGetBufferStart(MemBuf),
2017f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov         LLVMGetBufferSize(MemBuf));
2018f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2019f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov  return String;
2020f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov}
2021f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov
2022da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */
2023da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
2024da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  LLVMDisposeMemoryBuffer(MemBuf);
2025da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return Val_unit;
2026da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
2027da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
2028d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/
2029d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2030d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */
2031d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) {
2032d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return LLVMCreatePassManager();
2033d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2034d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2035d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */
2036d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M,
2037d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                           LLVMPassManagerRef PM) {
2038d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunPassManager(PM, M));
2039d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2040d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2041d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2042d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) {
2043d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMInitializeFunctionPassManager(FPM));
2044d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2045d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2046d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */
2047d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F,
2048d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen                                             LLVMPassManagerRef FPM) {
2049d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMRunFunctionPassManager(FPM, F));
2050d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2051d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2052d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */
2053d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) {
2054d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_bool(LLVMFinalizeFunctionPassManager(FPM));
2055d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2056d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen
2057d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */
2058d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) {
2059d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  LLVMDisposePassManager(PM);
2060d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen  return Val_unit;
2061d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen}
2062