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