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