target_ocaml.c revision 786a43e2d8f98034046b7fd3a78d94e57a466895
1/*===-- target_ocaml.c - LLVM OCaml Glue ------------------------*- C++ -*-===*\ 2|* *| 3|* The LLVM Compiler Infrastructure *| 4|* *| 5|* This file is distributed under the University of Illinois Open Source *| 6|* License. See LICENSE.TXT for details. *| 7|* *| 8|*===----------------------------------------------------------------------===*| 9|* *| 10|* This file glues LLVM's OCaml interface to its C interface. These functions *| 11|* are by and large transparent wrappers to the corresponding C functions. *| 12|* *| 13|* Note that these functions intentionally take liberties with the CAMLparamX *| 14|* macros, since most of the parameters are not GC heap objects. *| 15|* *| 16\*===----------------------------------------------------------------------===*/ 17 18#include "llvm-c/Target.h" 19#include "caml/alloc.h" 20#include "caml/custom.h" 21 22#define TargetData_val(v) (*(LLVMTargetDataRef *)(Data_custom_val(v))) 23 24static void llvm_finalize_target_data(value TargetData) { 25 LLVMDisposeTargetData(TargetData_val(TargetData)); 26} 27 28static struct custom_operations llvm_target_data_ops = { 29 (char *) "LLVMTargetData", 30 llvm_finalize_target_data, 31 custom_compare_default, 32 custom_hash_default, 33 custom_serialize_default, 34 custom_deserialize_default 35#ifdef custom_compare_ext_default 36 , custom_compare_ext_default 37#endif 38}; 39 40value llvm_alloc_target_data(LLVMTargetDataRef TargetData) { 41 value V = alloc_custom(&llvm_target_data_ops, sizeof(LLVMTargetDataRef), 0, 1); 42 TargetData_val(V) = TargetData; 43 return V; 44} 45 46/* string -> DataLayout.t */ 47CAMLprim value llvm_targetdata_create(value StringRep) { 48 return llvm_alloc_target_data(LLVMCreateTargetData(String_val(StringRep))); 49} 50 51/* DataLayout.t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 52CAMLprim value llvm_targetdata_add(value TD, LLVMPassManagerRef PM){ 53 LLVMAddTargetData(TargetData_val(TD), PM); 54 return Val_unit; 55} 56 57/* DataLayout.t -> string */ 58CAMLprim value llvm_targetdata_as_string(value TD) { 59 char *StringRep = LLVMCopyStringRepOfTargetData(TargetData_val(TD)); 60 value Copy = copy_string(StringRep); 61 LLVMDisposeMessage(StringRep); 62 return Copy; 63} 64 65/* DataLayout.t -> Endian.t */ 66CAMLprim value llvm_byte_order(value TD) { 67 return Val_int(LLVMByteOrder(TargetData_val(TD))); 68} 69 70/* DataLayout.t -> int */ 71CAMLprim value llvm_pointer_size(value TD) { 72 return Val_int(LLVMPointerSize(TargetData_val(TD))); 73} 74 75/* DataLayout.t -> Llvm.llcontext -> Llvm.lltype */ 76CAMLprim LLVMTypeRef llvm_intptr_type(value TD, LLVMContextRef C) { 77 return LLVMIntPtrTypeInContext(C, TargetData_val(TD));; 78} 79 80/* DataLayout.t -> Llvm.lltype -> Int64.t */ 81CAMLprim value llvm_size_in_bits(value TD, LLVMTypeRef Ty) { 82 return caml_copy_int64(LLVMSizeOfTypeInBits(TargetData_val(TD), Ty)); 83} 84 85/* DataLayout.t -> Llvm.lltype -> Int64.t */ 86CAMLprim value llvm_store_size(value TD, LLVMTypeRef Ty) { 87 return caml_copy_int64(LLVMStoreSizeOfType(TargetData_val(TD), Ty)); 88} 89 90/* DataLayout.t -> Llvm.lltype -> Int64.t */ 91CAMLprim value llvm_abi_size(value TD, LLVMTypeRef Ty) { 92 return caml_copy_int64(LLVMABISizeOfType(TargetData_val(TD), Ty)); 93} 94 95/* DataLayout.t -> Llvm.lltype -> int */ 96CAMLprim value llvm_abi_align(value TD, LLVMTypeRef Ty) { 97 return Val_int(LLVMABIAlignmentOfType(TargetData_val(TD), Ty)); 98} 99 100/* DataLayout.t -> Llvm.lltype -> int */ 101CAMLprim value llvm_stack_align(value TD, LLVMTypeRef Ty) { 102 return Val_int(LLVMCallFrameAlignmentOfType(TargetData_val(TD), Ty)); 103} 104 105/* DataLayout.t -> Llvm.lltype -> int */ 106CAMLprim value llvm_preferred_align(value TD, LLVMTypeRef Ty) { 107 return Val_int(LLVMPreferredAlignmentOfType(TargetData_val(TD), Ty)); 108} 109 110/* DataLayout.t -> Llvm.llvalue -> int */ 111CAMLprim value llvm_preferred_align_of_global(value TD, 112 LLVMValueRef GlobalVar) { 113 return Val_int(LLVMPreferredAlignmentOfGlobal(TargetData_val(TD), GlobalVar)); 114} 115 116/* DataLayout.t -> Llvm.lltype -> Int64.t -> int */ 117CAMLprim value llvm_element_at_offset(value TD, LLVMTypeRef Ty, 118 value Offset) { 119 return Val_int(LLVMElementAtOffset(TargetData_val(TD), Ty, Int64_val(Offset))); 120} 121 122/* DataLayout.t -> Llvm.lltype -> int -> Int64.t */ 123CAMLprim value llvm_offset_of_element(value TD, LLVMTypeRef Ty, 124 value Index) { 125 return caml_copy_int64(LLVMOffsetOfElement(TargetData_val(TD), Ty, Int_val(Index))); 126} 127