llvm_ocaml.c revision 19f047f5f6c44d1cd5681f9314b3ff5e7bae122d
1bbf1c514bd832bf1306fe3e87221fd78bbc306efGordon Henriksen/*===-- llvm_ocaml.c - LLVM Ocaml Glue --------------------------*- C++ -*-===*\ 28ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 38ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* The LLVM Compiler Infrastructure *| 48ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 5234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* This file is distributed under the University of Illinois Open Source *| 6234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* License. See LICENSE.TXT for details. *| 78ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 88ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*===----------------------------------------------------------------------===*| 98ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* This file glues LLVM's ocaml interface to its C interface. These functions *| 118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* are by and large transparent wrappers to the corresponding C functions. *| 128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* Note that these functions intentionally take liberties with the CAMLparamX *| 148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* macros, since most of the parameters are not GC heap objects. *| 158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen\*===----------------------------------------------------------------------===*/ 178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "llvm-c/Core.h" 198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/alloc.h" 2046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#include "caml/custom.h" 218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/memory.h" 22da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/fail.h" 23da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/callback.h" 246d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen#include "llvm/Config/config.h" 252618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen#include <assert.h> 26da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include <stdlib.h> 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 1138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/ 1148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 115263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar/* llcontext -> string -> llmodule */ 116263d989a719c1864862fc91f59193a6c2b55ca48Erick TryzelaarCAMLprim LLVMModuleRef llvm_create_module(LLVMContextRef C, value ModuleID) { 117263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar return LLVMModuleCreateWithNameInContext(String_val(ModuleID), C); 1188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */ 12146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) { 12246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDisposeModule(M); 1238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 1248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 126a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */ 127a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_target_triple(LLVMModuleRef M) { 128a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return copy_string(LLVMGetTarget(M)); 129a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 130a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 131a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */ 132a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_target_triple(value Trip, LLVMModuleRef M) { 133a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen LLVMSetTarget(M, String_val(Trip)); 134a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return Val_unit; 135a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 136a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 137a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */ 138a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_data_layout(LLVMModuleRef M) { 139a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return copy_string(LLVMGetDataLayout(M)); 140a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 141a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 142a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */ 143a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_data_layout(value Layout, LLVMModuleRef M) { 144a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen LLVMSetDataLayout(M, String_val(Layout)); 145a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return Val_unit; 146a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 147a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 1488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> lltype -> llmodule -> bool */ 14946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_add_type_name(value Name, LLVMTypeRef Ty, LLVMModuleRef M) { 15046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen int res = LLVMAddTypeName(M, String_val(Name), Ty); 1518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_bool(res == 0); 1528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 15446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llmodule -> unit */ 15546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_type_name(value Name, LLVMModuleRef M) { 15646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteTypeName(M, String_val(Name)); 15746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 15846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 15946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 160af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen/* llmodule -> unit */ 161af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon HenriksenCAMLprim value llvm_dump_module(LLVMModuleRef M) { 162af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen LLVMDumpModule(M); 163af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen return Val_unit; 164af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen} 165af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen 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 1745371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* lltype -> llcontext */ 1755371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_type_context(LLVMTypeRef Ty) { 1765371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMGetTypeContext(Ty); 1775371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar} 1785371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar 1798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/ 1808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 181b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 182b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i1_type (LLVMContextRef Context) { 183b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt1TypeInContext(Context); 184b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 185b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 186b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 187b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i8_type (LLVMContextRef Context) { 188b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt8TypeInContext(Context); 189b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 190b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 191b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 192b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i16_type (LLVMContextRef Context) { 193b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt16TypeInContext(Context); 194b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 195b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 196b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 197b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i32_type (LLVMContextRef Context) { 198b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt32TypeInContext(Context); 199b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 200b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 201b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 202b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i64_type (LLVMContextRef Context) { 203b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt64TypeInContext(Context); 204b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 2058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 206b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> int -> lltype */ 207b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_integer_type(LLVMContextRef Context, value Width) { 208b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMIntTypeInContext(Context, Int_val(Width)); 2098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 21246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) { 21346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetIntTypeWidth(IntegerTy)); 2148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/ 2178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 218b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 219b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_float_type(LLVMContextRef Context) { 220b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMFloatTypeInContext(Context); 2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 223b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 224b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_double_type(LLVMContextRef Context) { 225b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMDoubleTypeInContext(Context); 2268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 228b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 229b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_x86fp80_type(LLVMContextRef Context) { 230b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMX86FP80TypeInContext(Context); 2318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 233b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 234b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_fp128_type(LLVMContextRef Context) { 235b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMFP128TypeInContext(Context); 2368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 238b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 239b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_ppc_fp128_type(LLVMContextRef Context) { 240b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMPPCFP128TypeInContext(Context); 2418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/ 2448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 245957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */ 246957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) { 24781a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys, 248957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen Wosize_val(ParamTys), 0); 249957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen} 250957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen 251957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */ 252957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy, 253957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen value ParamTys) { 254957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys, 255957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen Wosize_val(ParamTys), 1); 2568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */ 25946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) { 26046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsFunctionVarArg(FunTy)); 2618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 26446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) { 26546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Tys = alloc(LLVMCountParamTypes(FunTy), 0); 26646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys); 26746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Tys; 2688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/ 2718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2725371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */ 2735371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_struct_type(LLVMContextRef C, value ElementTypes) { 2745371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes, 2755371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementTypes), 0); 276957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen} 277957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen 2785371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */ 2795371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C, 2805371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar value ElementTypes) { 2815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes, 2825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementTypes), 1); 2838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 2861940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) { 28746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0); 28846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys); 28946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Tys; 2908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 29246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */ 29346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) { 29446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsPackedStruct(StructTy)); 2958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2971940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar/*--... Operations on union types ..........................................--*/ 2981940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar 2991940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar/* llcontext -> lltype array -> lltype */ 3001940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim LLVMTypeRef llvm_union_type(LLVMContextRef C, value ElementTypes) { 3011940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar return LLVMUnionTypeInContext(C, (LLVMTypeRef *) ElementTypes, 3021940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar Wosize_val(ElementTypes)); 3031940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar} 3041940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar 3051940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar/* lltype -> lltype array */ 3061940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_union_element_types(LLVMTypeRef UnionTy) { 3071940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar value Tys = alloc(LLVMCountUnionElementTypes(UnionTy), 0); 3081940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar LLVMGetUnionElementTypes(UnionTy, (LLVMTypeRef *) Tys); 3091940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar return Tys; 3101940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar} 3111940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar 3128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/ 3138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 315957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) { 31681a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMArrayType(ElementTy, Int_val(Count)); 3178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 31957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */ 32057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) { 32157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMPointerType(ElementTy, 0); 32257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 32357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 32457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */ 32557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy, 32657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen value AddressSpace) { 32757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMPointerType(ElementTy, Int_val(AddressSpace)); 32857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 32957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 3308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 331957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) { 33281a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMVectorType(ElementTy, Int_val(Count)); 3338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 33646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) { 33746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetArrayLength(ArrayTy)); 3388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 34157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) { 34257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return Val_int(LLVMGetPointerAddressSpace(PtrTy)); 34357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 34457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 34557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */ 34646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) { 34746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetVectorSize(VectorTy)); 3488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/ 3518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 352b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 353b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) { 354b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMVoidTypeInContext(Context); 355b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 356b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 357b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 358b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) { 359b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMLabelTypeInContext(Context); 360b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 3618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 362b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 363b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_opaque_type(LLVMContextRef Context) { 364b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMOpaqueTypeInContext(Context); 3658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3671cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen/*--... Operations on type handles .........................................--*/ 3681cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3691cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen#define Typehandle_val(v) (*(LLVMTypeHandleRef *)(Data_custom_val(v))) 3701cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void llvm_finalize_handle(value TH) { 3721cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen LLVMDisposeTypeHandle(Typehandle_val(TH)); 3731cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen} 3741cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3751cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksenstatic struct custom_operations typehandle_ops = { 3761cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen (char *) "LLVMTypeHandle", 3771cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen llvm_finalize_handle, 3781cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen custom_compare_default, 3791cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen custom_hash_default, 3801cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen custom_serialize_default, 3811cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen custom_deserialize_default 3821cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen}; 3831cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3841cf08fddc7413076dedad58dbb8d8d67e69a490fGordon HenriksenCAMLprim value llvm_handle_to_type(LLVMTypeRef PATy) { 3851cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen value TH = alloc_custom(&typehandle_ops, sizeof(LLVMBuilderRef), 0, 1); 3861cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen Typehandle_val(TH) = LLVMCreateTypeHandle(PATy); 3871cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen return TH; 3881cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen} 3891cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3901cf08fddc7413076dedad58dbb8d8d67e69a490fGordon HenriksenCAMLprim LLVMTypeRef llvm_type_of_handle(value TH) { 3911cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen return LLVMResolveTypeHandle(Typehandle_val(TH)); 3921cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen} 3931cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3941cf08fddc7413076dedad58dbb8d8d67e69a490fGordon HenriksenCAMLprim value llvm_refine_type(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy){ 39583eaae19add8031b299fc657cb69ceb5bfa44ae4Gordon Henriksen LLVMRefineType(AbstractTy, ConcreteTy); 3961cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen return Val_unit; 3971cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen} 3981cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/ 4018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */ 40346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) { 40446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMTypeOf(Val); 4058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 40846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) { 40946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return copy_string(LLVMGetValueName(Val)); 4108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 41346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) { 41446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetValueName(Val, String_val(Name)); 4158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 4168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 41888cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */ 41988cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) { 42088cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen LLVMDumpValue(Val); 42188cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen return Val_unit; 42288cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen} 42388cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen 4248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/ 4258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 42746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) { 42846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsConstant(Val)); 429344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 430344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 431344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 43246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) { 43346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsNull(Val)); 4348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 436344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 43746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) { 43846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsUndef(Val)); 439344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 440344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 4418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/ 4428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 443e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */ 444e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) { 445e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstInt(IntTy, (long long) Int_val(N), 1); 4468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 448344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */ 449e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N, 450e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen value SExt) { 451e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt)); 452344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 453344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 45445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */ 45545d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S, 45645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar value Radix) { 45745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S), 45845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar Int_val(Radix)); 45945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar} 46045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar 4618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */ 462e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) { 463e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstReal(RealTy, Double_val(N)); 4648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 46645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */ 46745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) { 46845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar return LLVMConstRealOfStringAndSize(RealTy, String_val(S), 46945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar caml_string_length(S)); 47045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar} 47145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar 4728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/ 4738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 474b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */ 475b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str, 476b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar value NullTerminate) { 477b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMConstStringInContext(Context, String_val(Str), string_length(Str), 478b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 1); 479e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen} 480e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen 481b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */ 482b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str, 483b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar value NullTerminate) { 484b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMConstStringInContext(Context, String_val(Str), string_length(Str), 485b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 0); 4868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */ 489e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy, 49046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value ElementVals) { 491e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals), 492e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen Wosize_val(ElementVals)); 493e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen} 494e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen 4955371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 4965371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) { 4975371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals), 4985371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementVals), 0); 4998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5015371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 5025371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C, 5035371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar value ElementVals) { 5045371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals), 5055371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementVals), 1); 5068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */ 509e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) { 510e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals), 511e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen Wosize_val(ElementVals)); 5124647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 5134647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 5144647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/ 5154647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 516404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */ 5174647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred, 5184647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef LHSConstant, 5194647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef RHSConstant) { 5204647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant); 5214647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 5224647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 523404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */ 5244647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred, 5254647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef LHSConstant, 5264647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef RHSConstant) { 5274647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant); 5284647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 5294647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 5304647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */ 5314647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) { 5324647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices), 5334647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen Wosize_val(Indices)); 5348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5361b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */ 5371b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal, 5381b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar value Indices) { 5391b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices), 5401b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar Wosize_val(Indices)); 5411b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 5421b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 5431b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */ 5441b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate, 5451b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar value Indices) { 5461b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLparam1(Indices); 5471b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int size = Wosize_val(Indices); 5481b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int i; 5491b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef result; 5501b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 5511b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned)); 5521b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar for (i = 0; i < size; i++) { 5531b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar idxs[i] = Int_val(Field(Indices, i)); 5541b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar } 5551b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 5561b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar result = LLVMConstExtractValue(Aggregate, idxs, size); 5571b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar free(idxs); 5581b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLreturnT(LLVMValueRef, result); 5591b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 5601b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 5611b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */ 5621b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate, 5631b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef Val, value Indices) { 5641b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLparam1(Indices); 5651b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int size = Wosize_val(Indices); 5661b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int i; 5671b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef result; 5681b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 5691b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned)); 5701b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar for (i = 0; i < size; i++) { 5711b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar idxs[i] = Int_val(Field(Indices, i)); 5721b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar } 5731b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 5741b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar result = LLVMConstInsertValue(Aggregate, Val, idxs, size); 5751b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar free(idxs); 5761b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLreturnT(LLVMValueRef, result); 5771b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 5781b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 5798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/ 5808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 58246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) { 58346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsDeclaration(Global)); 5848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 586404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */ 58746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) { 58846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetLinkage(Global)); 5898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 591404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */ 59246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) { 59346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetLinkage(Global, Int_val(Linkage)); 5948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 5958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 59846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) { 59946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return copy_string(LLVMGetSection(Global)); 6008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 60346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) { 60446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetSection(Global, String_val(Section)); 6058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 608404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */ 60946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) { 61046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetVisibility(Global)); 6118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 613404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */ 61446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) { 61546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetVisibility(Global, Int_val(Viz)); 6168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */ 62046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) { 62146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetAlignment(Global)); 6228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */ 62546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) { 62646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetAlignment(Global, Int_val(Bytes)); 6278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/ 6318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6324733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef, 6334733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetGlobalParent) 6344733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 6358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */ 63646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name, 63746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 6386d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef GlobalVar; 6396d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 6406d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) 64157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0)); 6426d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen return GlobalVar; 6436d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 64446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMAddGlobal(M, Ty, String_val(Name)); 6458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6476d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */ 6486d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) { 6496d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLparam1(Name); 6506d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef GlobalVar; 6516d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 65275e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen value Option = alloc(1, 0); 6536d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen Field(Option, 0) = (value) GlobalVar; 6546d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Option); 6556d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 6566d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Val_int(0)); 6576d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen} 6586d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen 6598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */ 66046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer, 66146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 66246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer), 6638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen String_val(Name)); 6648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetInitializer(GlobalVar, Initializer); 66546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return GlobalVar; 6668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 66946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) { 67046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteGlobal(GlobalVar); 6718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */ 67546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal, 67646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar) { 67746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetInitializer(GlobalVar, ConstantVal); 6788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 68246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) { 68346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetInitializer(GlobalVar, NULL); 6848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 68846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) { 68946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsThreadLocal(GlobalVar)); 6908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */ 69346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal, 69446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar) { 69546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal)); 69646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 69746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 69846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 699c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */ 700c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) { 701c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen return Val_bool(LLVMIsGlobalConstant(GlobalVar)); 702c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen} 703c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen 704c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */ 705c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) { 706c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag)); 707c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen return Val_unit; 708c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen} 709c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen 71046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/ 71146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 7124733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef, 7134733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetGlobalParent) 7144733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 71546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */ 71646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty, 71746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 7186d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef Fn; 7196d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { 7206d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty) 72157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0)); 7226d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen return Fn; 7236d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 72446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMAddFunction(M, String_val(Name), Ty); 72546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 72646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 7276d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */ 7286d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) { 7296d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLparam1(Name); 7306d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef Fn; 7316d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { 73275e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen value Option = alloc(1, 0); 7336d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen Field(Option, 0) = (value) Fn; 7346d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Option); 7356d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 7366d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Val_int(0)); 7376d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen} 7386d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen 73946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */ 74046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty, 74146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 74246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty); 743b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry"); 74446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Fn; 74546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 74646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 74746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */ 74846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) { 74946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteFunction(Fn); 75046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 75146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 75246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 75346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */ 75446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) { 75546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMGetIntrinsicID(Fn)); 75646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 75746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 75846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */ 75946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) { 76046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetFunctionCallConv(Fn)); 76146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 76246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 76346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */ 76446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) { 76546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetFunctionCallConv(Fn, Int_val(Id)); 76646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 76746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 76846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 76980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */ 7705eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) { 7715eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen const char *GC; 77280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLparam0(); 77380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLlocal2(Name, Option); 77480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 7755eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if ((GC = LLVMGetGC(Fn))) { 7765eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen Name = copy_string(GC); 77780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 77880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen Option = alloc(1, 0); 77980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen Field(Option, 0) = Name; 78080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLreturn(Option); 78180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen } else { 78280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLreturn(Val_int(0)); 78380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen } 78480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 78580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 78680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */ 7875eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) { 7885eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0))); 78980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen return Val_unit; 79080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 79180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 792e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 793e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) { 794e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMAddFunctionAttr(Arg, 1<<Int_val(PA)); 795e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 796e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 797e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 798e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 799e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) { 800e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMRemoveFunctionAttr(Arg, 1<<Int_val(PA)); 801e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 802e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 8034733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/ 8044733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 8054733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent) 8064733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 8074733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */ 8084733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) { 8094733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return LLVMGetParam(Fn, Int_val(Index)); 8104733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen} 8114733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 8124733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */ 8134733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim value llvm_params(LLVMValueRef Fn, value Index) { 8144733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen value Params = alloc(LLVMCountParams(Fn), 0); 8154733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params)); 8164733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return Params; 8174733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen} 8184733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 819e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 820e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) { 821e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMAddAttribute(Arg, 1<<Int_val(PA)); 822e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 823e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 824e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 825e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 826e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) { 827e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMRemoveAttribute(Arg, 1<<Int_val(PA)); 828e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 829e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 830e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 831e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */ 832e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) { 833e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMSetParamAlignment(Arg, Int_val(align)); 834e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 835e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 836e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 83746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/ 83846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 8394733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS( 8404733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent) 8414733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 84246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */ 84346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) { 84446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0); 84546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray)); 84646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return MLArray; 84746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 84846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 84946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */ 85046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) { 85146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteBasicBlock(BB); 85246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 85346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 85446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 85546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */ 856b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name, 857b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMValueRef Fn) { 858b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name)); 85946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 86046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 86146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */ 862b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name, 863b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMBasicBlockRef BB) { 864b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name)); 86546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 86646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 86746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */ 86846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) { 86946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMValueIsBasicBlock(Val)); 87046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 87146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 872033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/ 873033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 874033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef, 875033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMGetInstructionParent) 876033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 877033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 878cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/ 879cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 880cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */ 881cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) { 882cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen return Val_int(LLVMGetInstructionCallConv(Inst)); 883cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen} 884cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 885cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */ 886cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) { 887cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen LLVMSetInstructionCallConv(Inst, Int_val(CC)); 888cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen return Val_unit; 889cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen} 890cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 891e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */ 892e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr, 893e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value index, 894e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value PA) { 895e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMAddInstrAttribute(Instr, Int_val(index), 1<<Int_val(PA)); 896e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 897e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 898e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 899e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */ 900e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr, 901e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value index, 902e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value PA) { 903e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMRemoveInstrAttribute(Instr, Int_val(index), 1<<Int_val(PA)); 904e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 905e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 906e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 90707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/ 90807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 90907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */ 91007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) { 91107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen return Val_bool(LLVMIsTailCall(CallInst)); 91207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen} 91307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 91407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */ 91507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall, 91607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen LLVMValueRef CallInst) { 91707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen LLVMSetTailCall(CallInst, Bool_val(IsTailCall)); 91807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen return Val_unit; 91907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen} 92007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 9212618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/ 9222618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 9232618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */ 9242618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) { 9252618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMAddIncoming(PhiNode, 9262618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMValueRef*) &Field(Incoming, 0), 9272618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMBasicBlockRef*) &Field(Incoming, 1), 9282618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 1); 9292618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen return Val_unit; 9302618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen} 9312618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 9322618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */ 9332618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) { 9342618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen unsigned I; 9352618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLparam0(); 9362618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLlocal3(Hd, Tl, Tmp); 9372618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 9382618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen /* Build a tuple list of them. */ 9392618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tl = Val_int(0); 9402618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen for (I = LLVMCountIncoming(PhiNode); I != 0; ) { 9412618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Hd = alloc(2, 0); 9422618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I)); 9432618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I)); 9442618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 9452618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tmp = alloc(2, 0); 9462618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Tmp, 0, Hd); 9472618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Tmp, 1, Tl); 9482618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tl = Tmp; 9492618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen } 9502618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 9512618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLreturn(Tl); 9522618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen} 9532618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 95446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 95546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/ 95646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 95746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v) (*(LLVMBuilderRef *)(Data_custom_val(v))) 95846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 959a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) { 96046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDisposeBuilder(Builder_val(B)); 96146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 96246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 96346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = { 96489f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands (char *) "IRBuilder", 96546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llvm_finalize_builder, 96646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_compare_default, 96746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_hash_default, 96846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_serialize_default, 96946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_deserialize_default 97046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}; 97146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 972a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) { 973a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1); 974a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen Builder_val(V) = B; 975a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen return V; 976a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen} 977a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen 9785371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */ 9795371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) { 9805371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return alloc_builder(LLVMCreateBuilderInContext(C)); 981a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen} 982a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen 983033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */ 984033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) { 985033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen if (Tag_val(Pos) == 0) { 986033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0)); 987033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMPositionBuilderAtEnd(Builder_val(B), BB); 988033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen } else { 989033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0)); 990033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMPositionBuilderBefore(Builder_val(B), I); 991033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen } 9928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 9938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 99446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 995dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */ 996628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) { 997dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B)); 998dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen if (!InsertBlock) 999dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen raise_not_found(); 1000dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen return InsertBlock; 1001dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen} 1002dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen 10035c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */ 1004628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) { 1005628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name)); 10065c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar return Val_unit; 10075c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar} 10085c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar 100946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/ 101046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 101146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 101246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) { 101346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildRetVoid(Builder_val(B)); 101446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 101546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 101646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */ 101746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) { 101846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildRet(Builder_val(B), Val); 101946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 102046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 10216793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */ 10226793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) { 10236793dd9769047706acf34420586716450344fb66Erick Tryzelaar return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals), 10246793dd9769047706acf34420586716450344fb66Erick Tryzelaar Wosize_val(RetVals)); 10256793dd9769047706acf34420586716450344fb66Erick Tryzelaar} 10266793dd9769047706acf34420586716450344fb66Erick Tryzelaar 102746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */ 102846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) { 102946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildBr(Builder_val(B), BB); 103046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 103146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 103246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */ 103346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If, 103446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Then, 103546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Else, 103646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 103746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildCondBr(Builder_val(B), If, Then, Else); 103846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 103946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 104046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */ 104146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of, 104246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Else, 104346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value EstimatedCount, 104446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 104546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount)); 104646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 104746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 10481430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */ 10491430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal, 105021491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen LLVMBasicBlockRef Dest) { 105121491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen LLVMAddCase(Switch, OnVal, Dest); 105221491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen return Val_unit; 105321491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen} 105421491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen 105546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> 105646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llbuilder -> llvalue */ 105746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args, 105846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Then, 105946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Catch, 106046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 106146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args), 106246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Wosize_val(Args), Then, Catch, String_val(Name)); 106346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 106446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 106546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> 106646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llbuilder -> llvalue */ 106746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) { 106846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1], 106946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMBasicBlockRef) Args[2], 107046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMBasicBlockRef) Args[3], 107146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Args[4], Args[5]); 107246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 107346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 107446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 107546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unwind(value B) { 107646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUnwind(Builder_val(B)); 107746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 107846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 107946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 108046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) { 108146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUnreachable(Builder_val(B)); 108246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 108346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 108446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/ 108546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 108646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 108746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS, 108846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 108946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name)); 109046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 109146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 109246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1093e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS, 1094e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1095e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name)); 1096e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1097e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1098e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 109919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS, 110019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 110119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name)); 110219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 110319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 110419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1105e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS, 1106e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1107e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name)); 1108e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1109e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1110e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 111146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS, 111246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 111346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name)); 111446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 111546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 111646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 111719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS, 111819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 111919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name)); 112019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 112119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 112219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 112319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS, 112419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 112519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name)); 112619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 112719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 112819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1129e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS, 1130e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1131e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name)); 1132e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1133e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1134e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 113546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS, 113646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 113746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name)); 113846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 113946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 114046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 114119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS, 114219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 114319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name)); 114419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 114519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 114619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 114719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS, 114819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 114919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name)); 115019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 115119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 115219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1153e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS, 1154e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1155e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name)); 1156e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1157e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1158e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 115946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS, 116046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 116146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name)); 116246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 116346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 116446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 116546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS, 116646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 116746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name)); 116846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 116946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 117046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1171e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS, 1172e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1173e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name)); 1174e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1175e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1176e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 117746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS, 117846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 117946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name)); 118046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 118146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 118246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 118346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS, 118446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 118546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name)); 118646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 118746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 118846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 118946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS, 119046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 119146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name)); 119246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 119346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 119446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 119546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS, 119646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 119746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name)); 119846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 119946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 120046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 120146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS, 120246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 120346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name)); 120446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 120546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 120646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 120746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS, 120846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 120946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name)); 121046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 121146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 121246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 121346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS, 121446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 121546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name)); 121646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 121746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 121846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 121946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS, 122046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 122146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name)); 122246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 122346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 122446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 122546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS, 122646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 122746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name)); 122846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 122946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 123046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 123146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS, 123246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 123346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name)); 123446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 123546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 123646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 123746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X, 123846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 123946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildNeg(Builder_val(B), X, String_val(Name)); 124046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 124146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 124246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 124319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X, 124419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 124519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name)); 124619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 124719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 124819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 124919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X, 125019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 125119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name)); 125219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 125319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 125419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 125519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X, 125619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 125719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildFNeg(Builder_val(B), X, String_val(Name)); 125819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 125919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 126019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 126146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X, 126246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 126346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildNot(Builder_val(B), X, String_val(Name)); 126446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 126546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 126646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/ 126746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 126846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */ 126946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty, 127046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 127146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name)); 127246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 127346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 127446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */ 127546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size, 127646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 127746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name)); 127846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 127946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 128046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 128146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer, 128246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 128346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name)); 128446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 128546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 128646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */ 128746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer, 128846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 128946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildStore(Builder_val(B), Value, Pointer); 129046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 129146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 129246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 129346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices, 129446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 129546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildGEP(Builder_val(B), Pointer, 129646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices), 129746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 129846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 129946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1300e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 1301e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer, 1302e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Indices, value Name, 1303e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1304e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildInBoundsGEP(Builder_val(B), Pointer, 1305e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar (LLVMValueRef *) Op_val(Indices), 1306e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar Wosize_val(Indices), String_val(Name)); 1307e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1308e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1309e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */ 1310e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer, 1311c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner value Index, value Name, 1312e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1313c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner return LLVMBuildStructGEP(Builder_val(B), Pointer, 1314c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner Int_val(Index), String_val(Name)); 1315e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1316e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1317e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */ 1318e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) { 1319e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildGlobalString(Builder_val(B), String_val(Str), 1320e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1321e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1322e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1323e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */ 1324e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name, 1325e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1326e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str), 1327e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1328e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1329e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 133046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/ 133146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 133246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 133346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty, 133446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 133546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name)); 133646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 133746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 133846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 133946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty, 134046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 134146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name)); 134246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 134346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 134446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 134546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty, 134646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 134746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name)); 134846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 134946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 135046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 135146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty, 135246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 135346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name)); 135446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 135546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 135646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 135746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty, 135846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 135946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name)); 136046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 136146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 136246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 136346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty, 136446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 136546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name)); 136646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 136746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 136846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 136946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty, 137046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 137146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name)); 137246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 137346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 137446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 137546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty, 137646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 137746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name)); 137846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 137946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 138046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 138146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty, 138246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 138346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name)); 138446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 138546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 138646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 138746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty, 138846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 138946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name)); 139046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 139146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 139246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 139346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty, 139446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 139546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name)); 139646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 139746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 139846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 139946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 140046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 140146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name)); 140246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 140346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1404e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1405e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 1406e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1407e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1408e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1409e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1410e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1411e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 1412e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1413e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1414e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1415e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1416e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1417e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X, 1418e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar LLVMTypeRef Ty, value Name, 1419e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1420e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1421e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1422e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1423e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1424e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty, 1425e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1426e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name)); 1427e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1428e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1429e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1430e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty, 1431e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1432e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name)); 1433e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1434e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1435e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1436e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty, 1437e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1438e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name)); 1439e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1440e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 144146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/ 144246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1443404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 144446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred, 144546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef LHS, LLVMValueRef RHS, 144646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 144746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS, 144846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 144946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 145046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1451404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 145246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred, 145346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef LHS, LLVMValueRef RHS, 145446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 145546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS, 145646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 145746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 145846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 145946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/ 146046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 14612618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */ 14622618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) { 14632618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen value Hd, Tl; 14642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMValueRef FirstValue, PhiNode; 14652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 14662618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!"); 14672618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 14682618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Hd = Field(Incoming, 0); 14692618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen FirstValue = (LLVMValueRef) Field(Hd, 0); 14702618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue), 14712618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen String_val(Name)); 14722618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 14732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) { 14742618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen value Hd = Field(Tl, 0); 14752618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0), 14762618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMBasicBlockRef*) &Field(Hd, 1), 1); 14772618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen } 14782618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 14792618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen return PhiNode; 148046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 148146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 148246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 148346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params, 148446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 148546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params), 148646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Wosize_val(Params), String_val(Name)); 148746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 148846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 148946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 149046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If, 149146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Then, LLVMValueRef Else, 149246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name)); 149446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 149546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 149646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 149746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty, 149846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 149946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name)); 150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec, 150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Idx, 150546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 150646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name)); 150746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 150846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 150946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 151046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec, 151146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Element, 151246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Idx, 151346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 151446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx, 151546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 151646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 151746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2, 152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Mask, 152146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 152246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name)); 152346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 152446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1525e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */ 1526e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate, 1527e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Idx, value Name, value B) { 1528e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx), 1529e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1530e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1531e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1532e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */ 1533e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate, 1534e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar LLVMValueRef Val, value Idx, 1535e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1536e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx), 1537e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1538e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1539e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1540e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 1541e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name, 1542e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1543e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name)); 1544e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1545e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1546e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 1547e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name, 1548e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1549e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name)); 1550e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1551e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1552e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1553e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS, 1554e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1555e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name)); 1556e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 15571ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen 15581ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen/*===-- Module Providers --------------------------------------------------===*/ 15591ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen 15601ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen/* llmoduleprovider -> unit */ 15611ae6135fa37eb061499d079b9b33dc82dcc1283fGordon HenriksenCAMLprim value llvm_dispose_module_provider(LLVMModuleProviderRef MP) { 15621ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen LLVMDisposeModuleProvider(MP); 15631ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen return Val_unit; 15641ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen} 1565da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1566da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1567da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/ 1568da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1569da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer 1570da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen raises IoError msg on error */ 1571da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) { 1572da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLparam1(Path); 1573da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen char *Message; 1574da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMMemoryBufferRef MemBuf; 1575da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1576da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path), 1577da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen &MemBuf, &Message)) 1578da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen llvm_raise(llvm_ioerror_exn, Message); 1579da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1580da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLreturn((value) MemBuf); 1581da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 1582da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1583da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer 1584da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen raises IoError msg on error */ 1585da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) { 1586da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen char *Message; 1587da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMMemoryBufferRef MemBuf; 1588da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1589da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message)) 1590da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen llvm_raise(llvm_ioerror_exn, Message); 1591da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1592da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return MemBuf; 1593da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 1594da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1595da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */ 1596da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) { 1597da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMDisposeMemoryBuffer(MemBuf); 1598da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return Val_unit; 1599da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 1600da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1601d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/ 1602d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1603d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */ 1604d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) { 1605d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return LLVMCreatePassManager(); 1606d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1607d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1608d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */ 1609d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M, 1610d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMPassManagerRef PM) { 1611d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMRunPassManager(PM, M)); 1612d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1613d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1614d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */ 1615d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) { 1616d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMInitializeFunctionPassManager(FPM)); 1617d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1618d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1619d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */ 1620d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F, 1621d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMPassManagerRef FPM) { 1622d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMRunFunctionPassManager(FPM, F)); 1623d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1624d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1625d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */ 1626d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) { 1627d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMFinalizeFunctionPassManager(FPM)); 1628d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1629d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1630d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */ 1631d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) { 1632d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMDisposePassManager(PM); 1633d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_unit; 1634d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1635