aboutsummaryrefslogtreecommitdiffstats
path: root/bindings/ocaml/target
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/ocaml/target')
-rw-r--r--bindings/ocaml/target/Makefile20
-rw-r--r--bindings/ocaml/target/llvm_target.ml44
-rw-r--r--bindings/ocaml/target/llvm_target.mli102
-rw-r--r--bindings/ocaml/target/target_ocaml.c109
4 files changed, 275 insertions, 0 deletions
diff --git a/bindings/ocaml/target/Makefile b/bindings/ocaml/target/Makefile
new file mode 100644
index 0000000..5cd677b
--- /dev/null
+++ b/bindings/ocaml/target/Makefile
@@ -0,0 +1,20 @@
+##===- bindings/ocaml/target/Makefile ----------------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+#
+# This is the makefile for the Objective Caml Llvm_target interface.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL := ../../..
+LIBRARYNAME := llvm_target
+DONT_BUILD_RELINKED := 1
+UsedComponents := target
+UsedOcamlInterfaces := llvm
+
+include ../Makefile.ocaml
diff --git a/bindings/ocaml/target/llvm_target.ml b/bindings/ocaml/target/llvm_target.ml
new file mode 100644
index 0000000..ea5341d
--- /dev/null
+++ b/bindings/ocaml/target/llvm_target.ml
@@ -0,0 +1,44 @@
+(*===-- llvm_target.ml - LLVM Ocaml Interface ------------------*- OCaml -*-===*
+ *
+ * The LLVM Compiler Infrastructure
+ *
+ * This file is distributed under the University of Illinois Open Source
+ * License. See LICENSE.TXT for details.
+ *
+ *===----------------------------------------------------------------------===*)
+
+module Endian = struct
+ type t =
+ | Big
+ | Little
+end
+
+module TargetData = struct
+ type t
+
+ external create : string -> t = "llvm_targetdata_create"
+ external add : t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
+ = "llvm_targetdata_add"
+ external as_string : t -> string = "llvm_targetdata_as_string"
+ external invalidate_struct_layout : t -> Llvm.lltype -> unit
+ = "llvm_targetdata_invalidate_struct_layout"
+ external dispose : t -> unit = "llvm_targetdata_dispose"
+end
+
+external byte_order : TargetData.t -> Endian.t = "llvm_byte_order"
+external pointer_size : TargetData.t -> int = "llvm_pointer_size"
+external intptr_type : TargetData.t -> Llvm.lltype = "LLVMIntPtrType"
+external size_in_bits : TargetData.t -> Llvm.lltype -> Int64.t
+ = "llvm_size_in_bits"
+external store_size : TargetData.t -> Llvm.lltype -> Int64.t = "llvm_store_size"
+external abi_size : TargetData.t -> Llvm.lltype -> Int64.t = "llvm_abi_size"
+external abi_align : TargetData.t -> Llvm.lltype -> int = "llvm_abi_align"
+external stack_align : TargetData.t -> Llvm.lltype -> int = "llvm_stack_align"
+external preferred_align : TargetData.t -> Llvm.lltype -> int
+ = "llvm_preferred_align"
+external preferred_align_of_global : TargetData.t -> Llvm.llvalue -> int
+ = "llvm_preferred_align_of_global"
+external element_at_offset : TargetData.t -> Llvm.lltype -> Int64.t -> int
+ = "llvm_element_at_offset"
+external offset_of_element : TargetData.t -> Llvm.lltype -> int -> Int64.t
+ = "llvm_offset_of_element"
diff --git a/bindings/ocaml/target/llvm_target.mli b/bindings/ocaml/target/llvm_target.mli
new file mode 100644
index 0000000..a44758f
--- /dev/null
+++ b/bindings/ocaml/target/llvm_target.mli
@@ -0,0 +1,102 @@
+(*===-- llvm_target.mli - LLVM Ocaml Interface -----------------*- OCaml -*-===*
+ *
+ * The LLVM Compiler Infrastructure
+ *
+ * This file is distributed under the University of Illinois Open Source
+ * License. See LICENSE.TXT for details.
+ *
+ *===----------------------------------------------------------------------===*)
+
+(** Target Information.
+
+ This interface provides an ocaml API for LLVM target information,
+ the classes in the Target library. *)
+
+module Endian : sig
+ type t =
+ | Big
+ | Little
+end
+
+module TargetData : sig
+ type t
+
+ (** [TargetData.create rep] parses the target data string representation [rep].
+ See the constructor llvm::TargetData::TargetData. *)
+ external create : string -> t = "llvm_targetdata_create"
+
+ (** [add_target_data td pm] adds the target data [td] to the pass manager [pm].
+ Does not take ownership of the target data.
+ See the method llvm::PassManagerBase::add. *)
+ external add : t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
+ = "llvm_targetdata_add"
+
+ (** [as_string td] is the string representation of the target data [td].
+ See the constructor llvm::TargetData::TargetData. *)
+ external as_string : t -> string = "llvm_targetdata_as_string"
+
+ (** Struct layouts are speculatively cached. If a TargetDataRef is alive when
+ types are being refined and removed, this method must be called whenever a
+ struct type is removed to avoid a dangling pointer in this cache.
+ See the method llvm::TargetData::InvalidateStructLayoutInfo. *)
+ external invalidate_struct_layout : t -> Llvm.lltype -> unit
+ = "llvm_targetdata_invalidate_struct_layout"
+
+ (** Deallocates a TargetData.
+ See the destructor llvm::TargetData::~TargetData. *)
+ external dispose : t -> unit = "llvm_targetdata_dispose"
+end
+
+(** Returns the byte order of a target, either LLVMBigEndian or
+ LLVMLittleEndian.
+ See the method llvm::TargetData::isLittleEndian. *)
+external byte_order : TargetData.t -> Endian.t = "llvm_byte_order"
+
+(** Returns the pointer size in bytes for a target.
+ See the method llvm::TargetData::getPointerSize. *)
+external pointer_size : TargetData.t -> int = "llvm_pointer_size"
+
+(** Returns the integer type that is the same size as a pointer on a target.
+ See the method llvm::TargetData::getIntPtrType. *)
+external intptr_type : TargetData.t -> Llvm.lltype = "LLVMIntPtrType"
+
+(** Computes the size of a type in bytes for a target.
+ See the method llvm::TargetData::getTypeSizeInBits. *)
+external size_in_bits : TargetData.t -> Llvm.lltype -> Int64.t
+ = "llvm_size_in_bits"
+
+(** Computes the storage size of a type in bytes for a target.
+ See the method llvm::TargetData::getTypeStoreSize. *)
+external store_size : TargetData.t -> Llvm.lltype -> Int64.t = "llvm_store_size"
+
+(** Computes the ABI size of a type in bytes for a target.
+ See the method llvm::TargetData::getABITypeSize. *)
+external abi_size : TargetData.t -> Llvm.lltype -> Int64.t = "llvm_abi_size"
+
+(** Computes the ABI alignment of a type in bytes for a target.
+ See the method llvm::TargetData::getTypeABISize. *)
+external abi_align : TargetData.t -> Llvm.lltype -> int = "llvm_abi_align"
+
+(** Computes the call frame alignment of a type in bytes for a target.
+ See the method llvm::TargetData::getTypeABISize. *)
+external stack_align : TargetData.t -> Llvm.lltype -> int = "llvm_stack_align"
+
+(** Computes the preferred alignment of a type in bytes for a target.
+ See the method llvm::TargetData::getTypeABISize. *)
+external preferred_align : TargetData.t -> Llvm.lltype -> int
+ = "llvm_preferred_align"
+
+(** Computes the preferred alignment of a global variable in bytes for a target.
+ See the method llvm::TargetData::getPreferredAlignment. *)
+external preferred_align_of_global : TargetData.t -> Llvm.llvalue -> int
+ = "llvm_preferred_align_of_global"
+
+(** Computes the structure element that contains the byte offset for a target.
+ See the method llvm::StructLayout::getElementContainingOffset. *)
+external element_at_offset : TargetData.t -> Llvm.lltype -> Int64.t -> int
+ = "llvm_element_at_offset"
+
+(** Computes the byte offset of the indexed struct element for a target.
+ See the method llvm::StructLayout::getElementContainingOffset. *)
+external offset_of_element : TargetData.t -> Llvm.lltype -> int -> Int64.t
+ = "llvm_offset_of_element"
diff --git a/bindings/ocaml/target/target_ocaml.c b/bindings/ocaml/target/target_ocaml.c
new file mode 100644
index 0000000..cc20e81
--- /dev/null
+++ b/bindings/ocaml/target/target_ocaml.c
@@ -0,0 +1,109 @@
+/*===-- target_ocaml.c - LLVM Ocaml Glue ------------------------*- C++ -*-===*\
+|* *|
+|* The LLVM Compiler Infrastructure *|
+|* *|
+|* This file is distributed under the University of Illinois Open Source *|
+|* License. See LICENSE.TXT for details. *|
+|* *|
+|*===----------------------------------------------------------------------===*|
+|* *|
+|* This file glues LLVM's ocaml interface to its C interface. These functions *|
+|* are by and large transparent wrappers to the corresponding C functions. *|
+|* *|
+|* Note that these functions intentionally take liberties with the CAMLparamX *|
+|* macros, since most of the parameters are not GC heap objects. *|
+|* *|
+\*===----------------------------------------------------------------------===*/
+
+#include "llvm-c/Target.h"
+#include "caml/alloc.h"
+
+/* string -> TargetData.t */
+CAMLprim LLVMTargetDataRef llvm_targetdata_create(value StringRep) {
+ return LLVMCreateTargetData(String_val(StringRep));
+}
+
+/* TargetData.t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
+CAMLprim value llvm_targetdata_add(LLVMTargetDataRef TD, LLVMPassManagerRef PM){
+ LLVMAddTargetData(TD, PM);
+ return Val_unit;
+}
+
+/* TargetData.t -> string */
+CAMLprim value llvm_targetdata_as_string(LLVMTargetDataRef TD) {
+ char *StringRep = LLVMCopyStringRepOfTargetData(TD);
+ value Copy = copy_string(StringRep);
+ LLVMDisposeMessage(StringRep);
+ return Copy;
+}
+
+/* TargetData.t -> Llvm.lltype -> unit */
+CAMLprim value llvm_targetdata_invalidate_struct_layout(LLVMTargetDataRef TD,
+ LLVMTypeRef Ty) {
+ LLVMInvalidateStructLayout(TD, Ty);
+ return Val_unit;
+}
+
+/* TargetData.t -> unit */
+CAMLprim value llvm_targetdata_dispose(LLVMTargetDataRef TD) {
+ LLVMDisposeTargetData(TD);
+ return Val_unit;
+}
+
+/* TargetData.t -> Endian.t */
+CAMLprim value llvm_byte_order(LLVMTargetDataRef TD) {
+ return Val_int(LLVMByteOrder(TD));
+}
+
+/* TargetData.t -> int */
+CAMLprim value llvm_pointer_size(LLVMTargetDataRef TD) {
+ return Val_int(LLVMPointerSize(TD));
+}
+
+/* TargetData.t -> Llvm.lltype -> Int64.t */
+CAMLprim value llvm_size_in_bits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+ return caml_copy_int64(LLVMSizeOfTypeInBits(TD, Ty));
+}
+
+/* TargetData.t -> Llvm.lltype -> Int64.t */
+CAMLprim value llvm_store_size(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+ return caml_copy_int64(LLVMStoreSizeOfType(TD, Ty));
+}
+
+/* TargetData.t -> Llvm.lltype -> Int64.t */
+CAMLprim value llvm_abi_size(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+ return caml_copy_int64(LLVMABISizeOfType(TD, Ty));
+}
+
+/* TargetData.t -> Llvm.lltype -> int */
+CAMLprim value llvm_abi_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+ return Val_int(LLVMABIAlignmentOfType(TD, Ty));
+}
+
+/* TargetData.t -> Llvm.lltype -> int */
+CAMLprim value llvm_stack_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+ return Val_int(LLVMCallFrameAlignmentOfType(TD, Ty));
+}
+
+/* TargetData.t -> Llvm.lltype -> int */
+CAMLprim value llvm_preferred_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
+ return Val_int(LLVMPreferredAlignmentOfType(TD, Ty));
+}
+
+/* TargetData.t -> Llvm.llvalue -> int */
+CAMLprim value llvm_preferred_align_of_global(LLVMTargetDataRef TD,
+ LLVMValueRef GlobalVar) {
+ return Val_int(LLVMPreferredAlignmentOfGlobal(TD, GlobalVar));
+}
+
+/* TargetData.t -> Llvm.lltype -> Int64.t -> int */
+CAMLprim value llvm_element_at_offset(LLVMTargetDataRef TD, LLVMTypeRef Ty,
+ value Offset) {
+ return Val_int(LLVMElementAtOffset(TD, Ty, Int_val(Offset)));
+}
+
+/* TargetData.t -> Llvm.lltype -> int -> Int64.t */
+CAMLprim value llvm_offset_of_element(LLVMTargetDataRef TD, LLVMTypeRef Ty,
+ value Index) {
+ return caml_copy_int64(LLVMOffsetOfElement(TD, Ty, Int_val(Index)));
+}