Home | History | Annotate | Download | only in target
      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