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