llvm_ocaml.c revision 3dd16741864302af14b31b7f75375c09d8544a35
1bbf1c514bd832bf1306fe3e87221fd78bbc306efGordon Henriksen/*===-- llvm_ocaml.c - LLVM Ocaml Glue --------------------------*- C++ -*-===*\ 28ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 38ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* The LLVM Compiler Infrastructure *| 48ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 5234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* This file is distributed under the University of Illinois Open Source *| 6234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* License. See LICENSE.TXT for details. *| 78ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 88ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*===----------------------------------------------------------------------===*| 98ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* This file glues LLVM's ocaml interface to its C interface. These functions *| 118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* are by and large transparent wrappers to the corresponding C functions. *| 128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* Note that these functions intentionally take liberties with the CAMLparamX *| 148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* macros, since most of the parameters are not GC heap objects. *| 158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen\*===----------------------------------------------------------------------===*/ 178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "llvm-c/Core.h" 198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/alloc.h" 2046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#include "caml/custom.h" 218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/memory.h" 22da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/fail.h" 23da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include "caml/callback.h" 246d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen#include "llvm/Config/config.h" 252618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen#include <assert.h> 26da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen#include <stdlib.h> 274f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin#include <string.h> 28da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 29da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 30da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Can't use the recommended caml_named_value mechanism for backwards 31da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen compatibility reasons. This is largely equivalent. */ 32da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksenstatic value llvm_ioerror_exn; 33da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 34da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_register_core_exns(value IoError) { 35da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen llvm_ioerror_exn = Field(IoError, 0); 36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen register_global_root(&llvm_ioerror_exn); 37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return Val_unit; 38da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 39da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void llvm_raise(value Prototype, char *Message) { 41da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLparam1(Prototype); 42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLlocal1(CamlMessage); 43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CamlMessage = copy_string(Message); 45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMDisposeMessage(Message); 46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 47da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen raise_with_arg(Prototype, CamlMessage); 482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen abort(); /* NOTREACHED */ 49a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#ifdef CAMLnoreturn 50a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen CAMLnoreturn; /* Silences warnings, but is missing in some versions. */ 51a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#endif 52da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 544733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksenstatic value alloc_variant(int tag, void *Value) { 554733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen value Iter = alloc_small(1, tag); 564733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen Field(Iter, 0) = Val_op(Value); 574733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return Iter; 584733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen} 594733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 604733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* Macro to convert the C first/next/last/prev idiom to the Ocaml llpos/ 614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen llrev_pos idiom. */ 624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen#define DEFINE_ITERATORS(camlname, cname, pty, cty, pfun) \ 634733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen /* llmodule -> ('a, 'b) llpos */ \ 644733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen CAMLprim value llvm_##camlname##_begin(pty Mom) { \ 654733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen cty First = LLVMGetFirst##cname(Mom); \ 664733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen if (First) \ 674733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return alloc_variant(1, First); \ 684733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return alloc_variant(0, Mom); \ 694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen } \ 704733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen \ 714733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen /* llvalue -> ('a, 'b) llpos */ \ 724733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen CAMLprim value llvm_##camlname##_succ(cty Kid) { \ 734733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen cty Next = LLVMGetNext##cname(Kid); \ 744733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen if (Next) \ 754733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return alloc_variant(1, Next); \ 76f440691a20eff24cf59ac14e10057234ae182dbeGordon Henriksen return alloc_variant(0, pfun(Kid)); \ 774733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen } \ 784733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen \ 794733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen /* llmodule -> ('a, 'b) llrev_pos */ \ 804733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen CAMLprim value llvm_##camlname##_end(pty Mom) { \ 814733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen cty Last = LLVMGetLast##cname(Mom); \ 824733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen if (Last) \ 834733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return alloc_variant(1, Last); \ 844733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return alloc_variant(0, Mom); \ 854733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen } \ 864733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen \ 874733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen /* llvalue -> ('a, 'b) llrev_pos */ \ 884733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen CAMLprim value llvm_##camlname##_pred(cty Kid) { \ 894733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen cty Prev = LLVMGetPrevious##cname(Kid); \ 904733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen if (Prev) \ 914733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return alloc_variant(1, Prev); \ 924733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return alloc_variant(0, pfun(Kid)); \ 934733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen } 944733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 965371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/*===-- Contexts ----------------------------------------------------------===*/ 975371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar 985371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */ 995371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_create_context(value Unit) { 1005371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMContextCreate(); 1015371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar} 1025371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar 1035371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> unit */ 1045371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_dispose_context(LLVMContextRef C) { 1055371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar LLVMContextDispose(C); 1065371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return Val_unit; 1075371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar} 1085371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar 1095371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* unit -> llcontext */ 1105371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_global_context(value Unit) { 1115371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMGetGlobalContext(); 1125371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar} 1135371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar 11446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> int */ 11546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_mdkind_id(LLVMContextRef C, value Name) { 11646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar unsigned MDKindID = LLVMGetMDKindIDInContext(C, String_val(Name), 11746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar caml_string_length(Name)); 11846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_int(MDKindID); 11946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 12046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 1218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/ 1228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 123263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar/* llcontext -> string -> llmodule */ 124263d989a719c1864862fc91f59193a6c2b55ca48Erick TryzelaarCAMLprim LLVMModuleRef llvm_create_module(LLVMContextRef C, value ModuleID) { 125263d989a719c1864862fc91f59193a6c2b55ca48Erick Tryzelaar return LLVMModuleCreateWithNameInContext(String_val(ModuleID), C); 1268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */ 12946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_dispose_module(LLVMModuleRef M) { 13046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDisposeModule(M); 1318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 134a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */ 135a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_target_triple(LLVMModuleRef M) { 136a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return copy_string(LLVMGetTarget(M)); 137a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 138a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 139a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */ 140a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_target_triple(value Trip, LLVMModuleRef M) { 141a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen LLVMSetTarget(M, String_val(Trip)); 142a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return Val_unit; 143a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 144a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 145a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* llmodule -> string */ 146a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_data_layout(LLVMModuleRef M) { 147a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return copy_string(LLVMGetDataLayout(M)); 148a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 149a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 150a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen/* string -> llmodule -> unit */ 151a353ffa7e556bfd2864474911174da691117f691Gordon HenriksenCAMLprim value llvm_set_data_layout(value Layout, LLVMModuleRef M) { 152a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen LLVMSetDataLayout(M, String_val(Layout)); 153a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen return Val_unit; 154a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen} 155a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen 156af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen/* llmodule -> unit */ 157af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon HenriksenCAMLprim value llvm_dump_module(LLVMModuleRef M) { 158af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen LLVMDumpModule(M); 159af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen return Val_unit; 160af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen} 161af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen 1620941534c712d77243d9dda5e8c1d927563b4edffChris Lattner/* llmodule -> string -> unit */ 1630941534c712d77243d9dda5e8c1d927563b4edffChris LattnerCAMLprim value llvm_set_module_inline_asm(LLVMModuleRef M, value Asm) { 1640941534c712d77243d9dda5e8c1d927563b4edffChris Lattner LLVMSetModuleInlineAsm(M, String_val(Asm)); 1650941534c712d77243d9dda5e8c1d927563b4edffChris Lattner return Val_unit; 1660941534c712d77243d9dda5e8c1d927563b4edffChris Lattner} 1678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/ 1698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 170404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* lltype -> TypeKind.t */ 17146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) { 17246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetTypeKind(Ty)); 1738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 175ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok EdwinCAMLprim value llvm_type_is_sized(LLVMTypeRef Ty) { 176ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin return Val_bool(LLVMTypeIsSized(Ty)); 177ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin} 178ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin 1795371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* lltype -> llcontext */ 1805371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_type_context(LLVMTypeRef Ty) { 1815371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMGetTypeContext(Ty); 1825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar} 1835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar 1848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/ 1858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 186b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 187b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i1_type (LLVMContextRef Context) { 188b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt1TypeInContext(Context); 189b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 190b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 191b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 192b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i8_type (LLVMContextRef Context) { 193b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt8TypeInContext(Context); 194b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 195b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 196b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 197b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i16_type (LLVMContextRef Context) { 198b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt16TypeInContext(Context); 199b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 200b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 201b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 202b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i32_type (LLVMContextRef Context) { 203b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt32TypeInContext(Context); 204b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 205b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 206b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 207b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i64_type (LLVMContextRef Context) { 208b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt64TypeInContext(Context); 209b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 2108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 211b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> int -> lltype */ 212b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_integer_type(LLVMContextRef Context, value Width) { 213b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMIntTypeInContext(Context, Int_val(Width)); 2148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 21746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) { 21846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetIntTypeWidth(IntegerTy)); 2198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/ 2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 223b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 224b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_float_type(LLVMContextRef Context) { 225b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMFloatTypeInContext(Context); 2268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 228b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 229b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_double_type(LLVMContextRef Context) { 230b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMDoubleTypeInContext(Context); 2318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 233b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 234b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_x86fp80_type(LLVMContextRef Context) { 235b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMX86FP80TypeInContext(Context); 2368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 238b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 239b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_fp128_type(LLVMContextRef Context) { 240b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMFP128TypeInContext(Context); 2418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 243b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 244b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_ppc_fp128_type(LLVMContextRef Context) { 245b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMPPCFP128TypeInContext(Context); 2468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 248bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen/* llcontext -> lltype */ 249bb811a244567aa8a1522203f15588f4d001b7353Dale JohannesenCAMLprim LLVMTypeRef llvm_x86mmx_type(LLVMContextRef Context) { 250bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen return LLVMX86MMXTypeInContext(Context); 251bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen} 252bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen 2538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/ 2548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 255957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */ 256957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) { 25781a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys, 258957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen Wosize_val(ParamTys), 0); 259957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen} 260957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen 261957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */ 262957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy, 263957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen value ParamTys) { 264957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys, 265957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen Wosize_val(ParamTys), 1); 2668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */ 26946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) { 27046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsFunctionVarArg(FunTy)); 2718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 27446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) { 27546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Tys = alloc(LLVMCountParamTypes(FunTy), 0); 27646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys); 27746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Tys; 2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/ 2818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2825371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */ 2835371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_struct_type(LLVMContextRef C, value ElementTypes) { 2845371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes, 2855371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementTypes), 0); 286957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen} 287957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen 2885371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */ 2895371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C, 2905371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar value ElementTypes) { 2915371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes, 2925371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementTypes), 1); 2938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 295c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin/* lltype -> string option */ 296c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok EdwinCAMLprim value llvm_struct_name(LLVMTypeRef Ty) 297c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin{ 29831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLparam0(); 29931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin const char *C = LLVMGetStructName(Ty); 30031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin if (C) { 30131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLlocal1(result); 30231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin result = caml_alloc_small(1, 0); 30331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Store_field(result, 0, caml_copy_string(C)); 30431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(result); 30531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin } 30631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Val_int(0)); 307c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin} 308c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin 3098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 3101940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) { 31146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0); 31246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys); 31346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Tys; 3148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 31646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */ 31746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) { 31846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsPackedStruct(StructTy)); 3198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/ 3228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 324957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) { 32581a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMArrayType(ElementTy, Int_val(Count)); 3268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 32857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */ 32957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) { 33057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMPointerType(ElementTy, 0); 33157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 33257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 33357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */ 33457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy, 33557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen value AddressSpace) { 33657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMPointerType(ElementTy, Int_val(AddressSpace)); 33757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 33857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 3398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 340957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) { 34181a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMVectorType(ElementTy, Int_val(Count)); 3428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 34546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) { 34646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetArrayLength(ArrayTy)); 3478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 35057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) { 35157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return Val_int(LLVMGetPointerAddressSpace(PtrTy)); 35257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 35357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 35457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */ 35546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) { 35646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetVectorSize(VectorTy)); 3578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/ 3608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 361b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 362b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) { 363b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMVoidTypeInContext(Context); 364b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 365b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 366b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 367b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) { 368b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMLabelTypeInContext(Context); 369b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 3708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/ 3728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */ 37446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) { 37546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMTypeOf(Val); 3768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3783dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* keep in sync with ValueKind.t */ 3793dd16741864302af14b31b7f75375c09d8544a35Torok Edwinenum ValueKind { 3803dd16741864302af14b31b7f75375c09d8544a35Torok Edwin NullValue=0, 3813dd16741864302af14b31b7f75375c09d8544a35Torok Edwin Argument, 3823dd16741864302af14b31b7f75375c09d8544a35Torok Edwin BasicBlock, 3833dd16741864302af14b31b7f75375c09d8544a35Torok Edwin InlineAsm, 3843dd16741864302af14b31b7f75375c09d8544a35Torok Edwin MDNode, 3853dd16741864302af14b31b7f75375c09d8544a35Torok Edwin MDString, 3863dd16741864302af14b31b7f75375c09d8544a35Torok Edwin BlockAddress, 3873dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantAggregateZero, 3883dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantArray, 3893dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantExpr, 3903dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantFP, 3913dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantInt, 3923dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantPointerNull, 3933dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantStruct, 3943dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantVector, 3953dd16741864302af14b31b7f75375c09d8544a35Torok Edwin Function, 3963dd16741864302af14b31b7f75375c09d8544a35Torok Edwin GlobalAlias, 3973dd16741864302af14b31b7f75375c09d8544a35Torok Edwin GlobalVariable, 3983dd16741864302af14b31b7f75375c09d8544a35Torok Edwin UndefValue, 3993dd16741864302af14b31b7f75375c09d8544a35Torok Edwin Instruction 4003dd16741864302af14b31b7f75375c09d8544a35Torok Edwin}; 4013dd16741864302af14b31b7f75375c09d8544a35Torok Edwin 4023dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* llvalue -> ValueKind.t */ 4033dd16741864302af14b31b7f75375c09d8544a35Torok Edwin#define DEFINE_CASE(Val, Kind) \ 4043dd16741864302af14b31b7f75375c09d8544a35Torok Edwin do {if (LLVMIsA##Kind(Val)) CAMLreturn(Val_int(Kind));} while(0) 4053dd16741864302af14b31b7f75375c09d8544a35Torok Edwin 4063dd16741864302af14b31b7f75375c09d8544a35Torok EdwinCAMLprim value llvm_classify_value(LLVMValueRef Val) { 4073dd16741864302af14b31b7f75375c09d8544a35Torok Edwin CAMLparam0(); 4083dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (!Val) 4093dd16741864302af14b31b7f75375c09d8544a35Torok Edwin CAMLreturn(Val_int(NullValue)); 4103dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (LLVMIsAConstant(Val)) { 4113dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, BlockAddress); 4123dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantAggregateZero); 4133dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantArray); 4143dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantExpr); 4153dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantFP); 4163dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantInt); 4173dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantPointerNull); 4183dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantStruct); 4193dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantVector); 4203dd16741864302af14b31b7f75375c09d8544a35Torok Edwin } 4213dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (LLVMIsAInstruction(Val)) { 4223dd16741864302af14b31b7f75375c09d8544a35Torok Edwin CAMLlocal1(result); 4233dd16741864302af14b31b7f75375c09d8544a35Torok Edwin result = caml_alloc_small(1, 0); 4243dd16741864302af14b31b7f75375c09d8544a35Torok Edwin Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val))); 4253dd16741864302af14b31b7f75375c09d8544a35Torok Edwin CAMLreturn(result); 4263dd16741864302af14b31b7f75375c09d8544a35Torok Edwin } 4273dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (LLVMIsAGlobalValue(Val)) { 4283dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, Function); 4293dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, GlobalAlias); 4303dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, GlobalVariable); 4313dd16741864302af14b31b7f75375c09d8544a35Torok Edwin } 4323dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, Argument); 4333dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, BasicBlock); 4343dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, InlineAsm); 4353dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, MDNode); 4363dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, MDString); 4373dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, UndefValue); 4383dd16741864302af14b31b7f75375c09d8544a35Torok Edwin failwith("Unknown Value class"); 4393dd16741864302af14b31b7f75375c09d8544a35Torok Edwin} 4403dd16741864302af14b31b7f75375c09d8544a35Torok Edwin 4418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 44246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) { 44346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return copy_string(LLVMGetValueName(Val)); 4448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 44746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) { 44846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetValueName(Val, String_val(Name)); 4498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 4508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 45288cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */ 45388cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) { 45488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen LLVMDumpValue(Val); 45588cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen return Val_unit; 45688cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen} 45788cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen 458b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/ 459b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar 460b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */ 461b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) { 462b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar return LLVMGetOperand(V, Int_val(I)); 463b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar} 464b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar 465f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */ 466f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) { 467f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar LLVMSetOperand(U, Int_val(I), V); 468f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar return Val_unit; 469f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar} 470f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar 471f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */ 472f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) { 473f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar return Val_int(LLVMGetNumOperands(V)); 474f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar} 475f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar 4768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/ 4778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 47946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) { 48046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsConstant(Val)); 481344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 482344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 483344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 48446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) { 48546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsNull(Val)); 4868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 488344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 48946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) { 49046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsUndef(Val)); 491344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 492344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 4936563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */ 4946563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) { 4956563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin return LLVMIsAConstantExpr(Val) ? 4966563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin Val_int(LLVMGetConstOpcode(Val)) : Val_int(0); 4976563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin} 4986563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin 49946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/ 50046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 50146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */ 50246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) { 50346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_bool(LLVMHasMetadata(Val)); 50446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 50546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 50646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */ 50746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) { 50846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLparam1(MDKindID); 50946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMValueRef MD; 51046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) { 51146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar value Option = alloc(1, 0); 51246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar Field(Option, 0) = (value) MD; 51346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Option); 51446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar } 51546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Val_int(0)); 51646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 51746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 51846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */ 51946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID, 52046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMValueRef MD) { 52146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetMetadata(Val, Int_val(MDKindID), MD); 52246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 52346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 52446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 52546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */ 52646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) { 52746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetMetadata(Val, Int_val(MDKindID), NULL); 52846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 52946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 53046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 53146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 53246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/ 53346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 53446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */ 53546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) { 53646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return LLVMMDStringInContext(C, String_val(S), caml_string_length(S)); 53746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 53846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 53946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 54046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) { 54146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals), 54246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar Wosize_val(ElementVals)); 54346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 54446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 5454f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */ 5464f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) { 54731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLparam0(); 54831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin const char *S; 54931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin unsigned Len; 55031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin 55131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin if ((S = LLVMGetMDString(V, &Len))) { 55231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLlocal2(Option, Str); 55331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin 55431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Str = caml_alloc_string(Len); 55531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin memcpy(String_val(Str), S, Len); 55631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Option = alloc(1,0); 55731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Store_field(Option, 0, Str); 55831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Option); 55931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin } 56031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Val_int(0)); 5614f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin} 5624f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin 5634f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value name) 5644f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{ 5654f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin CAMLparam1(name); 5664f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin CAMLlocal1(Nodes); 5674f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(name)), 0); 5684f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin LLVMGetNamedMetadataOperands(M, String_val(name), (LLVMValueRef *) Nodes); 5694f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin CAMLreturn(Nodes); 5704f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin} 5718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/ 5728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 573e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */ 574e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) { 575e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstInt(IntTy, (long long) Int_val(N), 1); 5768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 578344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */ 579e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N, 580e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen value SExt) { 581e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt)); 582344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 583344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 5846563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */ 5856563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const) 5866563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{ 5876563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin CAMLparam0(); 5886563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin if (LLVMIsAConstantInt(Const) && 5896563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) { 5906563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin value Option = alloc(1, 0); 5916563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const)); 5926563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin CAMLreturn(Option); 5936563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin } 5946563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin CAMLreturn(Val_int(0)); 5956563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin} 5966563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin 59745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */ 59845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S, 59945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar value Radix) { 60045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S), 60145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar Int_val(Radix)); 60245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar} 60345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar 6048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */ 605e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) { 606e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstReal(RealTy, Double_val(N)); 6078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 60945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */ 61045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) { 61145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar return LLVMConstRealOfStringAndSize(RealTy, String_val(S), 61245d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar caml_string_length(S)); 61345d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar} 61445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar 6158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/ 6168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 617b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */ 618b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str, 619b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar value NullTerminate) { 620b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMConstStringInContext(Context, String_val(Str), string_length(Str), 621b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 1); 622e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen} 623e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen 624b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */ 625b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str, 626b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar value NullTerminate) { 627b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMConstStringInContext(Context, String_val(Str), string_length(Str), 628b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 0); 6298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */ 632e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy, 63346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value ElementVals) { 634e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals), 635e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen Wosize_val(ElementVals)); 636e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen} 637e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen 6385371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 6395371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) { 6405371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals), 6415371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementVals), 0); 6428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6445371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 6455371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C, 6465371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar value ElementVals) { 6475371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals), 6485371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementVals), 1); 6498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */ 652e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) { 653e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals), 654e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen Wosize_val(ElementVals)); 6554647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 6564647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 6574647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/ 6584647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 659404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */ 6604647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred, 6614647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef LHSConstant, 6624647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef RHSConstant) { 6634647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant); 6644647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 6654647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 666404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */ 6674647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred, 6684647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef LHSConstant, 6694647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef RHSConstant) { 6704647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant); 6714647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 6724647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 6734647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */ 6744647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) { 6754647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices), 6764647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen Wosize_val(Indices)); 6778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 6791b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */ 6801b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal, 6811b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar value Indices) { 6821b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices), 6831b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar Wosize_val(Indices)); 6841b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 6851b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 6861b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */ 6871b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate, 6881b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar value Indices) { 6891b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLparam1(Indices); 6901b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int size = Wosize_val(Indices); 6911b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int i; 6921b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef result; 6931b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 6941b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned)); 6951b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar for (i = 0; i < size; i++) { 6961b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar idxs[i] = Int_val(Field(Indices, i)); 6971b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar } 6981b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 6991b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar result = LLVMConstExtractValue(Aggregate, idxs, size); 7001b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar free(idxs); 7011b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLreturnT(LLVMValueRef, result); 7021b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 7031b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 7041b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */ 7051b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate, 7061b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef Val, value Indices) { 7071b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLparam1(Indices); 7081b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int size = Wosize_val(Indices); 7091b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int i; 7101b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef result; 7111b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 7121b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned)); 7131b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar for (i = 0; i < size; i++) { 7141b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar idxs[i] = Int_val(Field(Indices, i)); 7151b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar } 7161b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 7171b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar result = LLVMConstInsertValue(Aggregate, Val, idxs, size); 7181b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar free(idxs); 7191b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLreturnT(LLVMValueRef, result); 7201b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 7211b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 722ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */ 723ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm, 724ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar value Constraints, value HasSideEffects, 725ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar value IsAlignStack) { 726ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints), 727ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar Bool_val(HasSideEffects), Bool_val(IsAlignStack)); 728ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar} 729ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar 7308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/ 7318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 73346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) { 73446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsDeclaration(Global)); 7358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 737404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */ 73846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) { 73946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetLinkage(Global)); 7408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 742404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */ 74346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) { 74446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetLinkage(Global, Int_val(Linkage)); 7458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 7468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 74946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) { 75046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return copy_string(LLVMGetSection(Global)); 7518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 75446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) { 75546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetSection(Global, String_val(Section)); 7568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 7578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 759404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */ 76046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) { 76146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetVisibility(Global)); 7628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 764404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */ 76546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) { 76646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetVisibility(Global, Int_val(Viz)); 7678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 7688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */ 77146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) { 77246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetAlignment(Global)); 7738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */ 77646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) { 77746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetAlignment(Global, Int_val(Bytes)); 7788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 7798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 781705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/ 782705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 783705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */ 784705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) { 785705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLparam0(); 786705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar LLVMUseRef First; 787705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar if ((First = LLVMGetFirstUse(Val))) { 788705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar value Option = alloc(1, 0); 789705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar Field(Option, 0) = (value) First; 790705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLreturn(Option); 791705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar } 792705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLreturn(Val_int(0)); 793705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar} 794705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 795705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */ 796705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) { 797705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLparam0(); 798705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar LLVMUseRef Next; 799705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar if ((Next = LLVMGetNextUse(U))) { 800705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar value Option = alloc(1, 0); 801705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar Field(Option, 0) = (value) Next; 802705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLreturn(Option); 803705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar } 804705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLreturn(Val_int(0)); 805705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar} 806705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 807705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */ 808705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) { 809705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar return LLVMGetUser(UR); 810705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar} 811705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 812705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */ 813705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) { 814705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar return LLVMGetUsedValue(UR); 815705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar} 816705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 8178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/ 8188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8194733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef, 8204733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetGlobalParent) 8214733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 8228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */ 82346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name, 82446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 8256d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef GlobalVar; 8266d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 8276d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) 82857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0)); 8296d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen return GlobalVar; 8306d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 83146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMAddGlobal(M, Ty, String_val(Name)); 8328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8348e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */ 8358e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name, 8368e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar value AddressSpace, 8378e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMModuleRef M) { 8388e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMValueRef GlobalVar; 8398e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 8408e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) 8418e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return LLVMConstBitCast(GlobalVar, 8428e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMPointerType(Ty, Int_val(AddressSpace))); 8438e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return GlobalVar; 8448e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar } 8458e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return LLVMAddGlobal(M, Ty, String_val(Name)); 8468e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar} 8478e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar 8486d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */ 8496d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) { 8506d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLparam1(Name); 8516d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef GlobalVar; 8526d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 85375e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen value Option = alloc(1, 0); 8546d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen Field(Option, 0) = (value) GlobalVar; 8556d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Option); 8566d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 8576d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Val_int(0)); 8586d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen} 8596d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen 8608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */ 86146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer, 86246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 86346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer), 8648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen String_val(Name)); 8658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetInitializer(GlobalVar, Initializer); 86646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return GlobalVar; 8678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8698e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */ 8708e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name, 8718e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMValueRef Initializer, 8728e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar value AddressSpace, 8738e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMModuleRef M) { 8748e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M, 8758e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMTypeOf(Initializer), 8768e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar String_val(Name), 8778e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar Int_val(AddressSpace)); 8788e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMSetInitializer(GlobalVar, Initializer); 8798e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return GlobalVar; 8808e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar} 8818e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar 8828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 88346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) { 88446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteGlobal(GlobalVar); 8858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 8868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */ 88946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal, 89046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar) { 89146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetInitializer(GlobalVar, ConstantVal); 8928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 8938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 89646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) { 89746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetInitializer(GlobalVar, NULL); 8988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 8998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 9008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 9018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 90246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) { 90346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsThreadLocal(GlobalVar)); 9048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 9058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 9068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */ 90746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal, 90846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar) { 90946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal)); 91046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 91146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 91246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 913c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */ 914c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) { 915c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen return Val_bool(LLVMIsGlobalConstant(GlobalVar)); 916c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen} 917c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen 918c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */ 919c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) { 920c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag)); 921c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen return Val_unit; 922c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen} 923c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen 9246ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/ 9256ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar 9266ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty, 9276ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar LLVMValueRef Aliasee, value Name) { 9286ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar return LLVMAddAlias(M, Ty, Aliasee, String_val(Name)); 9296ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar} 9306ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar 93146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/ 93246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 9334733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef, 9344733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetGlobalParent) 9354733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 93646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */ 93746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty, 93846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 9396d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef Fn; 9406d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { 9416d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty) 94257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0)); 9436d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen return Fn; 9446d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 94546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMAddFunction(M, String_val(Name), Ty); 94646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 94746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 9486d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */ 9496d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) { 9506d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLparam1(Name); 9516d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef Fn; 9526d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { 95375e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen value Option = alloc(1, 0); 9546d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen Field(Option, 0) = (value) Fn; 9556d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Option); 9566d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 9576d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Val_int(0)); 9586d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen} 9596d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen 96046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */ 96146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty, 96246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 96346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty); 964b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry"); 96546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Fn; 96646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 96746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 96846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */ 96946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) { 97046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteFunction(Fn); 97146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 97246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 97346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 97446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */ 97546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) { 97646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMGetIntrinsicID(Fn)); 97746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 97846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 97946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */ 98046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) { 98146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetFunctionCallConv(Fn)); 98246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 98346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 98446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */ 98546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) { 98646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetFunctionCallConv(Fn, Int_val(Id)); 98746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 98846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 98946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 99080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */ 9915eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) { 9925eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen const char *GC; 99380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLparam0(); 99480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLlocal2(Name, Option); 99580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 9965eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if ((GC = LLVMGetGC(Fn))) { 9975eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen Name = copy_string(GC); 99880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 99980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen Option = alloc(1, 0); 100080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen Field(Option, 0) = Name; 100180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLreturn(Option); 100280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen } else { 100380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLreturn(Val_int(0)); 100480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen } 100580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 100680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 100780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */ 10085eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) { 10095eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0))); 101080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen return Val_unit; 101180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 101280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 1013e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 1014e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) { 10150941534c712d77243d9dda5e8c1d927563b4edffChris Lattner LLVMAddFunctionAttr(Arg, Int_val(PA)); 1016e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1017e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1018e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 1019e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 1020e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) { 10210941534c712d77243d9dda5e8c1d927563b4edffChris Lattner LLVMRemoveFunctionAttr(Arg, Int_val(PA)); 1022e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1023e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 10244733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/ 10254733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 10264733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent) 10274733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 10284733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */ 10294733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) { 10304733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return LLVMGetParam(Fn, Int_val(Index)); 10314733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen} 10324733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 1033e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */ 1034e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) { 10354733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen value Params = alloc(LLVMCountParams(Fn), 0); 10364733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params)); 10374733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return Params; 10384733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen} 10394733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 1040e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 1041e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) { 10420941534c712d77243d9dda5e8c1d927563b4edffChris Lattner LLVMAddAttribute(Arg, Int_val(PA)); 1043e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1044e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1045e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 1046e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> Attribute.t -> unit */ 1047e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) { 10480941534c712d77243d9dda5e8c1d927563b4edffChris Lattner LLVMRemoveAttribute(Arg, Int_val(PA)); 1049e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1050e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1051e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 1052e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */ 1053e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) { 1054e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMSetParamAlignment(Arg, Int_val(align)); 1055e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1056e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1057e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 105846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/ 105946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 10604733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS( 10614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent) 10624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 106346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */ 106446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) { 106546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0); 106646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray)); 106746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return MLArray; 106846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 106946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 107046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */ 107146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) { 107246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteBasicBlock(BB); 107346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 107446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 107546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 107646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */ 1077b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name, 1078b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMValueRef Fn) { 1079b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name)); 108046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 108146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 108246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */ 1083b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name, 1084b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMBasicBlockRef BB) { 1085b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name)); 108646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 108746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 108846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */ 108946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) { 109046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMValueIsBasicBlock(Val)); 109146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 109246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1093033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/ 1094033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 1095033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef, 1096033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMGetInstructionParent) 1097033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 10986563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */ 10996563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) { 11003dd16741864302af14b31b7f75375c09d8544a35Torok Edwin LLVMOpcode o; 11013dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (!LLVMIsAInstruction(Inst)) 11023dd16741864302af14b31b7f75375c09d8544a35Torok Edwin failwith("Not an instruction"); 11033dd16741864302af14b31b7f75375c09d8544a35Torok Edwin o = LLVMGetInstructionOpcode(Inst); 11046563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin assert (o <= LLVMUnwind ); 11056563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin return Val_int(o); 11066563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin} 1107033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 11084917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin/* llvalue -> ICmp.t */ 11094917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) { 111031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLparam0(); 111131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin int x = LLVMGetICmpPredicate(Val); 111231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin if (x) { 111331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin value Option = alloc(1, 0); 111431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Field(Option, 0) = Val_int(x - LLVMIntEQ); 111531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Option); 111631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin } 111731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Val_int(0)); 11184917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin} 11194917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin 11204917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin 1121cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/ 1122cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 1123cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */ 1124cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) { 1125cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen return Val_int(LLVMGetInstructionCallConv(Inst)); 1126cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen} 1127cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 1128cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */ 1129cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) { 1130cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen LLVMSetInstructionCallConv(Inst, Int_val(CC)); 1131cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen return Val_unit; 1132cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen} 1133cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 1134e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */ 1135e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr, 1136e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value index, 1137e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value PA) { 11380941534c712d77243d9dda5e8c1d927563b4edffChris Lattner LLVMAddInstrAttribute(Instr, Int_val(index), Int_val(PA)); 1139e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1140e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1141e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 1142e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> Attribute.t -> unit */ 1143e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr, 1144e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value index, 1145e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value PA) { 11460941534c712d77243d9dda5e8c1d927563b4edffChris Lattner LLVMRemoveInstrAttribute(Instr, Int_val(index), Int_val(PA)); 1147e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1148e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1149e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 115007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/ 115107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 115207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */ 115307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) { 115407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen return Val_bool(LLVMIsTailCall(CallInst)); 115507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen} 115607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 115707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */ 115807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall, 115907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen LLVMValueRef CallInst) { 116007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen LLVMSetTailCall(CallInst, Bool_val(IsTailCall)); 116107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen return Val_unit; 116207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen} 116307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 11642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/ 11652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 11662618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */ 11672618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) { 11682618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMAddIncoming(PhiNode, 11692618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMValueRef*) &Field(Incoming, 0), 11702618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMBasicBlockRef*) &Field(Incoming, 1), 11712618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 1); 11722618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen return Val_unit; 11732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen} 11742618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 11752618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */ 11762618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) { 11772618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen unsigned I; 11782618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLparam0(); 11792618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLlocal3(Hd, Tl, Tmp); 11802618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 11812618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen /* Build a tuple list of them. */ 11822618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tl = Val_int(0); 11832618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen for (I = LLVMCountIncoming(PhiNode); I != 0; ) { 11842618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Hd = alloc(2, 0); 11852618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I)); 11862618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I)); 11872618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 11882618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tmp = alloc(2, 0); 11892618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Tmp, 0, Hd); 11902618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Tmp, 1, Tl); 11912618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tl = Tmp; 11922618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen } 11932618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 11942618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLreturn(Tl); 11952618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen} 11962618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 119746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 119846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/ 119946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 120046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v) (*(LLVMBuilderRef *)(Data_custom_val(v))) 120146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1202a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) { 120346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDisposeBuilder(Builder_val(B)); 120446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 120546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 120646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = { 120789f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands (char *) "IRBuilder", 120846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llvm_finalize_builder, 120946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_compare_default, 121046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_hash_default, 121146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_serialize_default, 121246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_deserialize_default 121346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}; 121446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1215a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) { 1216a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1); 1217a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen Builder_val(V) = B; 1218a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen return V; 1219a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen} 1220a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen 12215371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */ 12225371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) { 12235371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return alloc_builder(LLVMCreateBuilderInContext(C)); 1224a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen} 1225a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen 1226033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */ 1227033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) { 1228033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen if (Tag_val(Pos) == 0) { 1229033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0)); 1230033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMPositionBuilderAtEnd(Builder_val(B), BB); 1231033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen } else { 1232033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0)); 1233033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMPositionBuilderBefore(Builder_val(B), I); 1234033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen } 12358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 12368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 123746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1238dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */ 1239628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) { 1240dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B)); 1241dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen if (!InsertBlock) 1242dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen raise_not_found(); 1243dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen return InsertBlock; 1244dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen} 1245dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen 12465c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */ 1247628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) { 1248628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name)); 12495c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar return Val_unit; 12505c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar} 12515c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar 125246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/ 125346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 125446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */ 125546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) { 125646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetCurrentDebugLocation(Builder_val(B), V); 125746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 125846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 125946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 126046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */ 126146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) { 126246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetCurrentDebugLocation(Builder_val(B), NULL); 126346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 126446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 126546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 126646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */ 126746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) { 126846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLparam0(); 126946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMValueRef L; 127046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) { 127146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar value Option = alloc(1, 0); 127246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar Field(Option, 0) = (value) L; 127346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Option); 127446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar } 127546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Val_int(0)); 127646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 127746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 127846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */ 127946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) { 128046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetInstDebugLocation(Builder_val(B), V); 128146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 128246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 128346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 128446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 128546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/ 128646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 128746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 128846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) { 128946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildRetVoid(Builder_val(B)); 129046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 129146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 129246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */ 129346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) { 129446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildRet(Builder_val(B), Val); 129546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 129646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 12976793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */ 12986793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) { 12996793dd9769047706acf34420586716450344fb66Erick Tryzelaar return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals), 13006793dd9769047706acf34420586716450344fb66Erick Tryzelaar Wosize_val(RetVals)); 13016793dd9769047706acf34420586716450344fb66Erick Tryzelaar} 13026793dd9769047706acf34420586716450344fb66Erick Tryzelaar 130346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */ 130446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) { 130546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildBr(Builder_val(B), BB); 130646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 130746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 130846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */ 130946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If, 131046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Then, 131146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Else, 131246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 131346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildCondBr(Builder_val(B), If, Then, Else); 131446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 131546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 131646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */ 131746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of, 131846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Else, 131946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value EstimatedCount, 132046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 132146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount)); 132246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 132346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 13241430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */ 13251430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal, 132621491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen LLVMBasicBlockRef Dest) { 132721491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen LLVMAddCase(Switch, OnVal, Dest); 132821491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen return Val_unit; 132921491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen} 133021491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen 1331c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */ 1332c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr, 1333c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar value EstimatedDests, 1334c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar value B) { 1335c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests); 1336c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar} 1337c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar 1338c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */ 1339c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr, 1340c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar LLVMBasicBlockRef Dest) { 1341c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar LLVMAddDestination(IndirectBr, Dest); 1342c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar return Val_unit; 1343c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar} 1344c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar 134546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> 134646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llbuilder -> llvalue */ 134746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args, 134846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Then, 134946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Catch, 135046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 135146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args), 135246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Wosize_val(Args), Then, Catch, String_val(Name)); 135346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 135446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 135546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> 135646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llbuilder -> llvalue */ 135746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) { 135846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1], 135946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMBasicBlockRef) Args[2], 136046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMBasicBlockRef) Args[3], 136146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Args[4], Args[5]); 136246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 136346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 136448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn, 136548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin value NumClauses, value Name, 136648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin value B) { 136748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses), 136848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin String_val(Name)); 136948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin} 137048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin 137148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag) 137248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{ 137348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin LLVMSetCleanup(LandingPadInst, Bool_val(flag)); 137448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin return Val_unit; 137548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin} 137648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin 137746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 137846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) { 137946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUnreachable(Builder_val(B)); 138046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 138146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 138246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/ 138346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 138446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 138546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS, 138646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 138746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name)); 138846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 138946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 139046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1391e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS, 1392e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1393e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name)); 1394e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1395e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1396e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 139719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS, 139819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 139919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name)); 140019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 140119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 140219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1403e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS, 1404e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1405e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name)); 1406e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1407e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1408e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 140946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS, 141046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 141146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name)); 141246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 141346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 141446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 141519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS, 141619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 141719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name)); 141819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 141919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 142019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 142119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS, 142219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 142319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name)); 142419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 142519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 142619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1427e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS, 1428e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1429e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name)); 1430e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1431e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1432e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 143346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS, 143446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 143546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name)); 143646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 143746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 143846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 143919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS, 144019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 144119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name)); 144219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 144319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 144419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 144519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS, 144619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 144719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name)); 144819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 144919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 145019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1451e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS, 1452e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1453e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name)); 1454e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1455e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1456e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 145746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS, 145846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 145946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name)); 146046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 146146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 146246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 146346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS, 146446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 146546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name)); 146646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 146746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 146846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1469e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS, 1470e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1471e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name)); 1472e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1473e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1474e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 147546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS, 147646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 147746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name)); 147846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 147946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 148046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 148146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS, 148246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 148346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name)); 148446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 148546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 148646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 148746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS, 148846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 148946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name)); 149046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 149146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 149246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS, 149446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 149546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name)); 149646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 149746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 149846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 149946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS, 150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name)); 150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 150546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS, 150646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 150746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name)); 150846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 150946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 151046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 151146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS, 151246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 151346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name)); 151446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 151546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 151646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 151746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS, 151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name)); 152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 152146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 152246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 152346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS, 152446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 152546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name)); 152646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 152746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 152846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 152946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS, 153046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 153146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name)); 153246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 153346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 153446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 153546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X, 153646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 153746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildNeg(Builder_val(B), X, String_val(Name)); 153846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 153946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 154046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 154119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X, 154219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 154319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name)); 154419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 154519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 154619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 154719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X, 154819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 154919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name)); 155019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 155119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 155219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 155319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X, 155419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 155519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildFNeg(Builder_val(B), X, String_val(Name)); 155619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 155719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 155819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 155946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X, 156046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 156146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildNot(Builder_val(B), X, String_val(Name)); 156246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 156346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 156446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/ 156546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 156646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */ 156746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty, 156846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 156946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name)); 157046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 157146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 157246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */ 157346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size, 157446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 157546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name)); 157646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 157746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 157846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 157946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer, 158046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 158146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name)); 158246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 158346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 158446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */ 158546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer, 158646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 158746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildStore(Builder_val(B), Value, Pointer); 158846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 158946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 159046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 159146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices, 159246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 159346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildGEP(Builder_val(B), Pointer, 159446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices), 159546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 159646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 159746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1598e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 1599e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer, 1600e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Indices, value Name, 1601e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1602e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildInBoundsGEP(Builder_val(B), Pointer, 1603e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar (LLVMValueRef *) Op_val(Indices), 1604e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar Wosize_val(Indices), String_val(Name)); 1605e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1606e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1607e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */ 1608e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer, 1609c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner value Index, value Name, 1610e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1611c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner return LLVMBuildStructGEP(Builder_val(B), Pointer, 1612c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner Int_val(Index), String_val(Name)); 1613e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1614e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1615e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */ 1616e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) { 1617e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildGlobalString(Builder_val(B), String_val(Str), 1618e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1619e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1620e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1621e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */ 1622e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name, 1623e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1624e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str), 1625e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1626e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1627e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 162846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/ 162946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 163046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 163146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty, 163246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 163346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name)); 163446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 163546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 163646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 163746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty, 163846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 163946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name)); 164046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 164146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 164246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 164346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty, 164446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 164546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name)); 164646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 164746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 164846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 164946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty, 165046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 165146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name)); 165246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 165346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 165446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 165546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty, 165646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 165746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name)); 165846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 165946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 166046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 166146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty, 166246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 166346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name)); 166446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 166546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 166646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 166746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty, 166846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 166946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name)); 167046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 167146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 167246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 167346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty, 167446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 167546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name)); 167646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 167746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 167846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 167946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty, 168046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 168146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name)); 168246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 168346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 168446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 168546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty, 168646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 168746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name)); 168846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 168946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 169046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 169146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty, 169246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 169346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name)); 169446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 169546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 169646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 169746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 169846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 169946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name)); 170046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 170146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1702e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1703e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 1704e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1705e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1706e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1707e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1708e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1709e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 1710e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1711e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1712e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1713e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1714e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1715e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X, 1716e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar LLVMTypeRef Ty, value Name, 1717e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1718e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1719e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1720e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1721e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1722e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty, 1723e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1724e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name)); 1725e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1726e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1727e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1728e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty, 1729e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1730e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name)); 1731e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1732e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1733e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1734e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty, 1735e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1736e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name)); 1737e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1738e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 173946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/ 174046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1741404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 174246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred, 174346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef LHS, LLVMValueRef RHS, 174446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 174546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS, 174646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 174746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 174846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1749404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 175046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred, 175146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef LHS, LLVMValueRef RHS, 175246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 175346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS, 175446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 175546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 175646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 175746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/ 175846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 17592618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */ 17602618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) { 17612618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen value Hd, Tl; 17622618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMValueRef FirstValue, PhiNode; 17632618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 17642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!"); 17652618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 17662618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Hd = Field(Incoming, 0); 17672618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen FirstValue = (LLVMValueRef) Field(Hd, 0); 17682618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue), 17692618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen String_val(Name)); 17702618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 17712618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) { 17722618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen value Hd = Field(Tl, 0); 17732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0), 17742618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMBasicBlockRef*) &Field(Hd, 1), 1); 17752618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen } 17762618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 17772618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen return PhiNode; 177846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 177946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 178046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 178146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params, 178246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 178346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params), 178446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Wosize_val(Params), String_val(Name)); 178546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 178646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 178746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 178846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If, 178946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Then, LLVMValueRef Else, 179046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 179146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name)); 179246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 179346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 179446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 179546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty, 179646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 179746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name)); 179846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 179946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 180046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 180146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec, 180246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Idx, 180346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 180446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name)); 180546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 180646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 180746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 180846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec, 180946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Element, 181046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Idx, 181146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 181246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx, 181346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 181446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 181546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 181646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 181746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2, 181846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Mask, 181946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 182046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name)); 182146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 182246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1823e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */ 1824e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate, 1825e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Idx, value Name, value B) { 1826e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx), 1827e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1828e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1829e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1830e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */ 1831e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate, 1832e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar LLVMValueRef Val, value Idx, 1833e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1834e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx), 1835e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1836e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1837e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1838e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 1839e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name, 1840e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1841e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name)); 1842e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1843e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1844e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 1845e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name, 1846e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1847e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name)); 1848e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1849e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1850e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1851e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS, 1852e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1853e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name)); 1854e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 18551ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen 1856da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1857da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/ 1858da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1859da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer 1860da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen raises IoError msg on error */ 1861da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) { 1862da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLparam1(Path); 1863da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen char *Message; 1864da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMMemoryBufferRef MemBuf; 1865da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1866da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path), 1867da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen &MemBuf, &Message)) 1868da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen llvm_raise(llvm_ioerror_exn, Message); 1869da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1870da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLreturn((value) MemBuf); 1871da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 1872da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1873da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer 1874da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen raises IoError msg on error */ 1875da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) { 1876da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen char *Message; 1877da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMMemoryBufferRef MemBuf; 1878da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1879da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message)) 1880da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen llvm_raise(llvm_ioerror_exn, Message); 1881da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1882da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return MemBuf; 1883da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 1884da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1885da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */ 1886da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) { 1887da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMDisposeMemoryBuffer(MemBuf); 1888da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return Val_unit; 1889da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 1890da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 1891d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/ 1892d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1893d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */ 1894d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) { 1895d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return LLVMCreatePassManager(); 1896d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1897d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1898d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */ 1899d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M, 1900d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMPassManagerRef PM) { 1901d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMRunPassManager(PM, M)); 1902d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1903d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1904d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */ 1905d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) { 1906d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMInitializeFunctionPassManager(FPM)); 1907d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1908d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1909d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */ 1910d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F, 1911d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMPassManagerRef FPM) { 1912d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMRunFunctionPassManager(FPM, F)); 1913d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1914d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1915d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */ 1916d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) { 1917d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMFinalizeFunctionPassManager(FPM)); 1918d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1919d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 1920d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */ 1921d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) { 1922d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMDisposePassManager(PM); 1923d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_unit; 1924d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 1925