llvm_ocaml.c revision 34b4a8426131ec2deea45a1e0174f191c63295e2
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 1618a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* string -> llmodule -> unit */ 1628a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_print_module(value Filename, LLVMModuleRef M) { 1638a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov char* Message; 1648a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov if(LLVMPrintModuleToFile(M, String_val(Filename), &Message)) { 1658a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov llvm_raise(llvm_ioerror_exn, Message); 1668a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov } 1678a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 1688a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 1698a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 1708a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 1718a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llmodule -> string */ 1728a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_string_of_llmodule(LLVMModuleRef M) { 1738a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov char* ModuleCStr; 1748a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov ModuleCStr = LLVMPrintModuleToString(M); 1758a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 1768a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov value ModuleStr = caml_copy_string(ModuleCStr); 1778a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMDisposeMessage(ModuleCStr); 1788a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 1798a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return ModuleStr; 1808a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 1818a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 1820941534c712d77243d9dda5e8c1d927563b4edffChris Lattner/* llmodule -> string -> unit */ 1830941534c712d77243d9dda5e8c1d927563b4edffChris LattnerCAMLprim value llvm_set_module_inline_asm(LLVMModuleRef M, value Asm) { 1840941534c712d77243d9dda5e8c1d927563b4edffChris Lattner LLVMSetModuleInlineAsm(M, String_val(Asm)); 1850941534c712d77243d9dda5e8c1d927563b4edffChris Lattner return Val_unit; 1860941534c712d77243d9dda5e8c1d927563b4edffChris Lattner} 1878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/ 1898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 190404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* lltype -> TypeKind.t */ 19146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_classify_type(LLVMTypeRef Ty) { 19246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetTypeKind(Ty)); 1938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 195ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok EdwinCAMLprim value llvm_type_is_sized(LLVMTypeRef Ty) { 196ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin return Val_bool(LLVMTypeIsSized(Ty)); 197ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin} 198ff12c99d131789ccb9e8739963f4d8e0e95667d4Torok Edwin 1995371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* lltype -> llcontext */ 2005371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMContextRef llvm_type_context(LLVMTypeRef Ty) { 2015371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMGetTypeContext(Ty); 2025371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar} 2035371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar 2048a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* lltype -> unit */ 2058a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_dump_type(LLVMTypeRef Val) { 2068a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMDumpType(Val); 2078a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 2088a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 2098a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 2108a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* lltype -> string */ 2118a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_string_of_lltype(LLVMTypeRef M) { 2128a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov char* TypeCStr; 2138a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov TypeCStr = LLVMPrintTypeToString(M); 2148a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 2158a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov value TypeStr = caml_copy_string(TypeCStr); 2168a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMDisposeMessage(TypeCStr); 2178a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 2188a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return TypeStr; 2198a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 2208a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/ 2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 223b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 224b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i1_type (LLVMContextRef Context) { 225b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt1TypeInContext(Context); 226b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 227b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 228b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 229b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i8_type (LLVMContextRef Context) { 230b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt8TypeInContext(Context); 231b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 232b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 233b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 234b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i16_type (LLVMContextRef Context) { 235b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt16TypeInContext(Context); 236b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 237b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 238b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 239b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i32_type (LLVMContextRef Context) { 240b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt32TypeInContext(Context); 241b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 242b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 243b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 244b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_i64_type (LLVMContextRef Context) { 245b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInt64TypeInContext(Context); 246b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 2478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 248b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> int -> lltype */ 249b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_integer_type(LLVMContextRef Context, value Width) { 250b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMIntTypeInContext(Context, Int_val(Width)); 2518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 25446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_integer_bitwidth(LLVMTypeRef IntegerTy) { 25546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetIntTypeWidth(IntegerTy)); 2568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/ 2598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 260b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 261b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_float_type(LLVMContextRef Context) { 262b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMFloatTypeInContext(Context); 2638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 265b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 266b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_double_type(LLVMContextRef Context) { 267b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMDoubleTypeInContext(Context); 2688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 270b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 271b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_x86fp80_type(LLVMContextRef Context) { 272b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMX86FP80TypeInContext(Context); 2738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 275b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 276b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_fp128_type(LLVMContextRef Context) { 277b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMFP128TypeInContext(Context); 2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 280b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 281b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_ppc_fp128_type(LLVMContextRef Context) { 282b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMPPCFP128TypeInContext(Context); 2838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/ 2868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 287957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */ 288957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_function_type(LLVMTypeRef RetTy, value ParamTys) { 28981a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys, 290957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen Wosize_val(ParamTys), 0); 291957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen} 292957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen 293957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen/* lltype -> lltype array -> lltype */ 294957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_var_arg_function_type(LLVMTypeRef RetTy, 295957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen value ParamTys) { 296957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen return LLVMFunctionType(RetTy, (LLVMTypeRef *) ParamTys, 297957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen Wosize_val(ParamTys), 1); 2988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */ 30146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_var_arg(LLVMTypeRef FunTy) { 30246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsFunctionVarArg(FunTy)); 3038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 30646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_param_types(LLVMTypeRef FunTy) { 30746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Tys = alloc(LLVMCountParamTypes(FunTy), 0); 30846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetParamTypes(FunTy, (LLVMTypeRef *) Tys); 30946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Tys; 3108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/ 3138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3145371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */ 3155371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_struct_type(LLVMContextRef C, value ElementTypes) { 3165371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes, 3175371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementTypes), 0); 318957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen} 319957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon Henriksen 3205371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> lltype array -> lltype */ 3215371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMTypeRef llvm_packed_struct_type(LLVMContextRef C, 3225371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar value ElementTypes) { 3235371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMStructTypeInContext(C, (LLVMTypeRef *) ElementTypes, 3245371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementTypes), 1); 3258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3276b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* llcontext -> string -> lltype */ 3286b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMTypeRef llvm_named_struct_type(LLVMContextRef C, 3296b228e506f42972c003599f4873a24910f8a530aTorok Edwin value Name) { 3306b228e506f42972c003599f4873a24910f8a530aTorok Edwin return LLVMStructCreateNamed(C, String_val(Name)); 3316b228e506f42972c003599f4873a24910f8a530aTorok Edwin} 3326b228e506f42972c003599f4873a24910f8a530aTorok Edwin 3336b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_struct_set_body(LLVMTypeRef Ty, 3346b228e506f42972c003599f4873a24910f8a530aTorok Edwin value ElementTypes, 3356b228e506f42972c003599f4873a24910f8a530aTorok Edwin value Packed) { 3366b228e506f42972c003599f4873a24910f8a530aTorok Edwin LLVMStructSetBody(Ty, (LLVMTypeRef *) ElementTypes, 3376b228e506f42972c003599f4873a24910f8a530aTorok Edwin Wosize_val(ElementTypes), Bool_val(Packed)); 3386b228e506f42972c003599f4873a24910f8a530aTorok Edwin return Val_unit; 3396b228e506f42972c003599f4873a24910f8a530aTorok Edwin} 3406b228e506f42972c003599f4873a24910f8a530aTorok Edwin 341c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin/* lltype -> string option */ 342c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok EdwinCAMLprim value llvm_struct_name(LLVMTypeRef Ty) 343c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin{ 34431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLparam0(); 34531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin const char *C = LLVMGetStructName(Ty); 34631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin if (C) { 34731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLlocal1(result); 34831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin result = caml_alloc_small(1, 0); 34931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Store_field(result, 0, caml_copy_string(C)); 35031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(result); 35131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin } 35231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Val_int(0)); 353c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin} 354c44943ed4f4f2d44b6668e6b51eb355f8310660cTorok Edwin 3558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 3561940dd10dd6b79e3332f384756c268b85d0ad400Erick TryzelaarCAMLprim value llvm_struct_element_types(LLVMTypeRef StructTy) { 35746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Tys = alloc(LLVMCountStructElementTypes(StructTy), 0); 35846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetStructElementTypes(StructTy, (LLVMTypeRef *) Tys); 35946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Tys; 3608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 36246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> bool */ 36346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_packed(LLVMTypeRef StructTy) { 36446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsPackedStruct(StructTy)); 3658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3676b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> bool */ 3686b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim value llvm_is_opaque(LLVMTypeRef StructTy) { 3696b228e506f42972c003599f4873a24910f8a530aTorok Edwin return Val_bool(LLVMIsOpaqueStruct(StructTy)); 3706b228e506f42972c003599f4873a24910f8a530aTorok Edwin} 3716b228e506f42972c003599f4873a24910f8a530aTorok Edwin 3728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/ 3738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 375957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) { 37681a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMArrayType(ElementTy, Int_val(Count)); 3778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 37957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> lltype */ 38057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_pointer_type(LLVMTypeRef ElementTy) { 38157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMPointerType(ElementTy, 0); 38257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 38357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 38457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int -> lltype */ 38557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim LLVMTypeRef llvm_qualified_pointer_type(LLVMTypeRef ElementTy, 38657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen value AddressSpace) { 38757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMPointerType(ElementTy, Int_val(AddressSpace)); 38857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 38957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 3908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 391957f9fe1cce0957bcde4a1093da83e17aaec6764Gordon HenriksenCAMLprim LLVMTypeRef llvm_vector_type(LLVMTypeRef ElementTy, value Count) { 39281a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen return LLVMVectorType(ElementTy, Int_val(Count)); 3938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 39646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_array_length(LLVMTypeRef ArrayTy) { 39746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetArrayLength(ArrayTy)); 3988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 40157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon HenriksenCAMLprim value llvm_address_space(LLVMTypeRef PtrTy) { 40257cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return Val_int(LLVMGetPointerAddressSpace(PtrTy)); 40357cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen} 40457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen 40557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen/* lltype -> int */ 40646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_vector_size(LLVMTypeRef VectorTy) { 40746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetVectorSize(VectorTy)); 4088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/ 4118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 412b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 413b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_void_type (LLVMContextRef Context) { 414b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMVoidTypeInContext(Context); 415b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 416b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 417b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> lltype */ 418b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMTypeRef llvm_label_type(LLVMContextRef Context) { 419b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMLabelTypeInContext(Context); 420b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar} 4218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4228a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llcontext -> lltype */ 4238a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMTypeRef llvm_x86_mmx_type(LLVMContextRef Context) { 4248a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return LLVMX86MMXTypeInContext(Context); 4258a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 4268a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 427ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_type_by_name(LLVMModuleRef M, value Name) 428ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{ 429ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin CAMLparam1(Name); 430ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin LLVMTypeRef Ty = LLVMGetTypeByName(M, String_val(Name)); 431ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin if (Ty) { 432ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin value Option = alloc(1, 0); 433ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin Field(Option, 0) = (value) Ty; 434ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin CAMLreturn(Option); 435ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin } 436ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin CAMLreturn(Val_int(0)); 437ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin} 438ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin 4398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/ 4408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */ 44246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMTypeRef llvm_type_of(LLVMValueRef Val) { 44346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMTypeOf(Val); 4448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4463dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* keep in sync with ValueKind.t */ 4473dd16741864302af14b31b7f75375c09d8544a35Torok Edwinenum ValueKind { 4483dd16741864302af14b31b7f75375c09d8544a35Torok Edwin NullValue=0, 4493dd16741864302af14b31b7f75375c09d8544a35Torok Edwin Argument, 4503dd16741864302af14b31b7f75375c09d8544a35Torok Edwin BasicBlock, 4513dd16741864302af14b31b7f75375c09d8544a35Torok Edwin InlineAsm, 4523dd16741864302af14b31b7f75375c09d8544a35Torok Edwin MDNode, 4533dd16741864302af14b31b7f75375c09d8544a35Torok Edwin MDString, 4543dd16741864302af14b31b7f75375c09d8544a35Torok Edwin BlockAddress, 4553dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantAggregateZero, 4563dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantArray, 45734b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov ConstantDataArray, 45834b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov ConstantDataVector, 4593dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantExpr, 4603dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantFP, 4613dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantInt, 4623dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantPointerNull, 4633dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantStruct, 4643dd16741864302af14b31b7f75375c09d8544a35Torok Edwin ConstantVector, 4653dd16741864302af14b31b7f75375c09d8544a35Torok Edwin Function, 4663dd16741864302af14b31b7f75375c09d8544a35Torok Edwin GlobalAlias, 4673dd16741864302af14b31b7f75375c09d8544a35Torok Edwin GlobalVariable, 4683dd16741864302af14b31b7f75375c09d8544a35Torok Edwin UndefValue, 4693dd16741864302af14b31b7f75375c09d8544a35Torok Edwin Instruction 4703dd16741864302af14b31b7f75375c09d8544a35Torok Edwin}; 4713dd16741864302af14b31b7f75375c09d8544a35Torok Edwin 4723dd16741864302af14b31b7f75375c09d8544a35Torok Edwin/* llvalue -> ValueKind.t */ 4733dd16741864302af14b31b7f75375c09d8544a35Torok Edwin#define DEFINE_CASE(Val, Kind) \ 4743dd16741864302af14b31b7f75375c09d8544a35Torok Edwin do {if (LLVMIsA##Kind(Val)) CAMLreturn(Val_int(Kind));} while(0) 4753dd16741864302af14b31b7f75375c09d8544a35Torok Edwin 4763dd16741864302af14b31b7f75375c09d8544a35Torok EdwinCAMLprim value llvm_classify_value(LLVMValueRef Val) { 4773dd16741864302af14b31b7f75375c09d8544a35Torok Edwin CAMLparam0(); 4783dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (!Val) 4793dd16741864302af14b31b7f75375c09d8544a35Torok Edwin CAMLreturn(Val_int(NullValue)); 4803dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (LLVMIsAConstant(Val)) { 4813dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, BlockAddress); 4823dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantAggregateZero); 4833dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantArray); 48434b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov DEFINE_CASE(Val, ConstantDataArray); 48534b4a8426131ec2deea45a1e0174f191c63295e2Peter Zotov DEFINE_CASE(Val, ConstantDataVector); 4863dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantExpr); 4873dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantFP); 4883dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantInt); 4893dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantPointerNull); 4903dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantStruct); 4913dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, ConstantVector); 4923dd16741864302af14b31b7f75375c09d8544a35Torok Edwin } 4933dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (LLVMIsAInstruction(Val)) { 4943dd16741864302af14b31b7f75375c09d8544a35Torok Edwin CAMLlocal1(result); 4953dd16741864302af14b31b7f75375c09d8544a35Torok Edwin result = caml_alloc_small(1, 0); 4963dd16741864302af14b31b7f75375c09d8544a35Torok Edwin Store_field(result, 0, Val_int(LLVMGetInstructionOpcode(Val))); 4973dd16741864302af14b31b7f75375c09d8544a35Torok Edwin CAMLreturn(result); 4983dd16741864302af14b31b7f75375c09d8544a35Torok Edwin } 4993dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (LLVMIsAGlobalValue(Val)) { 5003dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, Function); 5013dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, GlobalAlias); 5023dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, GlobalVariable); 5033dd16741864302af14b31b7f75375c09d8544a35Torok Edwin } 5043dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, Argument); 5053dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, BasicBlock); 5063dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, InlineAsm); 5073dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, MDNode); 5083dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, MDString); 5093dd16741864302af14b31b7f75375c09d8544a35Torok Edwin DEFINE_CASE(Val, UndefValue); 5103dd16741864302af14b31b7f75375c09d8544a35Torok Edwin failwith("Unknown Value class"); 5113dd16741864302af14b31b7f75375c09d8544a35Torok Edwin} 5123dd16741864302af14b31b7f75375c09d8544a35Torok Edwin 5138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 51446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_name(LLVMValueRef Val) { 51546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return copy_string(LLVMGetValueName(Val)); 5168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 51946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_value_name(value Name, LLVMValueRef Val) { 52046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetValueName(Val, String_val(Name)); 5218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 5228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 52488cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen/* llvalue -> unit */ 52588cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon HenriksenCAMLprim value llvm_dump_value(LLVMValueRef Val) { 52688cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen LLVMDumpValue(Val); 52788cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen return Val_unit; 52888cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen} 52988cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen 53088d74c3093de563408ceb834d999613038195e98Peter Zotov/* llvalue -> llvalue -> unit */ 53188d74c3093de563408ceb834d999613038195e98Peter ZotovCAMLprim value llvm_replace_all_uses_with(LLVMValueRef OldVal, 53288d74c3093de563408ceb834d999613038195e98Peter Zotov LLVMValueRef NewVal) { 53388d74c3093de563408ceb834d999613038195e98Peter Zotov LLVMReplaceAllUsesWith(OldVal, NewVal); 53488d74c3093de563408ceb834d999613038195e98Peter Zotov return Val_unit; 53588d74c3093de563408ceb834d999613038195e98Peter Zotov} 53688d74c3093de563408ceb834d999613038195e98Peter Zotov 537b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/*--... Operations on users ................................................--*/ 538b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar 539b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar/* llvalue -> int -> llvalue */ 540b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick TryzelaarCAMLprim LLVMValueRef llvm_operand(LLVMValueRef V, value I) { 541b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar return LLVMGetOperand(V, Int_val(I)); 542b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar} 543b65c5f2ec347db8342cb7e42d072b0088b74fa73Erick Tryzelaar 544f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */ 545f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_set_operand(LLVMValueRef U, value I, LLVMValueRef V) { 546f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar LLVMSetOperand(U, Int_val(I), V); 547f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar return Val_unit; 548f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar} 549f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar 550f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar/* llvalue -> int */ 551f7af931930dfab74b8a72b195e53df34b4ea2480Erick TryzelaarCAMLprim value llvm_num_operands(LLVMValueRef V) { 552f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar return Val_int(LLVMGetNumOperands(V)); 553f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar} 554f7af931930dfab74b8a72b195e53df34b4ea2480Erick Tryzelaar 5558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/ 5568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 5578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 55846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_constant(LLVMValueRef Val) { 55946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsConstant(Val)); 560344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 561344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 562344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 56346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_null(LLVMValueRef Val) { 56446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsNull(Val)); 5658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 5668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 567344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 56846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_undef(LLVMValueRef Val) { 56946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsUndef(Val)); 570344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 571344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 5726563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */ 5736563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_constexpr_get_opcode(LLVMValueRef Val) { 5746563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin return LLVMIsAConstantExpr(Val) ? 5756563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin Val_int(LLVMGetConstOpcode(Val)) : Val_int(0); 5766563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin} 5776563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin 57846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on instructions .........................................--*/ 57946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 58046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> bool */ 58146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_has_metadata(LLVMValueRef Val) { 58246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_bool(LLVMHasMetadata(Val)); 58346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 58446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 58546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue option */ 58646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_metadata(LLVMValueRef Val, value MDKindID) { 58746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLparam1(MDKindID); 58846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMValueRef MD; 58946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar if ((MD = LLVMGetMetadata(Val, Int_val(MDKindID)))) { 59046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar value Option = alloc(1, 0); 59146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar Field(Option, 0) = (value) MD; 59246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Option); 59346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar } 59446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Val_int(0)); 59546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 59646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 59746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> llvalue -> unit */ 59846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_metadata(LLVMValueRef Val, value MDKindID, 59946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMValueRef MD) { 60046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetMetadata(Val, Int_val(MDKindID), MD); 60146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 60246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 60346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 60446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llvalue -> int -> unit */ 60546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_metadata(LLVMValueRef Val, value MDKindID) { 60646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetMetadata(Val, Int_val(MDKindID), NULL); 60746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 60846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 60946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 61046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 61146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Operations on metadata .............................................--*/ 61246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 61346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> string -> llvalue */ 61446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdstring(LLVMContextRef C, value S) { 61546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return LLVMMDStringInContext(C, String_val(S), caml_string_length(S)); 61646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 61746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 61846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 61946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim LLVMValueRef llvm_mdnode(LLVMContextRef C, value ElementVals) { 62046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return LLVMMDNodeInContext(C, (LLVMValueRef*) Op_val(ElementVals), 62146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar Wosize_val(ElementVals)); 62246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 62346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 6244f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin/* llvalue -> string option */ 6254f661ab0fb87f97c4a12912249c3c366df882102Torok EdwinCAMLprim value llvm_get_mdstring(LLVMValueRef V) { 62631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLparam0(); 62731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin const char *S; 62831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin unsigned Len; 62931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin 63031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin if ((S = LLVMGetMDString(V, &Len))) { 63131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLlocal2(Option, Str); 63231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin 63331116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Str = caml_alloc_string(Len); 63431116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin memcpy(String_val(Str), S, Len); 63531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Option = alloc(1,0); 63631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Store_field(Option, 0, Str); 63731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Option); 63831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin } 63931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Val_int(0)); 6404f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin} 6414f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin 6426b8416192aeb6502f027883b8056d389f2c186a9Peter Zotov/* llmodule -> string -> llvalue array */ 643e5de63c7de04c81d7d8484e5b64f47941143c739Peter ZotovCAMLprim value llvm_get_namedmd(LLVMModuleRef M, value Name) 6444f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin{ 645e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov CAMLparam1(Name); 6464f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin CAMLlocal1(Nodes); 647e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov Nodes = alloc(LLVMGetNamedMetadataNumOperands(M, String_val(Name)), 0); 648e5de63c7de04c81d7d8484e5b64f47941143c739Peter Zotov LLVMGetNamedMetadataOperands(M, String_val(Name), (LLVMValueRef *) Nodes); 6494f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin CAMLreturn(Nodes); 6504f661ab0fb87f97c4a12912249c3c366df882102Torok Edwin} 6518a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 6528a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llmodule -> string -> llvalue -> unit */ 6538a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_append_namedmd(LLVMModuleRef M, value Name, LLVMValueRef Val) { 6548a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMAddNamedMetadataOperand(M, String_val(Name), Val); 6558a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 6568a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 6578a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 6588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/ 6598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 660e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen/* lltype -> int -> llvalue */ 661e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_int(LLVMTypeRef IntTy, value N) { 662e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstInt(IntTy, (long long) Int_val(N), 1); 6638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 665344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */ 666e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N, 667e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen value SExt) { 668e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt)); 669344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 670344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 6716563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Int64.t */ 6726563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_int64_of_const(LLVMValueRef Const) 6736563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin{ 6746563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin CAMLparam0(); 6756563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin if (LLVMIsAConstantInt(Const) && 6766563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin LLVMGetIntTypeWidth(LLVMTypeOf(Const)) <= 64) { 6776563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin value Option = alloc(1, 0); 6786563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin Field(Option, 0) = caml_copy_int64(LLVMConstIntGetSExtValue(Const)); 6796563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin CAMLreturn(Option); 6806563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin } 6816563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin CAMLreturn(Val_int(0)); 6826563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin} 6836563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin 68445d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> int -> llvalue */ 68545d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S, 68645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar value Radix) { 68745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S), 68845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar Int_val(Radix)); 68945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar} 69045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar 6918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */ 692e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) { 693e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstReal(RealTy, Double_val(N)); 6948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 6958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 69645d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar/* lltype -> string -> llvalue */ 69745d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick TryzelaarCAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) { 69845d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar return LLVMConstRealOfStringAndSize(RealTy, String_val(S), 69945d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar caml_string_length(S)); 70045d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar} 70145d6ac2cc13f7881687c2d7f03f9b9892fd85e6eErick Tryzelaar 7028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/ 7038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 704b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */ 705b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_string(LLVMContextRef Context, value Str, 706b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar value NullTerminate) { 707b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMConstStringInContext(Context, String_val(Str), string_length(Str), 708b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 1); 709e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen} 710e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen 711b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar/* llcontext -> string -> llvalue */ 712b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMValueRef llvm_const_stringz(LLVMContextRef Context, value Str, 713b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar value NullTerminate) { 714b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMConstStringInContext(Context, String_val(Str), string_length(Str), 715b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar 0); 7168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */ 719e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_array(LLVMTypeRef ElementTy, 72046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value ElementVals) { 721e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstArray(ElementTy, (LLVMValueRef*) Op_val(ElementVals), 722e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen Wosize_val(ElementVals)); 723e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen} 724e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen 7255371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 7265371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_struct(LLVMContextRef C, value ElementVals) { 7275371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals), 7285371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementVals), 0); 7298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7316b228e506f42972c003599f4873a24910f8a530aTorok Edwin/* lltype -> llvalue array -> llvalue */ 7326b228e506f42972c003599f4873a24910f8a530aTorok EdwinCAMLprim LLVMValueRef llvm_const_named_struct(LLVMTypeRef Ty, value ElementVals) { 7336b228e506f42972c003599f4873a24910f8a530aTorok Edwin return LLVMConstNamedStruct(Ty, (LLVMValueRef *) Op_val(ElementVals), Wosize_val(ElementVals)); 7346b228e506f42972c003599f4873a24910f8a530aTorok Edwin} 7356b228e506f42972c003599f4873a24910f8a530aTorok Edwin 7365371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llvalue array -> llvalue */ 7375371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim LLVMValueRef llvm_const_packed_struct(LLVMContextRef C, 7385371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar value ElementVals) { 7395371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return LLVMConstStructInContext(C, (LLVMValueRef *) Op_val(ElementVals), 7405371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar Wosize_val(ElementVals), 1); 7418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */ 744e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenCAMLprim LLVMValueRef llvm_const_vector(value ElementVals) { 745e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen return LLVMConstVector((LLVMValueRef*) Op_val(ElementVals), 746e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen Wosize_val(ElementVals)); 7474647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 7484647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 7494647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/*--... Constant expressions ...............................................--*/ 7504647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 751404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> llvalue */ 7524647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_icmp(value Pred, 7534647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef LHSConstant, 7544647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef RHSConstant) { 7554647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstICmp(Int_val(Pred) + LLVMIntEQ, LHSConstant, RHSConstant); 7564647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 7574647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 758404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> llvalue */ 7594647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_fcmp(value Pred, 7604647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef LHSConstant, 7614647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen LLVMValueRef RHSConstant) { 7624647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstFCmp(Int_val(Pred), LHSConstant, RHSConstant); 7634647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen} 7644647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen 7654647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen/* llvalue -> llvalue array -> llvalue */ 7664647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenCAMLprim LLVMValueRef llvm_const_gep(LLVMValueRef ConstantVal, value Indices) { 7674647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen return LLVMConstGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices), 7684647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen Wosize_val(Indices)); 7698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 7708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 7711b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue array -> llvalue */ 7721b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal, 7731b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar value Indices) { 7741b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef*) Op_val(Indices), 7751b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar Wosize_val(Indices)); 7761b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 7771b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 778c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov/* llvalue -> lltype -> is_signed:bool -> llvalue */ 779c8ac229cc8349685117f68bc6f1da04f98015cd6Peter ZotovCAMLprim LLVMValueRef llvm_const_intcast(LLVMValueRef CV, LLVMTypeRef T, 780c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov value IsSigned) { 781c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov return LLVMConstIntCast(CV, T, Bool_val(IsSigned)); 782c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov} 783c8ac229cc8349685117f68bc6f1da04f98015cd6Peter Zotov 7841b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> int array -> llvalue */ 7851b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_extractvalue(LLVMValueRef Aggregate, 7861b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar value Indices) { 7871b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLparam1(Indices); 7881b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int size = Wosize_val(Indices); 7891b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int i; 7901b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef result; 7911b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 7921b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned)); 7931b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar for (i = 0; i < size; i++) { 7941b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar idxs[i] = Int_val(Field(Indices, i)); 7951b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar } 7961b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 7971b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar result = LLVMConstExtractValue(Aggregate, idxs, size); 7981b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar free(idxs); 7991b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLreturnT(LLVMValueRef, result); 8001b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 8011b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 8021b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar/* llvalue -> llvalue -> int array -> llvalue */ 8031b42cfd1ca03e48835e8e4c91c5dbb598030257fErick TryzelaarCAMLprim LLVMValueRef llvm_const_insertvalue(LLVMValueRef Aggregate, 8041b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef Val, value Indices) { 8051b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLparam1(Indices); 8061b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int size = Wosize_val(Indices); 8071b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar int i; 8081b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar LLVMValueRef result; 8091b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 8101b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar unsigned* idxs = (unsigned*)malloc(size * sizeof(unsigned)); 8111b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar for (i = 0; i < size; i++) { 8121b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar idxs[i] = Int_val(Field(Indices, i)); 8131b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar } 8141b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 8151b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar result = LLVMConstInsertValue(Aggregate, Val, idxs, size); 8161b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar free(idxs); 8171b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar CAMLreturnT(LLVMValueRef, result); 8181b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar} 8191b42cfd1ca03e48835e8e4c91c5dbb598030257fErick Tryzelaar 820ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar/* lltype -> string -> string -> bool -> bool -> llvalue */ 821ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick TryzelaarCAMLprim LLVMValueRef llvm_const_inline_asm(LLVMTypeRef Ty, value Asm, 822ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar value Constraints, value HasSideEffects, 823ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar value IsAlignStack) { 824ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar return LLVMConstInlineAsm(Ty, String_val(Asm), String_val(Constraints), 825ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar Bool_val(HasSideEffects), Bool_val(IsAlignStack)); 826ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar} 827ce89b4e66f7ec82b2b621c94b072f0b22827a3cdErick Tryzelaar 8288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/ 8298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 83146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_declaration(LLVMValueRef Global) { 83246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsDeclaration(Global)); 8338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 835404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Linkage.t */ 83646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_linkage(LLVMValueRef Global) { 83746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetLinkage(Global)); 8388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 840404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Linkage.t -> llvalue -> unit */ 84146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, LLVMValueRef Global) { 84246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetLinkage(Global, Int_val(Linkage)); 8438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 8448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 84746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_section(LLVMValueRef Global) { 84846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return copy_string(LLVMGetSection(Global)); 8498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 85246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_section(value Section, LLVMValueRef Global) { 85346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetSection(Global, String_val(Section)); 8548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 8558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 857404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* llvalue -> Visibility.t */ 85846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_visibility(LLVMValueRef Global) { 85946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetVisibility(Global)); 8608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 862404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Visibility.t -> llvalue -> unit */ 86346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_visibility(value Viz, LLVMValueRef Global) { 86446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetVisibility(Global, Int_val(Viz)); 8658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 8668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */ 86946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_alignment(LLVMValueRef Global) { 87046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetAlignment(Global)); 8718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 8738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */ 87446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, LLVMValueRef Global) { 87546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetAlignment(Global, Int_val(Bytes)); 8768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 8778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 8788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 879705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/*--... Operations on uses .................................................--*/ 880705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 881705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* llvalue -> lluse option */ 882705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_begin(LLVMValueRef Val) { 883705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLparam0(); 884705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar LLVMUseRef First; 885705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar if ((First = LLVMGetFirstUse(Val))) { 886705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar value Option = alloc(1, 0); 887705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar Field(Option, 0) = (value) First; 888705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLreturn(Option); 889705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar } 890705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLreturn(Val_int(0)); 891705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar} 892705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 893705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> lluse option */ 894705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim value llvm_use_succ(LLVMUseRef U) { 895705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLparam0(); 896705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar LLVMUseRef Next; 897705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar if ((Next = LLVMGetNextUse(U))) { 898705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar value Option = alloc(1, 0); 899705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar Field(Option, 0) = (value) Next; 900705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLreturn(Option); 901705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar } 902705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar CAMLreturn(Val_int(0)); 903705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar} 904705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 905705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */ 906705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_user(LLVMUseRef UR) { 907705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar return LLVMGetUser(UR); 908705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar} 909705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 910705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar/* lluse -> llvalue */ 911705443ffd3f67018c1ec387014262566502a9ee3Erick TryzelaarCAMLprim LLVMValueRef llvm_used_value(LLVMUseRef UR) { 912705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar return LLVMGetUsedValue(UR); 913705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar} 914705443ffd3f67018c1ec387014262566502a9ee3Erick Tryzelaar 9158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/ 9168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 9174733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(global, Global, LLVMModuleRef, LLVMValueRef, 9184733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetGlobalParent) 9194733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 9208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */ 92146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name, 92246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 9236d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef GlobalVar; 9246d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 9256d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) 92657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMConstBitCast(GlobalVar, LLVMPointerType(Ty, 0)); 9276d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen return GlobalVar; 9286d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 92946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMAddGlobal(M, Ty, String_val(Name)); 9308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 9318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 9328e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* lltype -> string -> int -> llmodule -> llvalue */ 9338e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name, 9348e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar value AddressSpace, 9358e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMModuleRef M) { 9368e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMValueRef GlobalVar; 9378e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 9388e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty) 9398e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return LLVMConstBitCast(GlobalVar, 9408e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMPointerType(Ty, Int_val(AddressSpace))); 9418e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return GlobalVar; 9428e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar } 943150c95eab549e1d764eab7ed05b17fe09663fc6ePeter Zotov return LLVMAddGlobalInAddressSpace(M, Ty, String_val(Name), 944150c95eab549e1d764eab7ed05b17fe09663fc6ePeter Zotov Int_val(AddressSpace)); 9458e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar} 9468e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar 9476d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */ 9486d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) { 9496d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLparam1(Name); 9506d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef GlobalVar; 9516d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) { 95275e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen value Option = alloc(1, 0); 9536d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen Field(Option, 0) = (value) GlobalVar; 9546d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Option); 9556d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 9566d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Val_int(0)); 9576d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen} 9586d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen 9598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */ 96046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer, 96146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 96246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar = LLVMAddGlobal(M, LLVMTypeOf(Initializer), 9638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen String_val(Name)); 9648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetInitializer(GlobalVar, Initializer); 96546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return GlobalVar; 9668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 9678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 9688e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar/* string -> llvalue -> int -> llmodule -> llvalue */ 9698e130b1d0d53346e05d0a1161a52c6d62de163c4Erick TryzelaarCAMLprim LLVMValueRef llvm_define_qualified_global(value Name, 9708e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMValueRef Initializer, 9718e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar value AddressSpace, 9728e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMModuleRef M) { 9738e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M, 9748e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMTypeOf(Initializer), 9758e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar String_val(Name), 9768e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar Int_val(AddressSpace)); 9778e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar LLVMSetInitializer(GlobalVar, Initializer); 9788e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar return GlobalVar; 9798e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar} 9808e130b1d0d53346e05d0a1161a52c6d62de163c4Erick Tryzelaar 9818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 98246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) { 98346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteGlobal(GlobalVar); 9848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 9858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 9868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 9878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */ 98846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal, 98946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar) { 99046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetInitializer(GlobalVar, ConstantVal); 9918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 9928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 9938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 9948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 99546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_remove_initializer(LLVMValueRef GlobalVar) { 99646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetInitializer(GlobalVar, NULL); 9978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 9988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 9998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 10008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 100146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_thread_local(LLVMValueRef GlobalVar) { 100246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMIsThreadLocal(GlobalVar)); 10038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 10048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 10058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */ 100646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal, 100746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef GlobalVar) { 100846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetThreadLocal(GlobalVar, Bool_val(IsThreadLocal)); 100946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 101046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 101146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 10128a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> ThreadLocalMode.t */ 10138a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_thread_local_mode(LLVMValueRef GlobalVar) { 10148a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_int(LLVMGetThreadLocalMode(GlobalVar)); 10158a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 10168a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 10178a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* ThreadLocalMode.t -> llvalue -> unit */ 10188a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_thread_local_mode(value ThreadLocalMode, 10198a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMValueRef GlobalVar) { 10208a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMSetThreadLocalMode(GlobalVar, Int_val(ThreadLocalMode)); 10218a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 10228a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 10238a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 10248a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> bool */ 10258a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_is_externally_initialized(LLVMValueRef GlobalVar) { 10268a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_bool(LLVMIsExternallyInitialized(GlobalVar)); 10278a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 10288a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 10298a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* bool -> llvalue -> unit */ 10308a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_externally_initialized(value IsExternallyInitialized, 10318a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMValueRef GlobalVar) { 10328a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMSetExternallyInitialized(GlobalVar, Bool_val(IsExternallyInitialized)); 10338a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 10348a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 10358a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 1036c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* llvalue -> bool */ 1037c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) { 1038c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen return Val_bool(LLVMIsGlobalConstant(GlobalVar)); 1039c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen} 1040c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen 1041c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen/* bool -> llvalue -> unit */ 1042c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon HenriksenCAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) { 1043c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag)); 1044c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen return Val_unit; 1045c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen} 1046c84c16be9b29b4f805b92bfc2d93e2dfaa952f8fGordon Henriksen 10476ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar/*--... Operations on aliases ..............................................--*/ 10486ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar 10496ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick TryzelaarCAMLprim LLVMValueRef llvm_add_alias(LLVMModuleRef M, LLVMTypeRef Ty, 10506ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar LLVMValueRef Aliasee, value Name) { 10516ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar return LLVMAddAlias(M, Ty, Aliasee, String_val(Name)); 10526ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar} 10536ba5c56cf5b1609ec4af45f4901118865a8ed9b6Erick Tryzelaar 105446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on functions ............................................--*/ 105546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 10564733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(function, Function, LLVMModuleRef, LLVMValueRef, 10574733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetGlobalParent) 10584733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 105946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */ 106046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_declare_function(value Name, LLVMTypeRef Ty, 106146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 10626d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef Fn; 10636d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { 10646d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if (LLVMGetElementType(LLVMTypeOf(Fn)) != Ty) 106557cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen return LLVMConstBitCast(Fn, LLVMPointerType(Ty, 0)); 10666d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen return Fn; 10676d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 106846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMAddFunction(M, String_val(Name), Ty); 106946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 107046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 10716d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen/* string -> llmodule -> llvalue option */ 10726d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon HenriksenCAMLprim value llvm_lookup_function(value Name, LLVMModuleRef M) { 10736d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLparam1(Name); 10746d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen LLVMValueRef Fn; 10756d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen if ((Fn = LLVMGetNamedFunction(M, String_val(Name)))) { 107675e290f67aa7af3c0be993df4845c0defaf6ffa3Gordon Henriksen value Option = alloc(1, 0); 10776d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen Field(Option, 0) = (value) Fn; 10786d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Option); 10796d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen } 10806d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen CAMLreturn(Val_int(0)); 10816d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen} 10826d6203dff3560a2cc3ac8ec620ac3b105b0c7cc7Gordon Henriksen 108346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> lltype -> llmodule -> llvalue */ 108446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_define_function(value Name, LLVMTypeRef Ty, 108546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMModuleRef M) { 108646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Fn = LLVMAddFunction(M, String_val(Name), Ty); 1087b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMAppendBasicBlockInContext(LLVMGetTypeContext(Ty), Fn, "entry"); 108846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Fn; 108946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 109046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 109146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> unit */ 109246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_function(LLVMValueRef Fn) { 109346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteFunction(Fn); 109446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 109546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 109646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 109746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */ 109846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_is_intrinsic(LLVMValueRef Fn) { 109946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMGetIntrinsicID(Fn)); 110046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 110146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 110246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> int */ 110346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_function_call_conv(LLVMValueRef Fn) { 110446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_int(LLVMGetFunctionCallConv(Fn)); 110546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 110646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 110746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* int -> llvalue -> unit */ 110846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) { 110946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMSetFunctionCallConv(Fn, Int_val(Id)); 111046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 111146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 111246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 111380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* llvalue -> string option */ 11145eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_gc(LLVMValueRef Fn) { 11155eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen const char *GC; 111680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLparam0(); 111780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLlocal2(Name, Option); 111880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 11195eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if ((GC = LLVMGetGC(Fn))) { 11205eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen Name = copy_string(GC); 112180a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 112280a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen Option = alloc(1, 0); 112380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen Field(Option, 0) = Name; 112480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLreturn(Option); 112580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen } else { 112680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen CAMLreturn(Val_int(0)); 112780a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen } 112880a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 112980a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 113080a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen/* string option -> llvalue -> unit */ 11315eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenCAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) { 11325eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen LLVMSetGC(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0))); 113380a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen return Val_unit; 113480a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen} 113580a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 11360be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */ 1137e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) { 11380be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin LLVMAddFunctionAttr(Arg, Int32_val(PA)); 1139e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1140e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1141e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 11428a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> string -> string -> unit */ 11438a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_add_target_dependent_function_attr( 11448a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMValueRef Arg, value A, value V) { 11458a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMAddTargetDependentFunctionAttr(Arg, String_val(A), String_val(V)); 11468a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 11478a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 11488a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 11490be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 */ 11500be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_function_attr(LLVMValueRef Fn) 11510be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{ 11520be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin CAMLparam0(); 11530be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin CAMLreturn(caml_copy_int32(LLVMGetFunctionAttr(Fn))); 11540be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin} 11550be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin 11560be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */ 1157e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) { 11580be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin LLVMRemoveFunctionAttr(Arg, Int32_val(PA)); 1159e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1160e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 11614733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/*--... Operations on parameters ...........................................--*/ 11624733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 11634733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent) 11644733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 11654733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen/* llvalue -> int -> llvalue */ 11664733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenCAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) { 11674733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return LLVMGetParam(Fn, Int_val(Index)); 11684733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen} 11694733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 11700be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int */ 11710be167bab219cb178f7a6e91186c700ad48aa047Torok EdwinCAMLprim value llvm_param_attr(LLVMValueRef Param) 11720be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin{ 11730be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin CAMLparam0(); 11740be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin CAMLreturn(caml_copy_int32(LLVMGetAttribute(Param))); 11750be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin} 11760be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin 1177e12741055015ef5b98e1225834fcece0a3f04029Erick Tryzelaar/* llvalue -> llvalue */ 1178e12741055015ef5b98e1225834fcece0a3f04029Erick TryzelaarCAMLprim value llvm_params(LLVMValueRef Fn) { 11794733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen value Params = alloc(LLVMCountParams(Fn), 0); 11804733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen LLVMGetParams(Fn, (LLVMValueRef *) Op_val(Params)); 11814733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen return Params; 11824733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen} 11834733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 11840be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */ 1185e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) { 11860be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin LLVMAddAttribute(Arg, Int32_val(PA)); 1187e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1188e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1189e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 11900be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int32 -> unit */ 1191e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) { 11920be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin LLVMRemoveAttribute(Arg, Int32_val(PA)); 1193e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1194e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1195e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 1196e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands/* llvalue -> int -> unit */ 1197e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) { 1198e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands LLVMSetParamAlignment(Arg, Int_val(align)); 1199e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1200e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1201e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 120246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Operations on basic blocks .........................................--*/ 120346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 12044733be38930ae81716bba9ae75a8281bcb180634Gordon HenriksenDEFINE_ITERATORS( 12054733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen block, BasicBlock, LLVMValueRef, LLVMBasicBlockRef, LLVMGetBasicBlockParent) 12064733be38930ae81716bba9ae75a8281bcb180634Gordon Henriksen 1207ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llbasicblock -> llvalue option */ 1208ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_block_terminator(LLVMBasicBlockRef Block) 1209ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{ 1210ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin CAMLparam0(); 1211ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin LLVMValueRef Term = LLVMGetBasicBlockTerminator(Block); 1212ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin if (Term) { 1213ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin value Option = alloc(1, 0); 1214ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin Field(Option, 0) = (value) Term; 1215ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin CAMLreturn(Option); 1216ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin } 1217ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin CAMLreturn(Val_int(0)); 1218ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin} 1219ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin 122046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock array */ 122146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_basic_blocks(LLVMValueRef Fn) { 122246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value MLArray = alloc(LLVMCountBasicBlocks(Fn), 0); 122346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMGetBasicBlocks(Fn, (LLVMBasicBlockRef *) Op_val(MLArray)); 122446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return MLArray; 122546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 122646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 122746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> unit */ 122846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_delete_block(LLVMBasicBlockRef BB) { 122946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDeleteBasicBlock(BB); 123046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_unit; 123146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 123246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 12338a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> unit */ 12348a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_remove_block(LLVMBasicBlockRef BB) { 12358a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMRemoveBasicBlockFromParent(BB); 12368a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 12378a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 12388a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 12398a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> llbasicblock -> unit */ 12408a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_move_block_before(LLVMBasicBlockRef Pos, LLVMBasicBlockRef BB) { 12418a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMMoveBasicBlockBefore(BB, Pos); 12428a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 12438a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 12448a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 12458a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llbasicblock -> llbasicblock -> unit */ 12468a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_move_block_after(LLVMBasicBlockRef Pos, LLVMBasicBlockRef BB) { 12478a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMMoveBasicBlockAfter(BB, Pos); 12488a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 12498a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 12508a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 125146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llvalue -> llbasicblock */ 1252b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_append_block(LLVMContextRef Context, value Name, 1253b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMValueRef Fn) { 1254b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMAppendBasicBlockInContext(Context, Fn, String_val(Name)); 125546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 125646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 125746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* string -> llbasicblock -> llbasicblock */ 1258b02b87882788e57e180c6b903a37ced0db1ce828Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insert_block(LLVMContextRef Context, value Name, 1259b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar LLVMBasicBlockRef BB) { 1260b02b87882788e57e180c6b903a37ced0db1ce828Erick Tryzelaar return LLVMInsertBasicBlockInContext(Context, BB, String_val(Name)); 126146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 126246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 126346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> bool */ 126446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim value llvm_value_is_block(LLVMValueRef Val) { 126546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return Val_bool(LLVMValueIsBasicBlock(Val)); 126646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 126746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1268033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/*--... Operations on instructions .........................................--*/ 1269033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 1270033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenDEFINE_ITERATORS(instr, Instruction, LLVMBasicBlockRef, LLVMValueRef, 1271033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMGetInstructionParent) 1272033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 12736563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin/* llvalue -> Opcode.t */ 12746563c879964c3bcf5c77d40da8d4c807adf605aaTorok EdwinCAMLprim value llvm_instr_get_opcode(LLVMValueRef Inst) { 12753dd16741864302af14b31b7f75375c09d8544a35Torok Edwin LLVMOpcode o; 12763dd16741864302af14b31b7f75375c09d8544a35Torok Edwin if (!LLVMIsAInstruction(Inst)) 12773dd16741864302af14b31b7f75375c09d8544a35Torok Edwin failwith("Not an instruction"); 12783dd16741864302af14b31b7f75375c09d8544a35Torok Edwin o = LLVMGetInstructionOpcode(Inst); 1279efde86753d6f324ac9d0b42e48fd3ebf40c17905Benjamin Kramer assert (o <= LLVMLandingPad); 12806563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin return Val_int(o); 12816563c879964c3bcf5c77d40da8d4c807adf605aaTorok Edwin} 1282033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen 12836b8416192aeb6502f027883b8056d389f2c186a9Peter Zotov/* llvalue -> ICmp.t option */ 12844917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok EdwinCAMLprim value llvm_instr_icmp_predicate(LLVMValueRef Val) { 128531116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLparam0(); 128631116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin int x = LLVMGetICmpPredicate(Val); 128731116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin if (x) { 128831116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin value Option = alloc(1, 0); 128931116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin Field(Option, 0) = Val_int(x - LLVMIntEQ); 129031116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Option); 129131116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin } 129231116410de16f435d8c76c53e3d6b95fa812cd2cTorok Edwin CAMLreturn(Val_int(0)); 12934917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin} 12944917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin 12954917ec9ec775d7bc7fbc3362b4c576c32b7617f4Torok Edwin 1296cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/*--... Operations on call sites ...........................................--*/ 1297cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 1298cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* llvalue -> int */ 1299cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_instruction_call_conv(LLVMValueRef Inst) { 1300cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen return Val_int(LLVMGetInstructionCallConv(Inst)); 1301cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen} 1302cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 1303cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen/* int -> llvalue -> unit */ 1304cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon HenriksenCAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) { 1305cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen LLVMSetInstructionCallConv(Inst, Int_val(CC)); 1306cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen return Val_unit; 1307cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen} 1308cc0928ff22d9f3e8f2930874f6727db8c700ec35Gordon Henriksen 13090be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */ 1310e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr, 1311e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value index, 1312e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value PA) { 13130be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin LLVMAddInstrAttribute(Instr, Int_val(index), Int32_val(PA)); 1314e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1315e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1316e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 13170be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin/* llvalue -> int -> int32 -> unit */ 1318e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan SandsCAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr, 1319e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value index, 1320e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands value PA) { 13210be167bab219cb178f7a6e91186c700ad48aa047Torok Edwin LLVMRemoveInstrAttribute(Instr, Int_val(index), Int32_val(PA)); 1322e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands return Val_unit; 1323e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands} 1324e149e9960ba0726f4b084763f7ef95afa12d9a88Duncan Sands 132507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/*--... Operations on call instructions (only) .............................--*/ 132607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 132707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* llvalue -> bool */ 132807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_is_tail_call(LLVMValueRef CallInst) { 132907cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen return Val_bool(LLVMIsTailCall(CallInst)); 133007cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen} 133107cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 133207cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen/* bool -> llvalue -> unit */ 133307cabf6102800aa701bc4d1bd282fafb63b8a416Gordon HenriksenCAMLprim value llvm_set_tail_call(value IsTailCall, 133407cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen LLVMValueRef CallInst) { 133507cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen LLVMSetTailCall(CallInst, Bool_val(IsTailCall)); 133607cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen return Val_unit; 133707cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen} 133807cabf6102800aa701bc4d1bd282fafb63b8a416Gordon Henriksen 13398a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/*--... Operations on load/store instructions (only)........................--*/ 13408a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 13418a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* llvalue -> bool */ 13428a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_is_volatile(LLVMValueRef MemoryInst) { 13438a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_bool(LLVMGetVolatile(MemoryInst)); 13448a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 13458a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 13468a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* bool -> llvalue -> unit */ 13478a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim value llvm_set_volatile(value IsVolatile, 13488a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMValueRef MemoryInst) { 13498a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMSetVolatile(MemoryInst, Bool_val(IsVolatile)); 13508a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Val_unit; 13518a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 13528a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 13532618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/*--... Operations on phi nodes ............................................--*/ 13542618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 13552618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) -> llvalue -> unit */ 13562618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_add_incoming(value Incoming, LLVMValueRef PhiNode) { 13572618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMAddIncoming(PhiNode, 13582618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMValueRef*) &Field(Incoming, 0), 13592618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMBasicBlockRef*) &Field(Incoming, 1), 13602618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 1); 13612618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen return Val_unit; 13622618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen} 13632618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 13642618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* llvalue -> (llvalue * llbasicblock) list */ 13652618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim value llvm_incoming(LLVMValueRef PhiNode) { 13662618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen unsigned I; 13672618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLparam0(); 13682618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLlocal3(Hd, Tl, Tmp); 13692618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 13702618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen /* Build a tuple list of them. */ 13712618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tl = Val_int(0); 13722618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen for (I = LLVMCountIncoming(PhiNode); I != 0; ) { 13732618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Hd = alloc(2, 0); 13742618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Hd, 0, (value) LLVMGetIncomingValue(PhiNode, --I)); 13752618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Hd, 1, (value) LLVMGetIncomingBlock(PhiNode, I)); 13762618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 13772618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tmp = alloc(2, 0); 13782618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Tmp, 0, Hd); 13792618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Store_field(Tmp, 1, Tl); 13802618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Tl = Tmp; 13812618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen } 13822618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 13832618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen CAMLreturn(Tl); 13842618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen} 13852618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 1386ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> unit */ 1387ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_delete_instruction(LLVMValueRef Instruction) { 1388ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin LLVMInstructionEraseFromParent(Instruction); 1389ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin return Val_unit; 1390ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin} 139146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 139246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*===-- Instruction builders ----------------------------------------------===*/ 139346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 139446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen#define Builder_val(v) (*(LLVMBuilderRef *)(Data_custom_val(v))) 139546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1396a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic void llvm_finalize_builder(value B) { 139746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMDisposeBuilder(Builder_val(B)); 139846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 139946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 140046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksenstatic struct custom_operations builder_ops = { 140119648c00d66d5fc35c7954faa0bc63a34f68cb9dPeter Zotov (char *) "LLVMIRBuilder", 140246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llvm_finalize_builder, 140346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_compare_default, 140446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_hash_default, 140546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_serialize_default, 140646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen custom_deserialize_default 14074d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#ifdef custom_compare_ext_default 14084d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes , custom_compare_ext_default 14094d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#endif 141046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen}; 141146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1412a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksenstatic value alloc_builder(LLVMBuilderRef B) { 1413a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen value V = alloc_custom(&builder_ops, sizeof(LLVMBuilderRef), 0, 1); 1414a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen Builder_val(V) = B; 1415a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen return V; 1416a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen} 1417a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen 14185371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar/* llcontext -> llbuilder */ 14195371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick TryzelaarCAMLprim value llvm_builder(LLVMContextRef C) { 14205371aa2a1c9a4eeecffdb9ab7b2175732e49475bErick Tryzelaar return alloc_builder(LLVMCreateBuilderInContext(C)); 1421a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen} 1422a09a89983bf51aa70d3067282e4817ec3057eb51Gordon Henriksen 1423033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen/* (llbasicblock, llvalue) llpos -> llbuilder -> unit */ 1424033d778249e59548c495f39166a53fa80f48eb91Gordon HenriksenCAMLprim value llvm_position_builder(value Pos, value B) { 1425033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen if (Tag_val(Pos) == 0) { 1426033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMBasicBlockRef BB = (LLVMBasicBlockRef) Op_val(Field(Pos, 0)); 1427033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMPositionBuilderAtEnd(Builder_val(B), BB); 1428033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen } else { 1429033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMValueRef I = (LLVMValueRef) Op_val(Field(Pos, 0)); 1430033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen LLVMPositionBuilderBefore(Builder_val(B), I); 1431033d778249e59548c495f39166a53fa80f48eb91Gordon Henriksen } 14328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 14338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 143446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1435dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen/* llbuilder -> llbasicblock */ 1436628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim LLVMBasicBlockRef llvm_insertion_block(value B) { 1437dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen LLVMBasicBlockRef InsertBlock = LLVMGetInsertBlock(Builder_val(B)); 1438dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen if (!InsertBlock) 1439dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen raise_not_found(); 1440dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen return InsertBlock; 1441dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen} 1442dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen 14435c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar/* llvalue -> string -> llbuilder -> unit */ 1444628b76ecb326d104d2a00c47990c26b22ca9fd42Erick TryzelaarCAMLprim value llvm_insert_into_builder(LLVMValueRef I, value Name, value B) { 1445628b76ecb326d104d2a00c47990c26b22ca9fd42Erick Tryzelaar LLVMInsertIntoBuilderWithName(Builder_val(B), I, String_val(Name)); 14465c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar return Val_unit; 14475c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar} 14485c1c2082968ff4c36063ed09c4eea772eb808b6aErick Tryzelaar 144946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/*--... Metadata ...........................................................--*/ 145046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 145146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */ 145246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_current_debug_location(value B, LLVMValueRef V) { 145346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetCurrentDebugLocation(Builder_val(B), V); 145446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 145546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 145646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 145746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> unit */ 145846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_clear_current_debug_location(value B) { 145946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetCurrentDebugLocation(Builder_val(B), NULL); 146046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 146146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 146246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 146346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue option */ 146446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_current_debug_location(value B) { 146546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLparam0(); 146646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMValueRef L; 146746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar if ((L = LLVMGetCurrentDebugLocation(Builder_val(B)))) { 146846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar value Option = alloc(1, 0); 146946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar Field(Option, 0) = (value) L; 147046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Option); 147146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar } 147246c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar CAMLreturn(Val_int(0)); 147346c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 147446c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 147546c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar/* llbuilder -> llvalue -> unit */ 147646c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick TryzelaarCAMLprim value llvm_set_inst_debug_location(value B, LLVMValueRef V) { 147746c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar LLVMSetInstDebugLocation(Builder_val(B), V); 147846c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar return Val_unit; 147946c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar} 148046c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 148146c80e0c5653e11ada7cebcb46f9a8f7df758e41Erick Tryzelaar 148246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Terminators ........................................................--*/ 148346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 148446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 148546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret_void(value B) { 148646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildRetVoid(Builder_val(B)); 148746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 148846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 148946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbuilder -> llvalue */ 149046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ret(LLVMValueRef Val, value B) { 149146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildRet(Builder_val(B), Val); 149246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 149346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 14946793dd9769047706acf34420586716450344fb66Erick Tryzelaar/* llvalue array -> llbuilder -> llvalue */ 14956793dd9769047706acf34420586716450344fb66Erick TryzelaarCAMLprim LLVMValueRef llvm_build_aggregate_ret(value RetVals, value B) { 14966793dd9769047706acf34420586716450344fb66Erick Tryzelaar return LLVMBuildAggregateRet(Builder_val(B), (LLVMValueRef *) Op_val(RetVals), 14976793dd9769047706acf34420586716450344fb66Erick Tryzelaar Wosize_val(RetVals)); 14986793dd9769047706acf34420586716450344fb66Erick Tryzelaar} 14996793dd9769047706acf34420586716450344fb66Erick Tryzelaar 150046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbasicblock -> llbuilder -> llvalue */ 150146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_br(LLVMBasicBlockRef BB, value B) { 150246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildBr(Builder_val(B), BB); 150346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 150446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 150546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> llbasicblock -> llbuilder -> llvalue */ 150646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_cond_br(LLVMValueRef If, 150746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Then, 150846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Else, 150946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 151046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildCondBr(Builder_val(B), If, Then, Else); 151146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 151246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 151346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llbasicblock -> int -> llbuilder -> llvalue */ 151446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_switch(LLVMValueRef Of, 151546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Else, 151646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value EstimatedCount, 151746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 151846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSwitch(Builder_val(B), Of, Else, Int_val(EstimatedCount)); 151946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 152046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1521ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> string -> llbuilder -> llvalue */ 1522ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_malloc(LLVMTypeRef Ty, value Name, 1523ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin value B) 1524ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{ 1525ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin return LLVMBuildMalloc(Builder_val(B), Ty, String_val(Name)); 1526ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin} 1527ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin 1528ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> string -> llbuilder -> llvalue */ 1529ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_array_malloc(LLVMTypeRef Ty, 1530ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin LLVMValueRef Val, 1531ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin value Name, value B) 1532ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{ 1533ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin return LLVMBuildArrayMalloc(Builder_val(B), Ty, Val, String_val(Name)); 1534ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin} 1535ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin 1536ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */ 1537ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_free(LLVMValueRef P, value B) 1538ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{ 1539ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin return LLVMBuildFree(Builder_val(B), P); 1540ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin} 1541ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin 15421430425539fd8004e47ab664c5e5fe5dc23c6d58Erick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */ 15431430425539fd8004e47ab664c5e5fe5dc23c6d58Erick TryzelaarCAMLprim value llvm_add_case(LLVMValueRef Switch, LLVMValueRef OnVal, 154421491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen LLVMBasicBlockRef Dest) { 154521491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen LLVMAddCase(Switch, OnVal, Dest); 154621491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen return Val_unit; 154721491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen} 154821491edbf4027df4db559eb1a9aa8fbf3779cfabGordon Henriksen 1549c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llbasicblock -> llbuilder -> llvalue */ 1550c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim LLVMValueRef llvm_build_indirect_br(LLVMValueRef Addr, 1551c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar value EstimatedDests, 1552c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar value B) { 1553c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar return LLVMBuildIndirectBr(Builder_val(B), Addr, EstimatedDests); 1554c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar} 1555c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar 1556c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar/* llvalue -> llvalue -> llbasicblock -> unit */ 1557c59286bff1cca8c4fa15f390c9002db94117614eErick TryzelaarCAMLprim value llvm_add_destination(LLVMValueRef IndirectBr, 1558c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar LLVMBasicBlockRef Dest) { 1559c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar LLVMAddDestination(IndirectBr, Dest); 1560c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar return Val_unit; 1561c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar} 1562c59286bff1cca8c4fa15f390c9002db94117614eErick Tryzelaar 156346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> 156446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llbuilder -> llvalue */ 156546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_nat(LLVMValueRef Fn, value Args, 156646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Then, 156746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMBasicBlockRef Catch, 156846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 156946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildInvoke(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Args), 157046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Wosize_val(Args), Then, Catch, String_val(Name)); 157146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 157246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 157346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> llbasicblock -> llbasicblock -> string -> 157446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen llbuilder -> llvalue */ 157546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_invoke_bc(value Args[], int NumArgs) { 157646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return llvm_build_invoke_nat((LLVMValueRef) Args[0], Args[1], 157746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMBasicBlockRef) Args[2], 157846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMBasicBlockRef) Args[3], 157946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Args[4], Args[5]); 158046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 158146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1582ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* lltype -> llvalue -> int -> string -> llbuilder -> llvalue */ 158348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim LLVMValueRef llvm_build_landingpad(LLVMTypeRef Ty, LLVMValueRef PersFn, 158448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin value NumClauses, value Name, 158548488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin value B) { 158648488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin return LLVMBuildLandingPad(Builder_val(B), Ty, PersFn, Int_val(NumClauses), 158748488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin String_val(Name)); 158848488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin} 158948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin 1590ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llvalue -> unit */ 1591ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim value llvm_add_clause(LLVMValueRef LandingPadInst, LLVMValueRef ClauseVal) 1592ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{ 1593ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin LLVMAddClause(LandingPadInst, ClauseVal); 1594ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin return Val_unit; 1595ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin} 1596ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin 1597ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin 1598ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> bool -> unit */ 159948488a64fadb2f99706029e51ae4c06fcfac5cdbTorok EdwinCAMLprim value llvm_set_cleanup(LLVMValueRef LandingPadInst, value flag) 160048488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin{ 160148488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin LLVMSetCleanup(LandingPadInst, Bool_val(flag)); 160248488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin return Val_unit; 160348488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin} 160448488a64fadb2f99706029e51ae4c06fcfac5cdbTorok Edwin 1605ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin/* llvalue -> llbuilder -> llvalue */ 1606ff616cb440d696b2663d55494e0a5aedfab20726Torok EdwinCAMLprim LLVMValueRef llvm_build_resume(LLVMValueRef Exn, value B) 1607ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin{ 1608ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin return LLVMBuildResume(Builder_val(B), Exn); 1609ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin} 1610ff616cb440d696b2663d55494e0a5aedfab20726Torok Edwin 161146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llbuilder -> llvalue */ 161246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_unreachable(value B) { 161346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUnreachable(Builder_val(B)); 161446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 161546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 161646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Arithmetic .........................................................--*/ 161746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 161846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 161946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_add(LLVMValueRef LHS, LLVMValueRef RHS, 162046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 162146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAdd(Builder_val(B), LHS, RHS, String_val(Name)); 162246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 162346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 162446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1625e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_add(LLVMValueRef LHS, LLVMValueRef RHS, 1626e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1627e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildNSWAdd(Builder_val(B), LHS, RHS, String_val(Name)); 1628e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1629e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1630e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 163119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_add(LLVMValueRef LHS, LLVMValueRef RHS, 163219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 163319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWAdd(Builder_val(B), LHS, RHS, String_val(Name)); 163419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 163519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 163619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1637e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fadd(LLVMValueRef LHS, LLVMValueRef RHS, 1638e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1639e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFAdd(Builder_val(B), LHS, RHS, String_val(Name)); 1640e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1641e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1642e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 164346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sub(LLVMValueRef LHS, LLVMValueRef RHS, 164446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 164546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSub(Builder_val(B), LHS, RHS, String_val(Name)); 164646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 164746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 164846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 164919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_sub(LLVMValueRef LHS, LLVMValueRef RHS, 165019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 165119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWSub(Builder_val(B), LHS, RHS, String_val(Name)); 165219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 165319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 165419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 165519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_sub(LLVMValueRef LHS, LLVMValueRef RHS, 165619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 165719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWSub(Builder_val(B), LHS, RHS, String_val(Name)); 165819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 165919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 166019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1661e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fsub(LLVMValueRef LHS, LLVMValueRef RHS, 1662e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1663e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFSub(Builder_val(B), LHS, RHS, String_val(Name)); 1664e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1665e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1666e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 166746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_mul(LLVMValueRef LHS, LLVMValueRef RHS, 166846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 166946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildMul(Builder_val(B), LHS, RHS, String_val(Name)); 167046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 167146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 167246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 167319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_mul(LLVMValueRef LHS, LLVMValueRef RHS, 167419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 167519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWMul(Builder_val(B), LHS, RHS, String_val(Name)); 167619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 167719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 167819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 167919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_mul(LLVMValueRef LHS, LLVMValueRef RHS, 168019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 168119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWMul(Builder_val(B), LHS, RHS, String_val(Name)); 168219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 168319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 168419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1685e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fmul(LLVMValueRef LHS, LLVMValueRef RHS, 1686e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1687e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFMul(Builder_val(B), LHS, RHS, String_val(Name)); 1688e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1689e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1690e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 169146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_udiv(LLVMValueRef LHS, LLVMValueRef RHS, 169246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 169346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUDiv(Builder_val(B), LHS, RHS, String_val(Name)); 169446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 169546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 169646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 169746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sdiv(LLVMValueRef LHS, LLVMValueRef RHS, 169846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 169946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSDiv(Builder_val(B), LHS, RHS, String_val(Name)); 170046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 170146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 170246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 1703e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_exact_sdiv(LLVMValueRef LHS, LLVMValueRef RHS, 1704e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1705e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildExactSDiv(Builder_val(B), LHS, RHS, String_val(Name)); 1706e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1707e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1708e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 170946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fdiv(LLVMValueRef LHS, LLVMValueRef RHS, 171046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 171146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFDiv(Builder_val(B), LHS, RHS, String_val(Name)); 171246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 171346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 171446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 171546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_urem(LLVMValueRef LHS, LLVMValueRef RHS, 171646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 171746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildURem(Builder_val(B), LHS, RHS, String_val(Name)); 171846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 171946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 172046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 172146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_srem(LLVMValueRef LHS, LLVMValueRef RHS, 172246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 172346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSRem(Builder_val(B), LHS, RHS, String_val(Name)); 172446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 172546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 172646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 172746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_frem(LLVMValueRef LHS, LLVMValueRef RHS, 172846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 172946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFRem(Builder_val(B), LHS, RHS, String_val(Name)); 173046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 173146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 173246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 173346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shl(LLVMValueRef LHS, LLVMValueRef RHS, 173446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 173546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildShl(Builder_val(B), LHS, RHS, String_val(Name)); 173646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 173746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 173846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 173946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_lshr(LLVMValueRef LHS, LLVMValueRef RHS, 174046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 174146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildLShr(Builder_val(B), LHS, RHS, String_val(Name)); 174246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 174346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 174446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 174546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_ashr(LLVMValueRef LHS, LLVMValueRef RHS, 174646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 174746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAShr(Builder_val(B), LHS, RHS, String_val(Name)); 174846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 174946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 175046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 175146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_and(LLVMValueRef LHS, LLVMValueRef RHS, 175246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 175346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAnd(Builder_val(B), LHS, RHS, String_val(Name)); 175446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 175546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 175646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 175746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_or(LLVMValueRef LHS, LLVMValueRef RHS, 175846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 175946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildOr(Builder_val(B), LHS, RHS, String_val(Name)); 176046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 176146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 176246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 176346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_xor(LLVMValueRef LHS, LLVMValueRef RHS, 176446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 176546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildXor(Builder_val(B), LHS, RHS, String_val(Name)); 176646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 176746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 176846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 176946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_neg(LLVMValueRef X, 177046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 177146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildNeg(Builder_val(B), X, String_val(Name)); 177246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 177346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 177446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 177519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nsw_neg(LLVMValueRef X, 177619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 177719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNSWNeg(Builder_val(B), X, String_val(Name)); 177819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 177919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 178019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 178119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_nuw_neg(LLVMValueRef X, 178219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 178319f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildNUWNeg(Builder_val(B), X, String_val(Name)); 178419f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 178519f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 178619f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 178719f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick TryzelaarCAMLprim LLVMValueRef llvm_build_fneg(LLVMValueRef X, 178819f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar value Name, value B) { 178919f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar return LLVMBuildFNeg(Builder_val(B), X, String_val(Name)); 179019f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar} 179119f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar 179219f047f5f6c44d1cd5681f9314b3ff5e7bae122dErick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 179346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_not(LLVMValueRef X, 179446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 179546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildNot(Builder_val(B), X, String_val(Name)); 179646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 179746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 179846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Memory .............................................................--*/ 179946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 180046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> string -> llbuilder -> llvalue */ 180146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_alloca(LLVMTypeRef Ty, 180246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 180346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildAlloca(Builder_val(B), Ty, String_val(Name)); 180446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 180546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 180646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* lltype -> llvalue -> string -> llbuilder -> llvalue */ 180746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_array_alloca(LLVMTypeRef Ty, LLVMValueRef Size, 180846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 180946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildArrayAlloca(Builder_val(B), Ty, Size, String_val(Name)); 181046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 181146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 181246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> string -> llbuilder -> llvalue */ 181346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_load(LLVMValueRef Pointer, 181446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 181546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildLoad(Builder_val(B), Pointer, String_val(Name)); 181646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 181746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 181846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llbuilder -> llvalue */ 181946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_store(LLVMValueRef Value, LLVMValueRef Pointer, 182046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value B) { 182146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildStore(Builder_val(B), Value, Pointer); 182246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 182346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 18248a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov/* AtomicRMWBinOp.t -> llvalue -> llvalue -> AtomicOrdering.t -> 18258a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov bool -> llbuilder -> llvalue */ 18268a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMValueRef llvm_build_atomicrmw_native(value BinOp, LLVMValueRef Ptr, 18278a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMValueRef Val, value Ord, 18288a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov value ST, value Name, value B) { 18298a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMValueRef Instr; 18308a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov Instr = LLVMBuildAtomicRMW(Builder_val(B), Int_val(BinOp), 18318a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov Ptr, Val, Int_val(Ord), Bool_val(ST)); 18328a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov LLVMSetValueName(Instr, String_val(Name)); 18338a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return Instr; 18348a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 18358a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 18368a3bdd6a3fa8312809a432579a5685d431ca8410Peter ZotovCAMLprim LLVMValueRef llvm_build_atomicrmw_bytecode(value *argv, int argn) { 18378a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov return llvm_build_atomicrmw_native(argv[0], (LLVMValueRef) argv[1], 18388a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov (LLVMValueRef) argv[2], argv[3], 18398a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov argv[4], argv[5], argv[6]); 18408a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov} 18418a3bdd6a3fa8312809a432579a5685d431ca8410Peter Zotov 184246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 184346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_gep(LLVMValueRef Pointer, value Indices, 184446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 184546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildGEP(Builder_val(B), Pointer, 184646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen (LLVMValueRef *) Op_val(Indices), Wosize_val(Indices), 184746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 184846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 184946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1850e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 1851e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_in_bounds_gep(LLVMValueRef Pointer, 1852e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Indices, value Name, 1853e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1854e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildInBoundsGEP(Builder_val(B), Pointer, 1855e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar (LLVMValueRef *) Op_val(Indices), 1856e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar Wosize_val(Indices), String_val(Name)); 1857e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1858e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1859e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */ 1860e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_struct_gep(LLVMValueRef Pointer, 1861c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner value Index, value Name, 1862e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1863c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner return LLVMBuildStructGEP(Builder_val(B), Pointer, 1864c3c3be582de556f2a199f9154ec48f00be8eb077Chris Lattner Int_val(Index), String_val(Name)); 1865e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1866e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1867e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */ 1868e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_string(value Str, value Name, value B) { 1869e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildGlobalString(Builder_val(B), String_val(Str), 1870e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1871e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1872e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1873e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* string -> string -> llbuilder -> llvalue */ 1874e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_global_stringptr(value Str, value Name, 1875e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1876e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildGlobalStringPtr(Builder_val(B), String_val(Str), 1877e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 1878e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1879e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 188046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Casts ..............................................................--*/ 188146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 188246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 188346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_trunc(LLVMValueRef X, LLVMTypeRef Ty, 188446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 188546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildTrunc(Builder_val(B), X, Ty, String_val(Name)); 188646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 188746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 188846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 188946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_zext(LLVMValueRef X, LLVMTypeRef Ty, 189046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 189146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildZExt(Builder_val(B), X, Ty, String_val(Name)); 189246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 189346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 189446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 189546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sext(LLVMValueRef X, LLVMTypeRef Ty, 189646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 189746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSExt(Builder_val(B), X, Ty, String_val(Name)); 189846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 189946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 190046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 190146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptoui(LLVMValueRef X, LLVMTypeRef Ty, 190246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 190346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPToUI(Builder_val(B), X, Ty, String_val(Name)); 190446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 190546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 190646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 190746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptosi(LLVMValueRef X, LLVMTypeRef Ty, 190846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 190946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPToSI(Builder_val(B), X, Ty, String_val(Name)); 191046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 191146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 191246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 191346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_uitofp(LLVMValueRef X, LLVMTypeRef Ty, 191446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 191546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildUIToFP(Builder_val(B), X, Ty, String_val(Name)); 191646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 191746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 191846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 191946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_sitofp(LLVMValueRef X, LLVMTypeRef Ty, 192046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 192146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSIToFP(Builder_val(B), X, Ty, String_val(Name)); 192246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 192346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 192446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 192546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fptrunc(LLVMValueRef X, LLVMTypeRef Ty, 192646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 192746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPTrunc(Builder_val(B), X, Ty, String_val(Name)); 192846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 192946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 193046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 193146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fpext(LLVMValueRef X, LLVMTypeRef Ty, 193246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 193346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFPExt(Builder_val(B), X, Ty, String_val(Name)); 193446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 193546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 193646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 193746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_prttoint(LLVMValueRef X, LLVMTypeRef Ty, 193846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 193946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildPtrToInt(Builder_val(B), X, Ty, String_val(Name)); 194046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 194146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 194246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 194346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_inttoptr(LLVMValueRef X, LLVMTypeRef Ty, 194446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 194546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildIntToPtr(Builder_val(B), X, Ty, String_val(Name)); 194646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 194746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 194846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 194946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 195046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 195146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildBitCast(Builder_val(B), X, Ty, String_val(Name)); 195246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 195346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1954e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1955e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_zext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 1956e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1957e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildZExtOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1958e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1959e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1960e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1961e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_sext_or_bitcast(LLVMValueRef X, LLVMTypeRef Ty, 1962e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1963e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildSExtOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1964e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1965e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1966e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1967e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_trunc_or_bitcast(LLVMValueRef X, 1968e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar LLVMTypeRef Ty, value Name, 1969e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 1970e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildTruncOrBitCast(Builder_val(B), X, Ty, String_val(Name)); 1971e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1972e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1973e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1974e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_pointercast(LLVMValueRef X, LLVMTypeRef Ty, 1975e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1976e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildPointerCast(Builder_val(B), X, Ty, String_val(Name)); 1977e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1978e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1979e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1980e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_intcast(LLVMValueRef X, LLVMTypeRef Ty, 1981e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1982e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIntCast(Builder_val(B), X, Ty, String_val(Name)); 1983e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1984e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 1985e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 1986e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_fpcast(LLVMValueRef X, LLVMTypeRef Ty, 1987e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 1988e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildFPCast(Builder_val(B), X, Ty, String_val(Name)); 1989e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 1990e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 199146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Comparisons ........................................................--*/ 199246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 1993404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Icmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 199446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_icmp(value Pred, 199546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef LHS, LLVMValueRef RHS, 199646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 199746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildICmp(Builder_val(B), Int_val(Pred) + LLVMIntEQ, LHS, RHS, 199846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 199946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 200046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 2001404a1942e43ca967700cc2608eb97b863add2677Gordon Henriksen/* Fcmp.t -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 200246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_fcmp(value Pred, 200346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef LHS, LLVMValueRef RHS, 200446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 200546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildFCmp(Builder_val(B), Int_val(Pred), LHS, RHS, 200646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 200746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 200846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 200946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/*--... Miscellaneous instructions .........................................--*/ 201046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 20112618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen/* (llvalue * llbasicblock) list -> string -> llbuilder -> llvalue */ 20122618a6c1122d5d2007787fb56156be44b21ab32aGordon HenriksenCAMLprim LLVMValueRef llvm_build_phi(value Incoming, value Name, value B) { 20132618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen value Hd, Tl; 20142618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMValueRef FirstValue, PhiNode; 20152618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 20162618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen assert(Incoming != Val_int(0) && "Empty list passed to Llvm.build_phi!"); 20172618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 20182618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen Hd = Field(Incoming, 0); 20192618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen FirstValue = (LLVMValueRef) Field(Hd, 0); 20202618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen PhiNode = LLVMBuildPhi(Builder_val(B), LLVMTypeOf(FirstValue), 20212618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen String_val(Name)); 20222618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 20232618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen for (Tl = Incoming; Tl != Val_int(0); Tl = Field(Tl, 1)) { 20242618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen value Hd = Field(Tl, 0); 20252618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen LLVMAddIncoming(PhiNode, (LLVMValueRef*) &Field(Hd, 0), 20262618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen (LLVMBasicBlockRef*) &Field(Hd, 1), 1); 20272618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen } 20282618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen 20292618a6c1122d5d2007787fb56156be44b21ab32aGordon Henriksen return PhiNode; 203046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 203146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 203246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue array -> string -> llbuilder -> llvalue */ 203346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params, 203446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 203546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildCall(Builder_val(B), Fn, (LLVMValueRef *) Op_val(Params), 203646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen Wosize_val(Params), String_val(Name)); 203746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 203846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 203946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 204046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_select(LLVMValueRef If, 204146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Then, LLVMValueRef Else, 204246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 204346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildSelect(Builder_val(B), If, Then, Else, String_val(Name)); 204446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 204546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 204646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> lltype -> string -> llbuilder -> llvalue */ 204746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_va_arg(LLVMValueRef List, LLVMTypeRef Ty, 204846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 204946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildVAArg(Builder_val(B), List, Ty, String_val(Name)); 205046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 205146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 205246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 205346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_extractelement(LLVMValueRef Vec, 205446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Idx, 205546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 205646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildExtractElement(Builder_val(B), Vec, Idx, String_val(Name)); 205746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 205846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 205946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 206046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_insertelement(LLVMValueRef Vec, 206146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Element, 206246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Idx, 206346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 206446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildInsertElement(Builder_val(B), Vec, Element, Idx, 206546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen String_val(Name)); 206646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 206746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 206846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */ 206946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon HenriksenCAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2, 207046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen LLVMValueRef Mask, 207146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen value Name, value B) { 207246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name)); 207346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen} 207446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen 2075e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> int -> string -> llbuilder -> llvalue */ 2076e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_extractvalue(LLVMValueRef Aggregate, 2077e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Idx, value Name, value B) { 2078e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildExtractValue(Builder_val(B), Aggregate, Int_val(Idx), 2079e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 2080e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 2081e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 2082e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> int -> string -> llbuilder -> llvalue */ 2083e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_insertvalue(LLVMValueRef Aggregate, 2084e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar LLVMValueRef Val, value Idx, 2085e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 2086e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildInsertValue(Builder_val(B), Aggregate, Val, Int_val(Idx), 2087e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar String_val(Name)); 2088e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 2089e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 2090e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 2091e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_null(LLVMValueRef Val, value Name, 2092e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 2093e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIsNull(Builder_val(B), Val, String_val(Name)); 2094e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 2095e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 2096e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> string -> llbuilder -> llvalue */ 2097e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_is_not_null(LLVMValueRef Val, value Name, 2098e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value B) { 2099e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildIsNotNull(Builder_val(B), Val, String_val(Name)); 2100e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 2101e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar 2102e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar/* llvalue -> llvalue -> string -> llbuilder -> llvalue */ 2103e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick TryzelaarCAMLprim LLVMValueRef llvm_build_ptrdiff(LLVMValueRef LHS, LLVMValueRef RHS, 2104e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar value Name, value B) { 2105e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar return LLVMBuildPtrDiff(Builder_val(B), LHS, RHS, String_val(Name)); 2106e0f8bf6cbe1bee904021a8ae45008e3703dde283Erick Tryzelaar} 21071ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen 2108da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/*===-- Memory buffers ----------------------------------------------------===*/ 2109da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 2110da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* string -> llmemorybuffer 2111da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen raises IoError msg on error */ 2112da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_of_file(value Path) { 2113da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLparam1(Path); 2114da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen char *Message; 2115da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMMemoryBufferRef MemBuf; 2116da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 2117da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (LLVMCreateMemoryBufferWithContentsOfFile(String_val(Path), 2118da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen &MemBuf, &Message)) 2119da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen llvm_raise(llvm_ioerror_exn, Message); 2120da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 2121da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen CAMLreturn((value) MemBuf); 2122da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 2123da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 2124da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* unit -> llmemorybuffer 2125da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen raises IoError msg on error */ 2126da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) { 2127da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen char *Message; 2128da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMMemoryBufferRef MemBuf; 2129da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 2130da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (LLVMCreateMemoryBufferWithSTDIN(&MemBuf, &Message)) 2131da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen llvm_raise(llvm_ioerror_exn, Message); 2132da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 2133da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return MemBuf; 2134da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 2135da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 2136f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* ?name:string -> string -> llmemorybuffer */ 2137f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_string(value Name, value String) { 2138f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov const char *NameCStr; 2139f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov if(Name == Val_int(0)) 2140f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov NameCStr = ""; 2141f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov else 2142f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov NameCStr = String_val(Field(Name, 0)); 2143f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov 2144f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov LLVMMemoryBufferRef MemBuf; 2145f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov MemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy( 2146f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov String_val(String), caml_string_length(String), NameCStr); 2147f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov 2148f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov return MemBuf; 2149f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov} 2150f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov 2151f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov/* llmemorybuffer -> string */ 2152f00a9e0f79541538df7e3af2e83de37f40d904ccPeter ZotovCAMLprim value llvm_memorybuffer_as_string(LLVMMemoryBufferRef MemBuf) { 2153f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov value String = caml_alloc_string(LLVMGetBufferSize(MemBuf)); 2154f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov memcpy(String_val(String), LLVMGetBufferStart(MemBuf), 2155f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov LLVMGetBufferSize(MemBuf)); 2156f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov 2157f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov return String; 2158f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov} 2159f00a9e0f79541538df7e3af2e83de37f40d904ccPeter Zotov 2160da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* llmemorybuffer -> unit */ 2161da1435f86ebc9886dd7704294e01d192d79e069cGordon HenriksenCAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) { 2162da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMDisposeMemoryBuffer(MemBuf); 2163da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return Val_unit; 2164da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 2165da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 2166d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/*===-- Pass Managers -----------------------------------------------------===*/ 2167d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 2168d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* unit -> [ `Module ] PassManager.t */ 2169d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim LLVMPassManagerRef llvm_passmanager_create(value Unit) { 2170d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return LLVMCreatePassManager(); 2171d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 2172d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 2173d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llmodule -> [ `Function ] PassManager.t -> bool */ 2174d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_module(LLVMModuleRef M, 2175d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMPassManagerRef PM) { 2176d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMRunPassManager(PM, M)); 2177d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 2178d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 2179d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */ 2180d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_initialize(LLVMPassManagerRef FPM) { 2181d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMInitializeFunctionPassManager(FPM)); 2182d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 2183d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 2184d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* llvalue -> [ `Function ] PassManager.t -> bool */ 2185d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_run_function(LLVMValueRef F, 2186d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMPassManagerRef FPM) { 2187d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMRunFunctionPassManager(FPM, F)); 2188d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 2189d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 2190d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* [ `Function ] PassManager.t -> bool */ 2191d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_finalize(LLVMPassManagerRef FPM) { 2192d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_bool(LLVMFinalizeFunctionPassManager(FPM)); 2193d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 2194d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen 2195d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen/* PassManager.any PassManager.t -> unit */ 2196d78c0f5a7255e4347cbd82f7435c51401096652cGordon HenriksenCAMLprim value llvm_passmanager_dispose(LLVMPassManagerRef PM) { 2197d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen LLVMDisposePassManager(PM); 2198d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen return Val_unit; 2199d78c0f5a7255e4347cbd82f7435c51401096652cGordon Henriksen} 2200