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 -> TargetData.t */ 22CAMLprim LLVMTargetDataRef llvm_targetdata_create(value StringRep) { 23 return LLVMCreateTargetData(String_val(StringRep)); 24} 25 26/* TargetData.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/* TargetData.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/* TargetData.t -> unit */ 41CAMLprim value llvm_targetdata_dispose(LLVMTargetDataRef TD) { 42 LLVMDisposeTargetData(TD); 43 return Val_unit; 44} 45 46/* TargetData.t -> Endian.t */ 47CAMLprim value llvm_byte_order(LLVMTargetDataRef TD) { 48 return Val_int(LLVMByteOrder(TD)); 49} 50 51/* TargetData.t -> int */ 52CAMLprim value llvm_pointer_size(LLVMTargetDataRef TD) { 53 return Val_int(LLVMPointerSize(TD)); 54} 55 56/* TargetData.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/* TargetData.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/* TargetData.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/* TargetData.t -> Llvm.lltype -> int */ 72CAMLprim value llvm_abi_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 73 return Val_int(LLVMABIAlignmentOfType(TD, Ty)); 74} 75 76/* TargetData.t -> Llvm.lltype -> int */ 77CAMLprim value llvm_stack_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 78 return Val_int(LLVMCallFrameAlignmentOfType(TD, Ty)); 79} 80 81/* TargetData.t -> Llvm.lltype -> int */ 82CAMLprim value llvm_preferred_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 83 return Val_int(LLVMPreferredAlignmentOfType(TD, Ty)); 84} 85 86/* TargetData.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/* TargetData.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, Int_val(Offset))); 96} 97 98/* TargetData.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