llvm_ocaml.c revision 344be5fbecec9908bab611eafeae0549ba3be6d7
18ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- llvm_ocaml.h - LLVM Ocaml Glue --------------------------*- C++ -*-===*\ 28ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 38ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* The LLVM Compiler Infrastructure *| 48ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 58ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* This file was developed by Gordon Henriksen and is distributed under the *| 68ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* University of Illinois Open Source License. See LICENSE.TXT for details. *| 78ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 88ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|*===----------------------------------------------------------------------===*| 98ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* This file glues LLVM's ocaml interface to its C interface. These functions *| 118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* are by and large transparent wrappers to the corresponding C functions. *| 128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* Note that these functions intentionally take liberties with the CAMLparamX *| 148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* macros, since most of the parameters are not GC heap objects. *| 158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen|* *| 168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen\*===----------------------------------------------------------------------===*/ 178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "llvm-c/Core.h" 198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/alloc.h" 208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/mlvalues.h" 218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "caml/memory.h" 228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen#include "stdio.h" 238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Modules -----------------------------------------------------------===*/ 268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llmodule */ 288ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_create_module(value ModuleID) { 298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMModuleCreateWithName(String_val(ModuleID)); 308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llmodule -> unit */ 338ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_dispose_module(value M) { 348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMDisposeModule((LLVMModuleRef) M); 358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> lltype -> llmodule -> bool */ 398ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_add_type_name(value Name, value Ty, value M) { 408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen int res = LLVMAddTypeName((LLVMModuleRef) M, 418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen String_val(Name), (LLVMTypeRef) Ty); 428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_bool(res == 0); 438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- Types -------------------------------------------------------------===*/ 478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> type_kind */ 498ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_classify_type(value Ty) { 508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_int(LLVMGetTypeKind((LLVMTypeRef) Ty)); 518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype -> unit */ 548ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_refine_abstract_type(value ConcreteTy, value AbstractTy) { 558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMRefineAbstractType((LLVMTypeRef) AbstractTy, (LLVMTypeRef) ConcreteTy); 568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) Val_unit; 578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on integer types ........................................--*/ 608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */ 628ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_i1_type (value Unit) { return (value) LLVMInt1Type(); } 638ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_i8_type (value Unit) { return (value) LLVMInt8Type(); } 648ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_i16_type(value Unit) { return (value) LLVMInt16Type(); } 658ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_i32_type(value Unit) { return (value) LLVMInt32Type(); } 668ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_i64_type(value Unit) { return (value) LLVMInt64Type(); } 678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> lltype */ 698ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_integer_type(value Width) { 708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMCreateIntegerType(Int_val(Width)); 718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 748ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_integer_bitwidth(value IntegerTy) { 758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_int(LLVMGetIntegerTypeWidth((LLVMTypeRef) IntegerTy)); 768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on real types ...........................................--*/ 798ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */ 818ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_float_type(value Unit) { 828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMFloatType(); 838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */ 868ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_double_type(value Unit) { 878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMDoubleType(); 888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */ 918ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_x86fp80_type(value Unit) { 928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMX86FP80Type(); 938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */ 968ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_fp128_type(value Unit) { 978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMFP128Type(); 988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */ 1018ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_ppc_fp128_type(value Unit) { 1028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMPPCFP128Type(); 1038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on function types .......................................--*/ 1068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array -> bool -> lltype */ 1088ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_function_type(value RetTy, value ParamTys, 1098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen value IsVarArg) { 1108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMCreateFunctionType((LLVMTypeRef) RetTy, 1118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (LLVMTypeRef *) ParamTys, 1128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Wosize_val(ParamTys), 1138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Bool_val(IsVarArg)); 1148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> bool */ 1178ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_is_var_arg(value FunTy) { 1188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_bool(LLVMIsFunctionVarArg((LLVMTypeRef) FunTy)); 1198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype */ 1228ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_return_type(value FunTy) { 1238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetFunctionReturnType((LLVMTypeRef) FunTy); 1248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 1278ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_param_types(value FunTy) { 1288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen unsigned Count = LLVMGetFunctionParamCount((LLVMTypeRef) FunTy); 1298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMTypeRef *FunTys = alloca(Count * sizeof(LLVMTypeRef)); 1308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen /* copy into an ocaml array */ 1328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen unsigned i; 1338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen value ParamTys = caml_alloc(Count, 0); 1348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMGetFunctionParamTypes((LLVMTypeRef) FunTy, FunTys); 1368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen for (i = 0; i != Count; ++i) 1378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Store_field(ParamTys, i, (value) FunTys[i]); 1388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return ParamTys; 1408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on struct types .........................................--*/ 1438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype array -> bool -> lltype */ 1458ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_struct_type(value ElementTypes, value Packed) { 1468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMCreateStructType((LLVMTypeRef *) ElementTypes, 1478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Wosize_val(ElementTypes), 1488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Bool_val(Packed)); 1498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype array */ 1528ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_element_types(value StructTy) { 1538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen unsigned Count = LLVMGetStructElementCount((LLVMTypeRef) StructTy); 1548ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMTypeRef *Tys = alloca(Count * sizeof(LLVMTypeRef)); 1558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen /* copy into an ocaml array */ 1578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen unsigned i; 1588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen value ElementTys = caml_alloc(Count, 0); 1598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1608ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMGetStructElementTypes((LLVMTypeRef) StructTy, Tys); 1618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen for (i = 0; i != Count; ++i) 1628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Store_field(ElementTys, i, (value) Tys[i]); 1638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return ElementTys; 1658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1678ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_is_packed(value StructTy) { 1688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_bool(LLVMIsPackedStruct((LLVMTypeRef) StructTy)); 1698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on array, pointer, and vector types .....................--*/ 1728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 1748ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_array_type(value ElementTy, value Count) { 1758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMCreateArrayType((LLVMTypeRef) ElementTy, Int_val(Count)); 1768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype */ 1798ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_pointer_type(value ElementTy) { 1808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMCreatePointerType((LLVMTypeRef) ElementTy); 1818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> lltype */ 1848ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_vector_type(value ElementTy, value Count) { 1858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMCreateVectorType((LLVMTypeRef) ElementTy, Int_val(Count)); 1868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> lltype */ 1898ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_element_type(value Ty) { 1908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetElementType((LLVMTypeRef) Ty); 1918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 1948ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_array_length(value ArrayTy) { 1958ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_int(LLVMGetArrayLength((LLVMTypeRef) ArrayTy)); 1968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 1978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 1988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int */ 1998ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_vector_size(value VectorTy) { 2008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_int(LLVMGetVectorSize((LLVMTypeRef) VectorTy)); 2018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on other types ..........................................--*/ 2048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */ 2068ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_void_type (value Unit) { return (value) LLVMVoidType(); } 2078ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_label_type(value Unit) { return (value) LLVMLabelType(); } 2088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* unit -> lltype */ 2108ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_opaque_type(value Unit) { 2118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMCreateOpaqueType(); 2128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*===-- VALUES ------------------------------------------------------------===*/ 2168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> lltype */ 2188ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_type_of(value Val) { 2198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetTypeOfValue((LLVMValueRef) Val); 2208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 2238ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_value_name(value Val) { 2248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return caml_copy_string(LLVMGetValueName((LLVMValueRef) Val)); 2258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2278ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 2288ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_set_value_name(value Name, value Val) { 2298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetValueName((LLVMValueRef) Val, String_val(Name)); 2308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 2318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2328ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on constants of (mostly) any type .......................--*/ 2348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue */ 2368ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_null(value Ty) { 2378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetNull((LLVMTypeRef) Ty); 2388ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue */ 2418ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_all_ones(value Ty) { 2428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetAllOnes((LLVMTypeRef) Ty); 2438ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue */ 2468ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_undef(value Ty) { 2478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetUndef((LLVMTypeRef) Ty); 2488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2498ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 251344be5fbecec9908bab611eafeae0549ba3be6d7Gordon HenriksenCAMLprim value llvm_is_constant(value Ty) { 252344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen return Val_bool(LLVMIsConstant((LLVMValueRef) Ty)); 253344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 254344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 255344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 2568ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_is_null(value Val) { 2578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_bool(LLVMIsNull((LLVMValueRef) Val)); 2588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 260344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* llvalue -> bool */ 261344be5fbecec9908bab611eafeae0549ba3be6d7Gordon HenriksenCAMLprim value llvm_is_undef(value Ty) { 262344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen return Val_bool(LLVMIsUndef((LLVMValueRef) Ty)); 263344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 264344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 2658ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on scalar constants .....................................--*/ 2668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> int -> bool -> llvalue */ 2688ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_int_constant(value IntTy, value N, value SExt) { 2698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen /* GCC warns if we use the ternary operator. */ 2708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen unsigned long long N2; 2718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen if (Bool_val(SExt)) 2728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen N2 = (intnat) Int_val(N); 2738ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen else 2748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen N2 = (uintnat) Int_val(N); 2758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetIntConstant((LLVMTypeRef) IntTy, N2, Bool_val(SExt)); 2778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 279344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen/* lltype -> Int64.t -> bool -> llvalue */ 280344be5fbecec9908bab611eafeae0549ba3be6d7Gordon HenriksenCAMLprim value llvm_make_int64_constant(value IntTy, value N, value SExt) { 281344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen return (value) LLVMGetIntConstant((LLVMTypeRef) IntTy, Int64_val(N), 282344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen Bool_val(SExt)); 283344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen} 284344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen 2858ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> float -> llvalue */ 2868ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_real_constant(value RealTy, value N) { 2878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetRealConstant((LLVMTypeRef) RealTy, Double_val(N)); 2888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on composite constants ..................................--*/ 2918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> bool -> llvalue */ 2938ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_string_constant(value Str, value NullTerminate) { 2948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetStringConstant(String_val(Str), 295344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen caml_string_length(Str), 2968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Bool_val(NullTerminate) == 0); 2978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 2988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 2998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> llvalue array -> llvalue */ 3008ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_array_constant(value ElementTy, value ElementVals) { 3018ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetArrayConstant((LLVMTypeRef) ElementTy, 3028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (LLVMValueRef*) Op_val(ElementVals), 3038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Wosize_val(ElementVals)); 3048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3068ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> bool -> llvalue */ 3078ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_struct_constant(value ElementVals, value Packed) { 3088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetStructConstant((LLVMValueRef*) Op_val(ElementVals), 3098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Wosize_val(ElementVals), 3108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Bool_val(Packed)); 3118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3128ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue array -> llvalue */ 3148ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_make_vector_constant(value ElementVals) { 3158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetVectorConstant((LLVMValueRef*) Op_val(ElementVals), 3168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen Wosize_val(ElementVals)); 3178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3188ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables, functions, and aliases (globals) ...--*/ 3208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 3228ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_is_declaration(value Global) { 3238ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_bool(LLVMIsDeclaration((LLVMValueRef) Global)); 3248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> linkage */ 3278ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_linkage(value Global) { 3288ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_int(LLVMGetLinkage((LLVMValueRef) Global)); 3298ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3308ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3318ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* linkage -> llvalue -> unit */ 3328ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_set_linkage(value Linkage, value Global) { 3338ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetLinkage((LLVMValueRef) Global, Int_val(Linkage)); 3348ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 3358ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3368ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3378ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> string */ 3388ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_section(value Global) { 3398ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return caml_copy_string(LLVMGetSection((LLVMValueRef) Global)); 3408ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3418ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3428ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> unit */ 3438ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_set_section(value Section, value Global) { 3448ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetSection((LLVMValueRef) Global, String_val(Section)); 3458ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 3468ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3478ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3488ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> visibility */ 3498ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_visibility(value Global) { 3508ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_int(LLVMGetVisibility((LLVMValueRef) Global)); 3518ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3528ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3538ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* visibility -> llvalue -> unit */ 3548ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_set_visibility(value Viz, value Global) { 3558ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetVisibility((LLVMValueRef) Global, Int_val(Viz)); 3568ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 3578ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3588ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3598ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> int */ 3608ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_alignment(value Global) { 3618ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_int(LLVMGetAlignment((LLVMValueRef) Global)); 3628ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3638ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3648ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* int -> llvalue -> unit */ 3658ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_set_alignment(value Bytes, value Global) { 3668ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetAlignment((LLVMValueRef) Global, Int_val(Bytes)); 3678ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 3688ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3698ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3708ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/*--... Operations on global variables .....................................--*/ 3718ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3728ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */ 3738ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_add_global(value Ty, value Name, value M) { 3748ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMAddGlobal((LLVMModuleRef) M, 3758ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (LLVMTypeRef) Ty, String_val(Name)); 3768ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3778ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3788ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* lltype -> string -> llmodule -> llvalue */ 3798ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_declare_global(value Ty, value Name, value M) { 3808ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMAddGlobal((LLVMModuleRef) M, 3818ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen (LLVMTypeRef) Ty, String_val(Name)); 3828ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3838ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3848ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* string -> llvalue -> llmodule -> llvalue */ 3858ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_define_global(value Name, value ConstantVal, value M) { 3868ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMValueRef Initializer = (LLVMValueRef) ConstantVal; 3878ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMValueRef GlobalVar = LLVMAddGlobal((LLVMModuleRef) M, 3888ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMGetTypeOfValue(Initializer), 3898ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen String_val(Name)); 3908ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetInitializer(GlobalVar, Initializer); 3918ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) GlobalVar; 3928ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3938ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 3948ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 3958ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_delete_global(value GlobalVar) { 3968ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMDeleteGlobal((LLVMValueRef) GlobalVar); 3978ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 3988ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 3998ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4008ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue */ 4018ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_global_initializer(value GlobalVar) { 4028ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return (value) LLVMGetInitializer((LLVMValueRef) GlobalVar); 4038ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4048ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4058ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> llvalue -> unit */ 4068ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_set_initializer(value ConstantVal, value GlobalVar) { 4078ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetInitializer((LLVMValueRef) GlobalVar, (LLVMValueRef) ConstantVal); 4088ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 4098ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4108ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4118ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> unit */ 4128ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_remove_initializer(value GlobalVar) { 4138ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetInitializer((LLVMValueRef) GlobalVar, NULL); 4148ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 4158ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4168ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4178ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* llvalue -> bool */ 4188ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_is_thread_local(value GlobalVar) { 4198ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_bool(LLVMIsThreadLocal((LLVMValueRef) GlobalVar)); 4208ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 4218ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen 4228ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen/* bool -> llvalue -> unit */ 4238ef426baa36639458f6777309db25c1768dc9c8aGordon HenriksenCAMLprim value llvm_set_thread_local(value IsThreadLocal, value GlobalVar) { 4248ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen LLVMSetThreadLocal((LLVMValueRef) GlobalVar, Bool_val(IsThreadLocal)); 4258ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen return Val_unit; 4268ef426baa36639458f6777309db25c1768dc9c8aGordon Henriksen} 427