1606c5aa084041eb5ad60710728098eaf9c997315Gordon Henriksen/*===-- executionengine_ocaml.c - LLVM Ocaml Glue ---------------*- C++ -*-===*\ 22e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 32e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* The LLVM Compiler Infrastructure *| 42e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 5234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* This file is distributed under the University of Illinois Open Source *| 6234d529e582963ad4b5d83b911cd057fe99d1435Chris Lattner|* License. See LICENSE.TXT for details. *| 72e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 82e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|*===----------------------------------------------------------------------===*| 92e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 102e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* This file glues LLVM's ocaml interface to its C interface. These functions *| 112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* are by and large transparent wrappers to the corresponding C functions. *| 122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* Note that these functions intentionally take liberties with the CAMLparamX *| 142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* macros, since most of the parameters are not GC heap objects. *| 152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen\*===----------------------------------------------------------------------===*/ 172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include "llvm-c/ExecutionEngine.h" 19e46161f10c3e0c640b22e446b873df8b01413f52Bob Wilson#include "llvm-c/Target.h" 202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include "caml/alloc.h" 212e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include "caml/custom.h" 222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include "caml/fail.h" 232e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include "caml/memory.h" 242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include <string.h> 252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include <assert.h> 262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2746262684285cd7baf74425610228ac8b4547dab1Erick Tryzelaar/* Force the LLVM interpreter and JIT to be linked in. */ 28e46161f10c3e0c640b22e446b873df8b01413f52Bob Wilsonvoid llvm_initialize(void) { 29e46161f10c3e0c640b22e446b873df8b01413f52Bob Wilson LLVMLinkInInterpreter(); 30e46161f10c3e0c640b22e446b873df8b01413f52Bob Wilson LLVMLinkInJIT(); 3146262684285cd7baf74425610228ac8b4547dab1Erick Tryzelaar} 3246262684285cd7baf74425610228ac8b4547dab1Erick Tryzelaar 3346262684285cd7baf74425610228ac8b4547dab1Erick Tryzelaar/* unit -> bool */ 3446262684285cd7baf74425610228ac8b4547dab1Erick TryzelaarCAMLprim value llvm_initialize_native_target(value Unit) { 3546262684285cd7baf74425610228ac8b4547dab1Erick Tryzelaar return Val_bool(LLVMInitializeNativeTarget()); 36e46161f10c3e0c640b22e446b873df8b01413f52Bob Wilson} 372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 382e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* Can't use the recommended caml_named_value mechanism for backwards 392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen compatibility reasons. This is largely equivalent. */ 402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic value llvm_ee_error_exn; 412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 422e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_register_ee_exns(value Error) { 432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen llvm_ee_error_exn = Field(Error, 0); 442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen register_global_root(&llvm_ee_error_exn); 452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Val_unit; 462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void llvm_raise(value Prototype, char *Message) { 492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CAMLparam1(Prototype); 502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CAMLlocal1(CamlMessage); 512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CamlMessage = copy_string(Message); 532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMDisposeMessage(Message); 542e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen raise_with_arg(Prototype, CamlMessage); 562e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen abort(); /* NOTREACHED */ 57a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#ifdef CAMLnoreturn 58a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen CAMLnoreturn; /* Silences warnings, but is missing in some versions. */ 59a9d059693b0bfdaa27bad71c2b0769beaf6ee7ddGordon Henriksen#endif 602e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*--... Operations on generic values .......................................--*/ 642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 652e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#define Genericvalue_val(v) (*(LLVMGenericValueRef *)(Data_custom_val(v))) 662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic void llvm_finalize_generic_value(value GenVal) { 682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMDisposeGenericValue(Genericvalue_val(GenVal)); 692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic struct custom_operations generic_value_ops = { 722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen (char *) "LLVMGenericValue", 732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen llvm_finalize_generic_value, 742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen custom_compare_default, 752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen custom_hash_default, 762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen custom_serialize_default, 772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen custom_deserialize_default 784d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#ifdef custom_compare_ext_default 794d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes , custom_compare_ext_default 804d00161e0a047e0a15842360a0a8653dc4f2ed53Nuno Lopes#endif 812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}; 822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 832e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenstatic value alloc_generic_value(LLVMGenericValueRef Ref) { 842e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen value Val = alloc_custom(&generic_value_ops, sizeof(LLVMGenericValueRef), 0, 1); 852e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen Genericvalue_val(Val) = Ref; 862e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Val; 872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 882e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* Llvm.lltype -> float -> t */ 902e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_of_float(LLVMTypeRef Ty, value N) { 9115ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLparam1(N); 9215ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLreturn(alloc_generic_value( 9315ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen LLVMCreateGenericValueOfFloat(Ty, Double_val(N)))); 942e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 952e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* 'a -> t */ 979c7c566efe4b942ed8597156bf66e9abf98c79b5Erick TryzelaarCAMLprim value llvm_genericvalue_of_pointer(value V) { 9815ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLparam1(V); 9915ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLreturn(alloc_generic_value(LLVMCreateGenericValueOfPointer(Op_val(V)))); 1002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1012e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1022e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* Llvm.lltype -> int -> t */ 1032e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_of_int(LLVMTypeRef Ty, value Int) { 1042e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return alloc_generic_value(LLVMCreateGenericValueOfInt(Ty, Int_val(Int), 1)); 1052e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1062e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1072e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* Llvm.lltype -> int32 -> t */ 1082e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_of_int32(LLVMTypeRef Ty, value Int32) { 10915ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLparam1(Int32); 11015ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLreturn(alloc_generic_value( 11115ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen LLVMCreateGenericValueOfInt(Ty, Int32_val(Int32), 1))); 1122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* Llvm.lltype -> nativeint -> t */ 1152e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_of_nativeint(LLVMTypeRef Ty, value NatInt) { 11615ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLparam1(NatInt); 11715ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLreturn(alloc_generic_value( 11815ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen LLVMCreateGenericValueOfInt(Ty, Nativeint_val(NatInt), 1))); 1192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1212e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* Llvm.lltype -> int64 -> t */ 1222e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_of_int64(LLVMTypeRef Ty, value Int64) { 12315ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLparam1(Int64); 12415ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLreturn(alloc_generic_value( 12515ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen LLVMCreateGenericValueOfInt(Ty, Int64_val(Int64), 1))); 1262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* Llvm.lltype -> t -> float */ 1292e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_as_float(LLVMTypeRef Ty, value GenVal) { 13015ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLparam1(GenVal); 13115ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLreturn(copy_double( 13215ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen LLVMGenericValueToFloat(Ty, Genericvalue_val(GenVal)))); 1332e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1342e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* t -> 'a */ 1369c7c566efe4b942ed8597156bf66e9abf98c79b5Erick TryzelaarCAMLprim value llvm_genericvalue_as_pointer(value GenVal) { 1372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Val_op(LLVMGenericValueToPointer(Genericvalue_val(GenVal))); 1382e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* t -> int */ 1412e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_as_int(value GenVal) { 1422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen assert(LLVMGenericValueIntWidth(Genericvalue_val(GenVal)) <= 8 * sizeof(value) 1432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen && "Generic value too wide to treat as an int!"); 1442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Val_int(LLVMGenericValueToInt(Genericvalue_val(GenVal), 1)); 1452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* t -> int32 */ 1482e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_as_int32(value GenVal) { 14915ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLparam1(GenVal); 1502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen assert(LLVMGenericValueIntWidth(Genericvalue_val(GenVal)) <= 32 1512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen && "Generic value too wide to treat as an int32!"); 15215ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLreturn(copy_int32(LLVMGenericValueToInt(Genericvalue_val(GenVal), 1))); 1532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1542e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* t -> int64 */ 1562e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_as_int64(value GenVal) { 15715ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLparam1(GenVal); 1582e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen assert(LLVMGenericValueIntWidth(Genericvalue_val(GenVal)) <= 64 1592e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen && "Generic value too wide to treat as an int64!"); 16015ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLreturn(copy_int64(LLVMGenericValueToInt(Genericvalue_val(GenVal), 1))); 1612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* t -> nativeint */ 1642e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_genericvalue_as_nativeint(value GenVal) { 16515ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLparam1(GenVal); 1662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen assert(LLVMGenericValueIntWidth(Genericvalue_val(GenVal)) <= 8 * sizeof(value) 1672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen && "Generic value too wide to treat as a nativeint!"); 16815ac8b9e6dec8f60879331fe62e62c92e09bfdb6Gordon Henriksen CAMLreturn(copy_nativeint(LLVMGenericValueToInt(Genericvalue_val(GenVal),1))); 1692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*--... Operations on execution engines ....................................--*/ 1732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 17416609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar/* llmodule -> ExecutionEngine.t */ 17516609f3c5c26ba34603ae0d7ebab86fb11a72722Erick TryzelaarCAMLprim LLVMExecutionEngineRef llvm_ee_create(LLVMModuleRef M) { 1762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMExecutionEngineRef Interp; 1772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen char *Error; 17816609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar if (LLVMCreateExecutionEngineForModule(&Interp, M, &Error)) 1792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen llvm_raise(llvm_ee_error_exn, Error); 1802e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Interp; 1812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 18316609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar/* llmodule -> ExecutionEngine.t */ 1842e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim LLVMExecutionEngineRef 18516609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaarllvm_ee_create_interpreter(LLVMModuleRef M) { 1862e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMExecutionEngineRef Interp; 1872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen char *Error; 18816609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar if (LLVMCreateInterpreterForModule(&Interp, M, &Error)) 1892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen llvm_raise(llvm_ee_error_exn, Error); 1902e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Interp; 1912e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1922e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1930dd27da1841ca50d00aad3465f4f9b6a646fd64eErick Tryzelaar/* llmodule -> int -> ExecutionEngine.t */ 194c13c4d6a1bbc91a9e3bb9f964f32f3a999071070Gordon HenriksenCAMLprim LLVMExecutionEngineRef 1950dd27da1841ca50d00aad3465f4f9b6a646fd64eErick Tryzelaarllvm_ee_create_jit(LLVMModuleRef M, value OptLevel) { 196c13c4d6a1bbc91a9e3bb9f964f32f3a999071070Gordon Henriksen LLVMExecutionEngineRef JIT; 197c13c4d6a1bbc91a9e3bb9f964f32f3a999071070Gordon Henriksen char *Error; 1980dd27da1841ca50d00aad3465f4f9b6a646fd64eErick Tryzelaar if (LLVMCreateJITCompilerForModule(&JIT, M, Int_val(OptLevel), &Error)) 1992e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen llvm_raise(llvm_ee_error_exn, Error); 2002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return JIT; 2012e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2022e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2032e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* ExecutionEngine.t -> unit */ 2042e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_ee_dispose(LLVMExecutionEngineRef EE) { 2052e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMDisposeExecutionEngine(EE); 2062e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Val_unit; 2072e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2082e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 20916609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar/* llmodule -> ExecutionEngine.t -> unit */ 2109c7c566efe4b942ed8597156bf66e9abf98c79b5Erick TryzelaarCAMLprim value llvm_ee_add_module(LLVMModuleRef M, LLVMExecutionEngineRef EE) { 21116609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar LLVMAddModule(EE, M); 2122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Val_unit; 2132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 21516609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar/* llmodule -> ExecutionEngine.t -> llmodule */ 2169c7c566efe4b942ed8597156bf66e9abf98c79b5Erick TryzelaarCAMLprim LLVMModuleRef llvm_ee_remove_module(LLVMModuleRef M, 2179c7c566efe4b942ed8597156bf66e9abf98c79b5Erick Tryzelaar LLVMExecutionEngineRef EE) { 2182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMModuleRef RemovedModule; 2192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen char *Error; 22016609f3c5c26ba34603ae0d7ebab86fb11a72722Erick Tryzelaar if (LLVMRemoveModule(EE, M, &RemovedModule, &Error)) 2212e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen llvm_raise(llvm_ee_error_exn, Error); 2222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return RemovedModule; 2232e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* string -> ExecutionEngine.t -> llvalue option */ 2262e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_ee_find_function(value Name, LLVMExecutionEngineRef EE) { 2272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CAMLparam1(Name); 2282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CAMLlocal1(Option); 2292e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMValueRef Found; 2302e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen if (LLVMFindFunction(EE, String_val(Name), &Found)) 2312e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CAMLreturn(Val_unit); 2326bd7730426ccb80e3444e0ca8c2c4e607e53defdErick Tryzelaar Option = alloc(1, 0); 2332e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen Field(Option, 0) = Val_op(Found); 2342e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CAMLreturn(Option); 2352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2362e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* llvalue -> GenericValue.t array -> ExecutionEngine.t -> GenericValue.t */ 2382e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_ee_run_function(LLVMValueRef F, value Args, 2392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMExecutionEngineRef EE) { 2402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unsigned NumArgs; 2412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMGenericValueRef Result, *GVArgs; 2422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unsigned I; 2432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen NumArgs = Wosize_val(Args); 2452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GVArgs = (LLVMGenericValueRef*) malloc(NumArgs * sizeof(LLVMGenericValueRef)); 2462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen for (I = 0; I != NumArgs; ++I) 2472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GVArgs[I] = Genericvalue_val(Field(Args, I)); 2482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen Result = LLVMRunFunction(EE, F, NumArgs, GVArgs); 2502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen free(GVArgs); 2522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return alloc_generic_value(Result); 2532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2542e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* ExecutionEngine.t -> unit */ 2562e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_ee_run_static_ctors(LLVMExecutionEngineRef EE) { 2572e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMRunStaticConstructors(EE); 2582e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Val_unit; 2592e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2602e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* ExecutionEngine.t -> unit */ 2622e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_ee_run_static_dtors(LLVMExecutionEngineRef EE) { 2632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMRunStaticDestructors(EE); 2642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Val_unit; 2652e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* llvalue -> string array -> (string * string) array -> ExecutionEngine.t -> 2682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen int */ 2692e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_ee_run_function_as_main(LLVMValueRef F, 2702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen value Args, value Env, 2712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMExecutionEngineRef EE) { 2722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CAMLparam2(Args, Env); 2732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen int I, NumArgs, NumEnv, EnvSize, Result; 2742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen const char **CArgs, **CEnv; 2752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen char *CEnvBuf, *Pos; 2762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen NumArgs = Wosize_val(Args); 2782e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen NumEnv = Wosize_val(Env); 2792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2802e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen /* Build the environment. */ 2812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CArgs = (const char **) malloc(NumArgs * sizeof(char*)); 2822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen for (I = 0; I != NumArgs; ++I) 2832e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CArgs[I] = String_val(Field(Args, I)); 2842e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2852e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen /* Compute the size of the environment string buffer. */ 2862e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen for (I = 0, EnvSize = 0; I != NumEnv; ++I) { 2872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen EnvSize += strlen(String_val(Field(Field(Env, I), 0))) + 1; 2882e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen EnvSize += strlen(String_val(Field(Field(Env, I), 1))) + 1; 2892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen } 2902e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 2912e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen /* Build the environment. */ 2922e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CEnv = (const char **) malloc((NumEnv + 1) * sizeof(char*)); 2932e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CEnvBuf = (char*) malloc(EnvSize); 2942e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen Pos = CEnvBuf; 2952e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen for (I = 0; I != NumEnv; ++I) { 2962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen char *Name = String_val(Field(Field(Env, I), 0)), 2972e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *Value = String_val(Field(Field(Env, I), 1)); 2982e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen int NameLen = strlen(Name), 2992e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen ValueLen = strlen(Value); 3002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 3012e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CEnv[I] = Pos; 3022e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen memcpy(Pos, Name, NameLen); 3032e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen Pos += NameLen; 3042e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *Pos++ = '='; 3052e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen memcpy(Pos, Value, ValueLen); 3062e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen Pos += ValueLen; 3072e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *Pos++ = '\0'; 3082e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen } 3092e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CEnv[NumEnv] = NULL; 3102e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 3112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen Result = LLVMRunFunctionAsMain(EE, F, NumArgs, CArgs, CEnv); 3122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 3132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen free(CArgs); 3142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen free(CEnv); 3152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen free(CEnvBuf); 3162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 3172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen CAMLreturn(Val_int(Result)); 3182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 3192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 3202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/* llvalue -> ExecutionEngine.t -> unit */ 3212e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenCAMLprim value llvm_ee_free_machine_code(LLVMValueRef F, 3222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMExecutionEngineRef EE) { 3232e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMFreeMachineCodeForFunction(EE, F); 3242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return Val_unit; 3252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 3262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 327