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 21 /* string -> DataLayout.t */ 22 CAMLprim LLVMTargetDataRef llvm_targetdata_create(value StringRep) { 23 return LLVMCreateTargetData(String_val(StringRep)); 24 } 25 26 /* DataLayout.t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 27 CAMLprim value llvm_targetdata_add(LLVMTargetDataRef TD, LLVMPassManagerRef PM){ 28 LLVMAddTargetData(TD, PM); 29 return Val_unit; 30 } 31 32 /* DataLayout.t -> string */ 33 CAMLprim value llvm_targetdata_as_string(LLVMTargetDataRef TD) { 34 char *StringRep = LLVMCopyStringRepOfTargetData(TD); 35 value Copy = copy_string(StringRep); 36 LLVMDisposeMessage(StringRep); 37 return Copy; 38 } 39 40 /* DataLayout.t -> unit */ 41 CAMLprim value llvm_targetdata_dispose(LLVMTargetDataRef TD) { 42 LLVMDisposeTargetData(TD); 43 return Val_unit; 44 } 45 46 /* DataLayout.t -> Endian.t */ 47 CAMLprim value llvm_byte_order(LLVMTargetDataRef TD) { 48 return Val_int(LLVMByteOrder(TD)); 49 } 50 51 /* DataLayout.t -> int */ 52 CAMLprim value llvm_pointer_size(LLVMTargetDataRef TD) { 53 return Val_int(LLVMPointerSize(TD)); 54 } 55 56 /* DataLayout.t -> Llvm.lltype -> Int64.t */ 57 CAMLprim value llvm_size_in_bits(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 58 return caml_copy_int64(LLVMSizeOfTypeInBits(TD, Ty)); 59 } 60 61 /* DataLayout.t -> Llvm.lltype -> Int64.t */ 62 CAMLprim value llvm_store_size(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 63 return caml_copy_int64(LLVMStoreSizeOfType(TD, Ty)); 64 } 65 66 /* DataLayout.t -> Llvm.lltype -> Int64.t */ 67 CAMLprim value llvm_abi_size(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 68 return caml_copy_int64(LLVMABISizeOfType(TD, Ty)); 69 } 70 71 /* DataLayout.t -> Llvm.lltype -> int */ 72 CAMLprim value llvm_abi_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 73 return Val_int(LLVMABIAlignmentOfType(TD, Ty)); 74 } 75 76 /* DataLayout.t -> Llvm.lltype -> int */ 77 CAMLprim value llvm_stack_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 78 return Val_int(LLVMCallFrameAlignmentOfType(TD, Ty)); 79 } 80 81 /* DataLayout.t -> Llvm.lltype -> int */ 82 CAMLprim value llvm_preferred_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 83 return Val_int(LLVMPreferredAlignmentOfType(TD, Ty)); 84 } 85 86 /* DataLayout.t -> Llvm.llvalue -> int */ 87 CAMLprim value llvm_preferred_align_of_global(LLVMTargetDataRef TD, 88 LLVMValueRef GlobalVar) { 89 return Val_int(LLVMPreferredAlignmentOfGlobal(TD, GlobalVar)); 90 } 91 92 /* DataLayout.t -> Llvm.lltype -> Int64.t -> int */ 93 CAMLprim value llvm_element_at_offset(LLVMTargetDataRef TD, LLVMTypeRef Ty, 94 value Offset) { 95 return Val_int(LLVMElementAtOffset(TD, Ty, Int_val(Offset))); 96 } 97 98 /* DataLayout.t -> Llvm.lltype -> int -> Int64.t */ 99 CAMLprim value llvm_offset_of_element(LLVMTargetDataRef TD, LLVMTypeRef Ty, 100 value Index) { 101 return caml_copy_int64(LLVMOffsetOfElement(TD, Ty, Int_val(Index))); 102 } 103