target_ocaml.c revision fed0b3414250b6dea1732e95d79163b00a2cb38e
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 */ 22CAMLprim LLVMTargetDataRef llvm_targetdata_create(value StringRep) { 23 return LLVMCreateTargetData(String_val(StringRep)); 24} 25 26/* DataLayout.t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */ 27CAMLprim value llvm_targetdata_add(LLVMTargetDataRef TD, LLVMPassManagerRef PM){ 28 LLVMAddTargetData(TD, PM); 29 return Val_unit; 30} 31 32/* DataLayout.t -> string */ 33CAMLprim 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 */ 41CAMLprim value llvm_targetdata_dispose(LLVMTargetDataRef TD) { 42 LLVMDisposeTargetData(TD); 43 return Val_unit; 44} 45 46/* DataLayout.t -> Endian.t */ 47CAMLprim value llvm_byte_order(LLVMTargetDataRef TD) { 48 return Val_int(LLVMByteOrder(TD)); 49} 50 51/* DataLayout.t -> int */ 52CAMLprim value llvm_pointer_size(LLVMTargetDataRef TD) { 53 return Val_int(LLVMPointerSize(TD)); 54} 55 56/* DataLayout.t -> Llvm.lltype -> Int64.t */ 57CAMLprim 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 */ 62CAMLprim 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 */ 67CAMLprim value llvm_abi_size(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 68 return caml_copy_int64(LLVMABISizeOfType(TD, Ty)); 69} 70 71/* DataLayout.t -> Llvm.lltype -> int */ 72CAMLprim value llvm_abi_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 73 return Val_int(LLVMABIAlignmentOfType(TD, Ty)); 74} 75 76/* DataLayout.t -> Llvm.lltype -> int */ 77CAMLprim value llvm_stack_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 78 return Val_int(LLVMCallFrameAlignmentOfType(TD, Ty)); 79} 80 81/* DataLayout.t -> Llvm.lltype -> int */ 82CAMLprim value llvm_preferred_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 83 return Val_int(LLVMPreferredAlignmentOfType(TD, Ty)); 84} 85 86/* DataLayout.t -> Llvm.llvalue -> int */ 87CAMLprim 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 */ 93CAMLprim value llvm_element_at_offset(LLVMTargetDataRef TD, LLVMTypeRef Ty, 94 value Offset) { 95 return Val_int(LLVMElementAtOffset(TD, Ty, Int64_val(Offset))); 96} 97 98/* DataLayout.t -> Llvm.lltype -> int -> Int64.t */ 99CAMLprim 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