llvm_ocaml.c revision 8e130b1d0d53346e05d0a1161a52c6d62de163c4
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 11346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> int */ 11446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_mdkind_id(LLVMContextRef C, value Name) { 11546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar unsigned MDKindID = LLVMGetMDKindIDInContext(C, String_val(Name), 11646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar caml_string_length(Name)); 11746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_int(MDKindID); 11846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 11946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 1208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/ 1218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 122263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar/* llcontext -> string -> llmodule */ 123263d989a719c1864862fc91f59193a6c2b55ca48Erick TryzelaarCAMLprim LLVMModuleRef llvm_create_module(LLVMContextRef C, value ModuleID) { 124263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar return LLVMModuleCreateWithNameInContext(String_val(ModuleID), C); 1258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */ 12846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) { 12946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDisposeModule(M); 1308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 1318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 133a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */ 134a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_target_triple(LLVMModuleRef M) { 135a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return copy_string(LLVMGetTarget(M)); 136a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 137a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 138a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */ 139a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_target_triple(value Trip, LLVMModuleRef M) { 140a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen LLVMSetTarget(M, String_val(Trip)); 141a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return Val_unit; 142a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 143a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 144a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */ 145a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_data_layout(LLVMModuleRef M) { 146a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return copy_string(LLVMGetDataLayout(M)); 147a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 148a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 149a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */ 150a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_data_layout(value Layout, LLVMModuleRef M) { 151a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen LLVMSetDataLayout(M, String_val(Layout)); 152a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return Val_unit; 153a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 154a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 1558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> lltype -> llmodule -> bool */ 15646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_add_type_name(value Name, LLVMTypeRef Ty, LLVMModuleRef M) { 15746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen int res = LLVMAddTypeName(M, String_val(Name), Ty); 1588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_bool(res == 0); 1598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 16146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llmodule -> unit */ 16246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_type_name(value Name, LLVMModuleRef M) { 16346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteTypeName(M, String_val(Name)); 16446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 16546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 16646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 167af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen/* llmodule -> unit */ 168af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon HenriksenCAMLprim value llvm_dump_module(LLVMModuleRef M) { 169af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen LLVMDumpModule(M); 170af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen return Val_unit; 171af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen} 172af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen 1738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/ 1758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 176404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* lltype -> TypeKind.t */ 17746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) { 17846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetTypeKind(Ty)); 1798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* lltype -> llcontext */ 1825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_type_context(LLVMTypeRef Ty) { 1835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMGetTypeContext(Ty); 1845371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar} 1855371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar 1868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/ 1878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 188b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 189b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i1_type (LLVMContextRef Context) { 190b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt1TypeInContext(Context); 191b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 192b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 193b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 194b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i8_type (LLVMContextRef Context) { 195b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt8TypeInContext(Context); 196b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 197b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 198b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 199b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i16_type (LLVMContextRef Context) { 200b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt16TypeInContext(Context); 201b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 202b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 203b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 204b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i32_type (LLVMContextRef Context) { 205b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt32TypeInContext(Context); 206b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 207b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 208b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 209b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i64_type (LLVMContextRef Context) { 210b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt64TypeInContext(Context); 211b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 2128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 213b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> int -> lltype */ 214b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_integer_type(LLVMContextRef Context, value Width) { 215b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMIntTypeInContext(Context, Int_val(Width)); 2168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 21946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) { 22046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetIntTypeWidth(IntegerTy)); 2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/ 2248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 225b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 226b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_float_type(LLVMContextRef Context) { 227b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMFloatTypeInContext(Context); 2288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 230b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 231b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_double_type(LLVMContextRef Context) { 232b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMDoubleTypeInContext(Context); 2338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 235b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 236b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_x86fp80_type(LLVMContextRef Context) { 237b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMX86FP80TypeInContext(Context); 2388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 240b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 241b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_fp128_type(LLVMContextRef Context) { 242b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMFP128TypeInContext(Context); 2438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 245b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 246b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_ppc_fp128_type(LLVMContextRef Context) { 247b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMPPCFP128TypeInContext(Context); 2488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/ 2518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 252957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */ 253957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) { 25481a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys, 255957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen Wosize_val(ParamTys), 0); 256957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen} 257957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen 258957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */ 259957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy, 260957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen value ParamTys) { 261957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys, 262957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen Wosize_val(ParamTys), 1); 2638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */ 26646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) { 26746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsFunctionVarArg(FunTy)); 2688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 27146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) { 27246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Tys = alloc(LLVMCountParamTypes(FunTy), 0); 27346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys); 27446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Tys; 2758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/ 2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2795371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */ 2805371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_struct_type(LLVMContextRef C, value ElementTypes) { 2815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes, 2825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementTypes), 0); 283957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen} 284957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen 2855371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */ 2865371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C, 2875371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar value ElementTypes) { 2885371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes, 2895371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementTypes), 1); 2908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 2931940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) { 29446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0); 29546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys); 29646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Tys; 2978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 29946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */ 30046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) { 30146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsPackedStruct(StructTy)); 3028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3041940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar/*--... Operations on union types ..........................................--*/ 3051940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar 3061940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar/* llcontext -> lltype array -> lltype */ 3071940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim LLVMTypeRef llvm_union_type(LLVMContextRef C, value ElementTypes) { 3081940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar return LLVMUnionTypeInContext(C, (LLVMTypeRef *) ElementTypes, 3091940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar Wosize_val(ElementTypes)); 3101940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar} 3111940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar 3121940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar/* lltype -> lltype array */ 3131940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_union_element_types(LLVMTypeRef UnionTy) { 3141940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar value Tys = alloc(LLVMCountUnionElementTypes(UnionTy), 0); 3151940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar LLVMGetUnionElementTypes(UnionTy, (LLVMTypeRef *) Tys); 3161940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar return Tys; 3171940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar} 3181940dd10dd6b79e3332f384756c268b85d0ad400Erick Tryzelaar 3198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/ 3208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 322957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) { 32381a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMArrayType(ElementTy, Int_val(Count)); 3248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 32657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */ 32757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) { 32857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMPointerType(ElementTy, 0); 32957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 33057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 33157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */ 33257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy, 33357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen value AddressSpace) { 33457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMPointerType(ElementTy, Int_val(AddressSpace)); 33557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 33657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 3378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 338957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) { 33981a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMVectorType(ElementTy, Int_val(Count)); 3408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 34346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) { 34446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetArrayLength(ArrayTy)); 3458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 34857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) { 34957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return Val_int(LLVMGetPointerAddressSpace(PtrTy)); 35057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 35157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 35257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */ 35346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) { 35446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetVectorSize(VectorTy)); 3558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/ 3588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 359b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 360b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) { 361b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMVoidTypeInContext(Context); 362b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 363b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 364b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 365b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) { 366b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMLabelTypeInContext(Context); 367b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 3688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 369b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 370b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_opaque_type(LLVMContextRef Context) { 371b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMOpaqueTypeInContext(Context); 3728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3741cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen/*--... Operations on type handles .........................................--*/ 3751cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3761cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen#define Typehandle_val(v) (*(LLVMTypeHandleRef *)(Data_custom_val(v))) 3771cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3782e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void llvm_finalize_handle(value TH) { 3791cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen LLVMDisposeTypeHandle(Typehandle_val(TH)); 3801cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen} 3811cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3821cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksenstatic struct custom_operations typehandle_ops = { 3831cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen (char *) "LLVMTypeHandle", 3841cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen llvm_finalize_handle, 3851cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen custom_compare_default, 3861cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen custom_hash_default, 3871cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen custom_serialize_default, 3881cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen custom_deserialize_default 3891cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen}; 3901cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3911cf08fddc7413076dedad58dbb8d8d67e69a490fGordon HenriksenCAMLprim value llvm_handle_to_type(LLVMTypeRef PATy) { 3921cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen value TH = alloc_custom(&typehandle_ops, sizeof(LLVMBuilderRef), 0, 1); 3931cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen Typehandle_val(TH) = LLVMCreateTypeHandle(PATy); 3941cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen return TH; 3951cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen} 3961cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 3971cf08fddc7413076dedad58dbb8d8d67e69a490fGordon HenriksenCAMLprim LLVMTypeRef llvm_type_of_handle(value TH) { 3981cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen return LLVMResolveTypeHandle(Typehandle_val(TH)); 3991cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen} 4001cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 4011cf08fddc7413076dedad58dbb8d8d67e69a490fGordon HenriksenCAMLprim value llvm_refine_type(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy){ 40283eaae19add8031b299fc657cb69ceb5bfa44ae4Gordon Henriksen LLVMRefineType(AbstractTy, ConcreteTy); 4031cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen return Val_unit; 4041cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen} 4051cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen 4068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/ 4088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */ 41046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) { 41146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMTypeOf(Val); 4128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 41546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) { 41646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return copy_string(LLVMGetValueName(Val)); 4178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 42046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) { 42146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetValueName(Val, String_val(Name)); 4228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 4238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 42588cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */ 42688cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) { 42788cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen LLVMDumpValue(Val); 42888cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen return Val_unit; 42988cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen} 43088cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen 4318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/ 4328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 43446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) { 43546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsConstant(Val)); 436344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 437344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 438344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 43946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) { 44046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsNull(Val)); 4418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 443344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 44446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) { 44546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsUndef(Val)); 446344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 447344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 44846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/ 44946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 45046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */ 45146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) { 45246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_bool(LLVMHasMetadata(Val)); 45346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 45446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 45546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */ 45646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) { 45746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLparam1(MDKindID); 45846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMValueRef MD; 45946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) { 46046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar value Option = alloc(1, 0); 46146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar Field(Option, 0) = (value) MD; 46246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Option); 46346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar } 46446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Val_int(0)); 46546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 46646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 46746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */ 46846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID, 46946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMValueRef MD) { 47046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetMetadata(Val, Int_val(MDKindID), MD); 47146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 47246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 47346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 47446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */ 47546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) { 47646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetMetadata(Val, Int_val(MDKindID), NULL); 47746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 47846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 47946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 48046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 48146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/ 48246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 48346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */ 48446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) { 48546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return LLVMMDStringInContext(C, String_val(S), caml_string_length(S)); 48646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 48746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 48846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 48946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) { 49046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals), 49146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar Wosize_val(ElementVals)); 49246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 49346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 4948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/ 4958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 496e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */ 497e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) { 498e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstInt(IntTy, (long long) Int_val(N), 1); 4998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 501344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */ 502e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N, 503e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen value SExt) { 504e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt)); 505344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 506344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 50745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */ 50845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S, 50945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar value Radix) { 51045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S), 51145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar Int_val(Radix)); 51245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar} 51345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar 5148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */ 515e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) { 516e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstReal(RealTy, Double_val(N)); 5178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 51945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */ 52045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) { 52145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar return LLVMConstRealOfStringAndSize(RealTy, String_val(S), 52245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar caml_string_length(S)); 52345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar} 52445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar 5258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/ 5268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 527b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */ 528b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str, 529b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar value NullTerminate) { 530b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMConstStringInContext(Context, String_val(Str), string_length(Str), 531b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 1); 532e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen} 533e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen 534b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */ 535b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str, 536b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar value NullTerminate) { 537b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMConstStringInContext(Context, String_val(Str), string_length(Str), 538b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 0); 5398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */ 542e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy, 54346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value ElementVals) { 544e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals), 545e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen Wosize_val(ElementVals)); 546e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen} 547e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen 5485371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 5495371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) { 5505371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals), 5515371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementVals), 0); 5528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5545371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 5555371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C, 5565371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar value ElementVals) { 5575371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals), 5585371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementVals), 1); 5598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */ 562e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) { 563e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals), 564e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen Wosize_val(ElementVals)); 5654647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 5664647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 5674647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/ 5684647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 569404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */ 5704647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred, 5714647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef LHSConstant, 5724647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef RHSConstant) { 5734647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant); 5744647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 5754647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 576404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */ 5774647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred, 5784647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef LHSConstant, 5794647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef RHSConstant) { 5804647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant); 5814647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 5824647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 5834647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */ 5844647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) { 5854647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices), 5864647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen Wosize_val(Indices)); 5878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5891b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */ 5901b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal, 5911b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar value Indices) { 5921b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices), 5931b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar Wosize_val(Indices)); 5941b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 5951b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 5961b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */ 5971b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate, 5981b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar value Indices) { 5991b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLparam1(Indices); 6001b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int size = Wosize_val(Indices); 6011b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int i; 6021b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef result; 6031b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 6041b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned)); 6051b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar for (i = 0; i < size; i++) { 6061b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar idxs[i] = Int_val(Field(Indices, i)); 6071b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar } 6081b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 6091b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar result = LLVMConstExtractValue(Aggregate, idxs, size); 6101b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar free(idxs); 6111b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLreturnT(LLVMValueRef, result); 6121b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 6131b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 6141b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */ 6151b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate, 6161b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef Val, value Indices) { 6171b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLparam1(Indices); 6181b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int size = Wosize_val(Indices); 6191b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int i; 6201b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef result; 6211b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 6221b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned)); 6231b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar for (i = 0; i < size; i++) { 6241b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar idxs[i] = Int_val(Field(Indices, i)); 6251b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar } 6261b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 6271b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar result = LLVMConstInsertValue(Aggregate, Val, idxs, size); 6281b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar free(idxs); 6291b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLreturnT(LLVMValueRef, result); 6301b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 6311b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 6328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/ 6338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 63546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) { 63646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsDeclaration(Global)); 6378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 639404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */ 64046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) { 64146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetLinkage(Global)); 6428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 644404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */ 64546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) { 64646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetLinkage(Global, Int_val(Linkage)); 6478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 65146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) { 65246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return copy_string(LLVMGetSection(Global)); 6538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 65646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) { 65746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetSection(Global, String_val(Section)); 6588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 661404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */ 66246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) { 66346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetVisibility(Global)); 6648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 666404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */ 66746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) { 66846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetVisibility(Global, Int_val(Viz)); 6698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */ 67346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) { 67446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetAlignment(Global)); 6758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */ 67846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) { 67946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetAlignment(Global, Int_val(Bytes)); 6808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 6818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/ 6848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6854733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef, 6864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetGlobalParent) 6874733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 6888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */ 68946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name, 69046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 6916d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef GlobalVar; 6926d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 6936d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) 69457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0)); 6956d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen return GlobalVar; 6966d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 69746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMAddGlobal(M, Ty, String_val(Name)); 6988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7008e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */ 7018e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name, 7028e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar value AddressSpace, 7038e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMModuleRef M) { 7048e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMValueRef GlobalVar; 7058e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 7068e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) 7078e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return LLVMConstBitCast(GlobalVar, 7088e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMPointerType(Ty, Int_val(AddressSpace))); 7098e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return GlobalVar; 7108e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar } 7118e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return LLVMAddGlobal(M, Ty, String_val(Name)); 7128e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar} 7138e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar 7146d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */ 7156d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) { 7166d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLparam1(Name); 7176d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef GlobalVar; 7186d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 71975e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen value Option = alloc(1, 0); 7206d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen Field(Option, 0) = (value) GlobalVar; 7216d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Option); 7226d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 7236d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Val_int(0)); 7246d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen} 7256d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen 7268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */ 72746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer, 72846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 72946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer), 7308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen String_val(Name)); 7318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetInitializer(GlobalVar, Initializer); 73246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return GlobalVar; 7338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7358e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */ 7368e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name, 7378e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMValueRef Initializer, 7388e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar value AddressSpace, 7398e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMModuleRef M) { 7408e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M, 7418e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMTypeOf(Initializer), 7428e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar String_val(Name), 7438e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar Int_val(AddressSpace)); 7448e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMSetInitializer(GlobalVar, Initializer); 7458e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return GlobalVar; 7468e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar} 7478e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar 7488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 74946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) { 75046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteGlobal(GlobalVar); 7518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 7528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */ 75546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal, 75646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar) { 75746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetInitializer(GlobalVar, ConstantVal); 7588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 7598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 76246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) { 76346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetInitializer(GlobalVar, NULL); 7648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 7658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 76846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) { 76946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsThreadLocal(GlobalVar)); 7708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */ 77346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal, 77446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar) { 77546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal)); 77646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 77746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 77846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 779c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */ 780c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) { 781c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen return Val_bool(LLVMIsGlobalConstant(GlobalVar)); 782c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen} 783c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen 784c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */ 785c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) { 786c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag)); 787c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen return Val_unit; 788c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen} 789c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen 79046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/ 79146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 7924733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef, 7934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetGlobalParent) 7944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 79546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */ 79646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty, 79746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 7986d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef Fn; 7996d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { 8006d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty) 80157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0)); 8026d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen return Fn; 8036d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 80446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMAddFunction(M, String_val(Name), Ty); 80546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 80646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 8076d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */ 8086d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) { 8096d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLparam1(Name); 8106d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef Fn; 8116d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { 81275e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen value Option = alloc(1, 0); 8136d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen Field(Option, 0) = (value) Fn; 8146d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Option); 8156d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 8166d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Val_int(0)); 8176d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen} 8186d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen 81946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */ 82046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty, 82146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 82246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty); 823b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry"); 82446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Fn; 82546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 82646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 82746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */ 82846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) { 82946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteFunction(Fn); 83046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 83146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 83246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 83346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */ 83446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) { 83546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMGetIntrinsicID(Fn)); 83646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 83746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 83846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */ 83946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) { 84046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetFunctionCallConv(Fn)); 84146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 84246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 84346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */ 84446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) { 84546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetFunctionCallConv(Fn, Int_val(Id)); 84646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 84746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 84846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 84980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */ 8505eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) { 8515eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen const char *GC; 85280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLparam0(); 85380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLlocal2(Name, Option); 85480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 8555eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if ((GC = LLVMGetGC(Fn))) { 8565eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen Name = copy_string(GC); 85780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 85880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen Option = alloc(1, 0); 85980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen Field(Option, 0) = Name; 86080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLreturn(Option); 86180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen } else { 86280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLreturn(Val_int(0)); 86380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen } 86480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 86580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 86680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */ 8675eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) { 8685eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0))); 86980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen return Val_unit; 87080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 87180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 872e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 873e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) { 874e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMAddFunctionAttr(Arg, 1<<Int_val(PA)); 875e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 876e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 877e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 878e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 879e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) { 880e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMRemoveFunctionAttr(Arg, 1<<Int_val(PA)); 881e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 882e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 8834733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/ 8844733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 8854733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent) 8864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 8874733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */ 8884733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) { 8894733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return LLVMGetParam(Fn, Int_val(Index)); 8904733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen} 8914733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 8924733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */ 8934733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim value llvm_params(LLVMValueRef Fn, value Index) { 8944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen value Params = alloc(LLVMCountParams(Fn), 0); 8954733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params)); 8964733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return Params; 8974733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen} 8984733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 899e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 900e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) { 901e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMAddAttribute(Arg, 1<<Int_val(PA)); 902e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 903e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 904e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 905e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 906e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) { 907e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMRemoveAttribute(Arg, 1<<Int_val(PA)); 908e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 909e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 910e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 911e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */ 912e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) { 913e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMSetParamAlignment(Arg, Int_val(align)); 914e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 915e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 916e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 91746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/ 91846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 9194733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS( 9204733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent) 9214733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 92246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */ 92346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) { 92446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0); 92546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray)); 92646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return MLArray; 92746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 92846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 92946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */ 93046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) { 93146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteBasicBlock(BB); 93246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 93346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 93446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 93546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */ 936b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name, 937b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMValueRef Fn) { 938b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name)); 93946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 94046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 94146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */ 942b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name, 943b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMBasicBlockRef BB) { 944b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name)); 94546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 94646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 94746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */ 94846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) { 94946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMValueIsBasicBlock(Val)); 95046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 95146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 952033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/ 953033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 954033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef, 955033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMGetInstructionParent) 956033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 957033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 958cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/ 959cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 960cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */ 961cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) { 962cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen return Val_int(LLVMGetInstructionCallConv(Inst)); 963cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen} 964cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 965cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */ 966cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) { 967cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen LLVMSetInstructionCallConv(Inst, Int_val(CC)); 968cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen return Val_unit; 969cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen} 970cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 971e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */ 972e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr, 973e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value index, 974e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value PA) { 975e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMAddInstrAttribute(Instr, Int_val(index), 1<<Int_val(PA)); 976e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 977e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 978e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 979e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */ 980e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr, 981e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value index, 982e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value PA) { 983e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMRemoveInstrAttribute(Instr, Int_val(index), 1<<Int_val(PA)); 984e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 985e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 986e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 98707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/ 98807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 98907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */ 99007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) { 99107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen return Val_bool(LLVMIsTailCall(CallInst)); 99207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen} 99307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 99407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */ 99507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall, 99607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen LLVMValueRef CallInst) { 99707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen LLVMSetTailCall(CallInst, Bool_val(IsTailCall)); 99807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen return Val_unit; 99907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen} 100007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 10012618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/ 10022618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 10032618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */ 10042618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) { 10052618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMAddIncoming(PhiNode, 10062618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMValueRef*) &Field(Incoming, 0), 10072618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMBasicBlockRef*) &Field(Incoming, 1), 10082618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 1); 10092618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen return Val_unit; 10102618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen} 10112618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 10122618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */ 10132618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) { 10142618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen unsigned I; 10152618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLparam0(); 10162618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLlocal3(Hd, Tl, Tmp); 10172618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 10182618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen /* Build a tuple list of them. */ 10192618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tl = Val_int(0); 10202618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen for (I = LLVMCountIncoming(PhiNode); I != 0; ) { 10212618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Hd = alloc(2, 0); 10222618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I)); 10232618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I)); 10242618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 10252618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tmp = alloc(2, 0); 10262618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Tmp, 0, Hd); 10272618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Tmp, 1, Tl); 10282618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tl = Tmp; 10292618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen } 10302618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 10312618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLreturn(Tl); 10322618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen} 10332618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 103446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 103546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/ 103646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 103746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v) (*(LLVMBuilderRef *)(Data_custom_val(v))) 103846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1039a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) { 104046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDisposeBuilder(Builder_val(B)); 104146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 104246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 104346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = { 104489f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands (char *) "IRBuilder", 104546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llvm_finalize_builder, 104646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_compare_default, 104746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_hash_default, 104846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_serialize_default, 104946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_deserialize_default 105046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}; 105146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1052a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) { 1053a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1); 1054a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen Builder_val(V) = B; 1055a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen return V; 1056a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen} 1057a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen 10585371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */ 10595371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) { 10605371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return alloc_builder(LLVMCreateBuilderInContext(C)); 1061a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen} 1062a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen 1063033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */ 1064033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) { 1065033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen if (Tag_val(Pos) == 0) { 1066033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0)); 1067033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMPositionBuilderAtEnd(Builder_val(B), BB); 1068033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen } else { 1069033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0)); 1070033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMPositionBuilderBefore(Builder_val(B), I); 1071033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen } 10728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 10738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 107446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1075dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */ 1076628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) { 1077dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B)); 1078dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen if (!InsertBlock) 1079dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen raise_not_found(); 1080dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen return InsertBlock; 1081dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen} 1082dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen 10835c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */ 1084628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) { 1085628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name)); 10865c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar return Val_unit; 10875c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar} 10885c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar 108946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/ 109046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 109146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */ 109246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) { 109346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetCurrentDebugLocation(Builder_val(B), V); 109446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 109546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 109646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 109746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */ 109846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) { 109946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetCurrentDebugLocation(Builder_val(B), NULL); 110046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 110146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 110246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 110346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */ 110446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) { 110546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLparam0(); 110646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMValueRef L; 110746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) { 110846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar value Option = alloc(1, 0); 110946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar Field(Option, 0) = (value) L; 111046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Option); 111146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar } 111246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Val_int(0)); 111346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 111446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 111546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */ 111646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) { 111746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetInstDebugLocation(Builder_val(B), V); 111846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 111946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 112046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 112146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 112246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/ 112346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 112446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 112546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) { 112646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildRetVoid(Builder_val(B)); 112746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 112846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 112946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */ 113046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) { 113146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildRet(Builder_val(B), Val); 113246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 113346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 11346793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */ 11356793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) { 11366793dd9769047706acf34420586716450344fb66Erick Tryzelaar return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals), 11376793dd9769047706acf34420586716450344fb66Erick Tryzelaar Wosize_val(RetVals)); 11386793dd9769047706acf34420586716450344fb66Erick Tryzelaar} 11396793dd9769047706acf34420586716450344fb66Erick Tryzelaar 114046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */ 114146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) { 114246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildBr(Builder_val(B), BB); 114346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 114446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 114546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */ 114646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If, 114746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Then, 114846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Else, 114946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 115046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildCondBr(Builder_val(B), If, Then, Else); 115146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 115246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 115346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */ 115446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of, 115546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Else, 115646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value EstimatedCount, 115746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 115846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount)); 115946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 116046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 11611430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */ 11621430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal, 116321491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen LLVMBasicBlockRef Dest) { 116421491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen LLVMAddCase(Switch, OnVal, Dest); 116521491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen return Val_unit; 116621491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen} 116721491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen 1168c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */ 1169c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr, 1170c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar value EstimatedDests, 1171c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar value B) { 1172c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests); 1173c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar} 1174c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar 1175c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */ 1176c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr, 1177c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar LLVMBasicBlockRef Dest) { 1178c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar LLVMAddDestination(IndirectBr, Dest); 1179c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar return Val_unit; 1180c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar} 1181c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar 118246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> 118346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llbuilder -> llvalue */ 118446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args, 118546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Then, 118646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Catch, 118746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 118846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args), 118946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Wosize_val(Args), Then, Catch, String_val(Name)); 119046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 119146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 119246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> 119346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llbuilder -> llvalue */ 119446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) { 119546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1], 119646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMBasicBlockRef) Args[2], 119746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMBasicBlockRef) Args[3], 119846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Args[4], Args[5]); 119946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 120046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 120146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 120246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unwind(value B) { 120346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUnwind(Builder_val(B)); 120446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 120546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 120646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 120746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) { 120846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUnreachable(Builder_val(B)); 120946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 121046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 121146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/ 121246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 121346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 121446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS, 121546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 121646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name)); 121746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 121846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 121946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1220e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS, 1221e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1222e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name)); 1223e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1224e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1225e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 122619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS, 122719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 122819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name)); 122919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 123019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 123119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1232e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS, 1233e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1234e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name)); 1235e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1236e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1237e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 123846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS, 123946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 124046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name)); 124146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 124246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 124346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 124419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS, 124519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 124619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name)); 124719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 124819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 124919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 125019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS, 125119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 125219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name)); 125319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 125419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 125519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1256e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS, 1257e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1258e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name)); 1259e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1260e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1261e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 126246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS, 126346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 126446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name)); 126546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 126646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 126746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 126819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS, 126919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 127019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name)); 127119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 127219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 127319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 127419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS, 127519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 127619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name)); 127719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 127819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 127919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1280e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS, 1281e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1282e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name)); 1283e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1284e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1285e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 128646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS, 128746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 128846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name)); 128946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 129046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 129146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 129246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS, 129346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 129446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name)); 129546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 129646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 129746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1298e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS, 1299e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1300e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name)); 1301e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1302e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1303e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 130446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS, 130546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 130646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name)); 130746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 130846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 130946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 131046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS, 131146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 131246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name)); 131346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 131446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 131546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 131646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS, 131746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 131846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name)); 131946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 132046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 132146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 132246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS, 132346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 132446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name)); 132546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 132646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 132746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 132846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS, 132946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 133046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name)); 133146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 133246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 133346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 133446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS, 133546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 133646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name)); 133746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 133846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 133946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 134046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS, 134146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 134246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name)); 134346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 134446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 134546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 134646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS, 134746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 134846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name)); 134946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 135046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 135146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 135246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS, 135346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 135446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name)); 135546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 135646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 135746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 135846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS, 135946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 136046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name)); 136146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 136246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 136346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 136446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X, 136546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 136646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildNeg(Builder_val(B), X, String_val(Name)); 136746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 136846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 136946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 137019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X, 137119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 137219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name)); 137319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 137419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 137519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 137619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X, 137719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 137819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name)); 137919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 138019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 138119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 138219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X, 138319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 138419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildFNeg(Builder_val(B), X, String_val(Name)); 138519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 138619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 138719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 138846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X, 138946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 139046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildNot(Builder_val(B), X, String_val(Name)); 139146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 139246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 139346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/ 139446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 139546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */ 139646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty, 139746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 139846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name)); 139946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 140046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 140146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */ 140246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size, 140346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 140446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name)); 140546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 140646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 140746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 140846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer, 140946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 141046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name)); 141146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 141246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 141346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */ 141446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer, 141546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 141646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildStore(Builder_val(B), Value, Pointer); 141746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 141846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 141946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 142046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices, 142146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 142246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildGEP(Builder_val(B), Pointer, 142346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices), 142446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 142546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 142646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1427e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 1428e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer, 1429e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Indices, value Name, 1430e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1431e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildInBoundsGEP(Builder_val(B), Pointer, 1432e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar (LLVMValueRef *) Op_val(Indices), 1433e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar Wosize_val(Indices), String_val(Name)); 1434e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1435e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1436e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */ 1437e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer, 1438c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner value Index, value Name, 1439e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1440c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner return LLVMBuildStructGEP(Builder_val(B), Pointer, 1441c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner Int_val(Index), String_val(Name)); 1442e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1443e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1444e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */ 1445e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) { 1446e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildGlobalString(Builder_val(B), String_val(Str), 1447e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1448e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1449e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1450e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */ 1451e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name, 1452e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1453e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str), 1454e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1455e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1456e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 145746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/ 145846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 145946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 146046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty, 146146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 146246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name)); 146346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 146446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 146546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 146646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty, 146746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 146846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name)); 146946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 147046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 147146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 147246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty, 147346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 147446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name)); 147546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 147646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 147746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 147846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty, 147946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 148046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name)); 148146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 148246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 148346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 148446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty, 148546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 148646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name)); 148746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 148846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 148946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 149046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty, 149146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 149246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name)); 149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 149446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 149546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 149646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty, 149746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 149846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name)); 149946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty, 150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name)); 150546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 150646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 150746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 150846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty, 150946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 151046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name)); 151146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 151246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 151346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 151446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty, 151546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 151646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name)); 151746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty, 152146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 152246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name)); 152346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 152446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 152546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 152646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 152746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 152846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name)); 152946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 153046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1531e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1532e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 1533e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1534e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1535e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1536e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1537e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1538e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 1539e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1540e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1541e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1542e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1543e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1544e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X, 1545e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar LLVMTypeRef Ty, value Name, 1546e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1547e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1548e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1549e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1550e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1551e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty, 1552e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1553e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name)); 1554e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1555e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1556e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1557e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty, 1558e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1559e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name)); 1560e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1561e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1562e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1563e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty, 1564e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1565e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name)); 1566e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1567e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 156846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/ 156946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1570404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 157146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred, 157246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef LHS, LLVMValueRef RHS, 157346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 157446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS, 157546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 157646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 157746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1578404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 157946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred, 158046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef LHS, LLVMValueRef RHS, 158146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 158246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS, 158346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 158446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 158546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 158646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/ 158746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 15882618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */ 15892618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) { 15902618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen value Hd, Tl; 15912618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMValueRef FirstValue, PhiNode; 15922618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 15932618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!"); 15942618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 15952618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Hd = Field(Incoming, 0); 15962618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen FirstValue = (LLVMValueRef) Field(Hd, 0); 15972618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue), 15982618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen String_val(Name)); 15992618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 16002618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) { 16012618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen value Hd = Field(Tl, 0); 16022618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0), 16032618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMBasicBlockRef*) &Field(Hd, 1), 1); 16042618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen } 16052618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 16062618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen return PhiNode; 160746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 160846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 160946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 161046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params, 161146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 161246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params), 161346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Wosize_val(Params), String_val(Name)); 161446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 161546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 161646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 161746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If, 161846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Then, LLVMValueRef Else, 161946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 162046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name)); 162146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 162246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 162346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 162446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty, 162546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 162646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name)); 162746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 162846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 162946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 163046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec, 163146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Idx, 163246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 163346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name)); 163446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 163546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 163646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 163746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec, 163846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Element, 163946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Idx, 164046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 164146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx, 164246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 164346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 164446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 164546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 164646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2, 164746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Mask, 164846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 164946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name)); 165046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 165146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1652e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */ 1653e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate, 1654e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Idx, value Name, value B) { 1655e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx), 1656e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1657e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1658e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1659e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */ 1660e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate, 1661e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar LLVMValueRef Val, value Idx, 1662e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1663e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx), 1664e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1665e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1666e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1667e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 1668e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name, 1669e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1670e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name)); 1671e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1672e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1673e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 1674e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name, 1675e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1676e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name)); 1677e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1678e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1679e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1680e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS, 1681e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1682e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name)); 1683e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 16841ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen 16851ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen/*===-- Module Providers --------------------------------------------------===*/ 16861ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen 16871ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen/* llmoduleprovider -> unit */ 16881ae6135fa37eb061499d079b9b33dc82dcc1283fGordon HenriksenCAMLprim value llvm_dispose_module_provider(LLVMModuleProviderRef MP) { 16891ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen LLVMDisposeModuleProvider(MP); 16901ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen return Val_unit; 16911ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen} 1692da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1693da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1694da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/ 1695da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1696da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer 1697da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen raises IoError msg on error */ 1698da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) { 1699da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLparam1(Path); 1700da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen char *Message; 1701da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMMemoryBufferRef MemBuf; 1702da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1703da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path), 1704da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen &MemBuf, &Message)) 1705da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen llvm_raise(llvm_ioerror_exn, Message); 1706da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1707da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLreturn((value) MemBuf); 1708da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 1709da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1710da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer 1711da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen raises IoError msg on error */ 1712da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) { 1713da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen char *Message; 1714da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMMemoryBufferRef MemBuf; 1715da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1716da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message)) 1717da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen llvm_raise(llvm_ioerror_exn, Message); 1718da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1719da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return MemBuf; 1720da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 1721da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1722da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */ 1723da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) { 1724da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMDisposeMemoryBuffer(MemBuf); 1725da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return Val_unit; 1726da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 1727da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1728d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/ 1729d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1730d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */ 1731d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) { 1732d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return LLVMCreatePassManager(); 1733d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1734d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1735d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */ 1736d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M, 1737d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMPassManagerRef PM) { 1738d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMRunPassManager(PM, M)); 1739d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1740d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1741d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */ 1742d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) { 1743d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMInitializeFunctionPassManager(FPM)); 1744d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1745d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1746d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */ 1747d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F, 1748d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMPassManagerRef FPM) { 1749d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMRunFunctionPassManager(FPM, F)); 1750d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1751d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1752d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */ 1753d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) { 1754d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMFinalizeFunctionPassManager(FPM)); 1755d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1756d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1757d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */ 1758d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) { 1759d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMDisposePassManager(PM); 1760d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_unit; 1761d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1762