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