[OCaml] Make Llvm_target.DataLayout.t automatically managed
authorPeter Zotov <whitequark@whitequark.org>
Mon, 11 Nov 2013 14:47:11 +0000 (14:47 +0000)
committerPeter Zotov <whitequark@whitequark.org>
Mon, 11 Nov 2013 14:47:11 +0000 (14:47 +0000)
This breaks the API by removing Llvm_target.DataLayout.dispose.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194380 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/ocaml/executionengine/executionengine_ocaml.c
bindings/ocaml/executionengine/llvm_executionengine.ml
bindings/ocaml/target/llvm_target.ml
bindings/ocaml/target/llvm_target.mli
bindings/ocaml/target/target_ocaml.c
test/Bindings/Ocaml/ipo_opts.ml
test/Bindings/Ocaml/scalar_opts.ml
test/Bindings/Ocaml/target.ml
test/Bindings/Ocaml/vectorize_opts.ml

index 32f6c5907ccaebc39b20c8894c3082458f05509c..3d2c8b09e75c92502126fd19b6b20484a4de3bb5 100644 (file)
@@ -324,3 +324,10 @@ CAMLprim value llvm_ee_free_machine_code(LLVMValueRef F,
   return Val_unit;
 }
 
+extern value llvm_alloc_target_data(LLVMTargetDataRef TargetData);
+
+/* ExecutionEngine.t -> Llvm_target.TargetData.t */
+CAMLprim value llvm_ee_get_target_data(LLVMExecutionEngineRef EE) {
+  LLVMTargetDataRef TD = LLVMGetExecutionEngineTargetData(EE);
+  return llvm_alloc_target_data(TD);
+}
index b083b7d14e932f90ce5eac867250b3c6e111c307..01991540c0b55d5c6c1ba3d096ee6f7e5086e659 100644 (file)
@@ -84,11 +84,10 @@ module ExecutionEngine = struct
     = "llvm_ee_free_machine_code"
 
   external target_data: t -> Llvm_target.DataLayout.t
-    = "LLVMGetExecutionEngineTargetData"
+    = "llvm_ee_get_target_data"
   
   (* The following are not bound. Patches are welcome.
   
-  get_target_data: t -> lltargetdata
   add_global_mapping: llvalue -> llgenericvalue -> t -> unit
   clear_all_global_mappings: t -> unit
   update_global_mapping: llvalue -> llgenericvalue -> t -> unit
index 2959f0cbf5e22dab3f5cf9bdb90978c6d24c1996..d892567092fd474dd395af1a4dafc42c7ce40ac5 100644 (file)
@@ -20,12 +20,11 @@ module DataLayout = struct
   external add : t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit
                = "llvm_targetdata_add"
   external as_string : t -> string = "llvm_targetdata_as_string"
-  external dispose : t -> unit = "llvm_targetdata_dispose"
 end
 
 external byte_order : DataLayout.t -> Endian.t = "llvm_byte_order"
 external pointer_size : DataLayout.t -> int = "llvm_pointer_size"
-external intptr_type : DataLayout.t -> Llvm.lltype = "LLVMIntPtrType"
+external intptr_type : DataLayout.t -> Llvm.lltype = "llvm_intptr_type"
 external size_in_bits : DataLayout.t -> Llvm.lltype -> Int64.t
                       = "llvm_size_in_bits"
 external store_size : DataLayout.t -> Llvm.lltype -> Int64.t = "llvm_store_size"
index 667fef0ca1253a3dbcf571374462e94b6b2291da..f5426af1df11bf0b8495fe3c065295276bbc180f 100644 (file)
@@ -34,10 +34,6 @@ module DataLayout : sig
   (** [as_string td] is the string representation of the target data [td].
       See the constructor llvm::DataLayout::DataLayout. *)
   external as_string : t -> string = "llvm_targetdata_as_string"
-
-  (** Deallocates a DataLayout.
-      See the destructor llvm::DataLayout::~DataLayout. *)
-  external dispose : t -> unit = "llvm_targetdata_dispose"
 end
 
 (** Returns the byte order of a target, either LLVMBigEndian or
@@ -51,7 +47,7 @@ external pointer_size : DataLayout.t -> int = "llvm_pointer_size"
 
 (** Returns the integer type that is the same size as a pointer on a target.
     See the method llvm::DataLayout::getIntPtrType. *)
-external intptr_type : DataLayout.t -> Llvm.lltype = "LLVMIntPtrType"
+external intptr_type : DataLayout.t -> Llvm.lltype = "llvm_intptr_type"
 
 (** Computes the size of a type in bits for a target.
     See the method llvm::DataLayout::getTypeSizeInBits. *)
index 4d0beffa5defb3313d6f3ca95f62df9c35e5ffe6..e45774272787b3951bdb15c7eb6c79a70e6b856d 100644 (file)
 
 #include "llvm-c/Target.h"
 #include "caml/alloc.h"
+#include "caml/custom.h"
+
+#define TargetData_val(v)  (*(LLVMTargetDataRef *)(Data_custom_val(v)))
+
+static void llvm_finalize_target_data(value TargetData) {
+  LLVMDisposeTargetData(TargetData_val(TargetData));
+}
+
+static struct custom_operations llvm_target_data_ops = {
+  (char *) "LLVMTargetData",
+  llvm_finalize_target_data,
+  custom_compare_default,
+  custom_hash_default,
+  custom_serialize_default,
+  custom_deserialize_default
+#ifdef custom_compare_ext_default
+  , custom_compare_ext_default
+#endif
+};
+
+value llvm_alloc_target_data(LLVMTargetDataRef TargetData) {
+  value V = alloc_custom(&llvm_target_data_ops, sizeof(LLVMTargetDataRef), 0, 1);
+  TargetData_val(V) = TargetData;
+  return V;
+}
 
 /* string -> DataLayout.t */
-CAMLprim LLVMTargetDataRef llvm_targetdata_create(value StringRep) {
-  return LLVMCreateTargetData(String_val(StringRep));
+CAMLprim value llvm_targetdata_create(value StringRep) {
+  return llvm_alloc_target_data(LLVMCreateTargetData(String_val(StringRep)));
 }
 
 /* DataLayout.t -> [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
-CAMLprim value llvm_targetdata_add(LLVMTargetDataRef TD, LLVMPassManagerRef PM){
-  LLVMAddTargetData(TD, PM);
+CAMLprim value llvm_targetdata_add(value TD, LLVMPassManagerRef PM){
+  LLVMAddTargetData(TargetData_val(TD), PM);
   return Val_unit;
 }
 
 /* DataLayout.t -> string */
-CAMLprim value llvm_targetdata_as_string(LLVMTargetDataRef TD) {
-  char *StringRep = LLVMCopyStringRepOfTargetData(TD);
+CAMLprim value llvm_targetdata_as_string(value TD) {
+  char *StringRep = LLVMCopyStringRepOfTargetData(TargetData_val(TD));
   value Copy = copy_string(StringRep);
   LLVMDisposeMessage(StringRep);
   return Copy;
 }
 
-/* DataLayout.t -> unit */
-CAMLprim value llvm_targetdata_dispose(LLVMTargetDataRef TD) {
-  LLVMDisposeTargetData(TD);
-  return Val_unit;
-}
-
 /* DataLayout.t -> Endian.t */
-CAMLprim value llvm_byte_order(LLVMTargetDataRef TD) {
-  return Val_int(LLVMByteOrder(TD));
+CAMLprim value llvm_byte_order(value TD) {
+  return Val_int(LLVMByteOrder(TargetData_val(TD)));
 }
 
 /* DataLayout.t -> int */
-CAMLprim value llvm_pointer_size(LLVMTargetDataRef TD) {
-  return Val_int(LLVMPointerSize(TD));
+CAMLprim value llvm_pointer_size(value TD) {
+  return Val_int(LLVMPointerSize(TargetData_val(TD)));
+}
+
+/* DataLayout.t -> int -> Llvm.lltype */
+CAMLprim LLVMTypeRef llvm_intptr_type(value TD) {
+  return LLVMIntPtrType(TargetData_val(TD));;
 }
 
 /* DataLayout.t -> Llvm.lltype -> Int64.t */
-CAMLprim value llvm_size_in_bits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return caml_copy_int64(LLVMSizeOfTypeInBits(TD, Ty));
+CAMLprim value llvm_size_in_bits(value TD, LLVMTypeRef Ty) {
+  return caml_copy_int64(LLVMSizeOfTypeInBits(TargetData_val(TD), Ty));
 }
 
 /* DataLayout.t -> Llvm.lltype -> Int64.t */
-CAMLprim value llvm_store_size(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return caml_copy_int64(LLVMStoreSizeOfType(TD, Ty));
+CAMLprim value llvm_store_size(value TD, LLVMTypeRef Ty) {
+  return caml_copy_int64(LLVMStoreSizeOfType(TargetData_val(TD), Ty));
 }
 
 /* DataLayout.t -> Llvm.lltype -> Int64.t */
-CAMLprim value llvm_abi_size(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return caml_copy_int64(LLVMABISizeOfType(TD, Ty));
+CAMLprim value llvm_abi_size(value TD, LLVMTypeRef Ty) {
+  return caml_copy_int64(LLVMABISizeOfType(TargetData_val(TD), Ty));
 }
 
 /* DataLayout.t -> Llvm.lltype -> int */
-CAMLprim value llvm_abi_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return Val_int(LLVMABIAlignmentOfType(TD, Ty));
+CAMLprim value llvm_abi_align(value TD, LLVMTypeRef Ty) {
+  return Val_int(LLVMABIAlignmentOfType(TargetData_val(TD), Ty));
 }
 
 /* DataLayout.t -> Llvm.lltype -> int */
-CAMLprim value llvm_stack_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return Val_int(LLVMCallFrameAlignmentOfType(TD, Ty));
+CAMLprim value llvm_stack_align(value TD, LLVMTypeRef Ty) {
+  return Val_int(LLVMCallFrameAlignmentOfType(TargetData_val(TD), Ty));
 }
 
 /* DataLayout.t -> Llvm.lltype -> int */
-CAMLprim value llvm_preferred_align(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
-  return Val_int(LLVMPreferredAlignmentOfType(TD, Ty));
+CAMLprim value llvm_preferred_align(value TD, LLVMTypeRef Ty) {
+  return Val_int(LLVMPreferredAlignmentOfType(TargetData_val(TD), Ty));
 }
 
 /* DataLayout.t -> Llvm.llvalue -> int */
-CAMLprim value llvm_preferred_align_of_global(LLVMTargetDataRef TD,
+CAMLprim value llvm_preferred_align_of_global(value TD,
                                               LLVMValueRef GlobalVar) {
-  return Val_int(LLVMPreferredAlignmentOfGlobal(TD, GlobalVar));
+  return Val_int(LLVMPreferredAlignmentOfGlobal(TargetData_val(TD), GlobalVar));
 }
 
 /* DataLayout.t -> Llvm.lltype -> Int64.t -> int */
-CAMLprim value llvm_element_at_offset(LLVMTargetDataRef TD, LLVMTypeRef Ty,
+CAMLprim value llvm_element_at_offset(value TD, LLVMTypeRef Ty,
                                       value Offset) {
-  return Val_int(LLVMElementAtOffset(TD, Ty, Int64_val(Offset)));
+  return Val_int(LLVMElementAtOffset(TargetData_val(TD), Ty, Int64_val(Offset)));
 }
 
 /* DataLayout.t -> Llvm.lltype -> int -> Int64.t */
-CAMLprim value llvm_offset_of_element(LLVMTargetDataRef TD, LLVMTypeRef Ty,
+CAMLprim value llvm_offset_of_element(value TD, LLVMTypeRef Ty,
                                       value Index) {
-  return caml_copy_int64(LLVMOffsetOfElement(TD, Ty, Int_val(Index)));
+  return caml_copy_int64(LLVMOffsetOfElement(TargetData_val(TD), Ty, Int_val(Index)));
 }
index d67a9e004cace476a4b0b92969289adac3c1471f..0fb7b32e0ba4c8e1741ccf6de20e240216e327e2 100644 (file)
@@ -65,9 +65,7 @@ let test_transforms () =
            ++ add_strip_dead_prototypes
            ++ add_strip_symbols
            ++ PassManager.run_module m
-           ++ PassManager.dispose);
-
-  DataLayout.dispose td
+           ++ PassManager.dispose)
 
 
 (*===-- Driver ------------------------------------------------------------===*)
index 8202e1907d80cb6b64d962f184d3f0b62a386296..5cf0d7d141aa204dd79c167b5b3dd95ff8a795bf 100644 (file)
@@ -80,9 +80,7 @@ let test_transforms () =
            ++ PassManager.initialize
            ++ PassManager.run_function fn
            ++ PassManager.finalize
-           ++ PassManager.dispose);
-  
-  DataLayout.dispose td
+           ++ PassManager.dispose)
 
 
 (*===-- Driver ------------------------------------------------------------===*)
index b43922797c701224673be2fa83b9f7382aba848f..0f1aa18e395c6d8fc599132d9ce90722fdd24488 100644 (file)
@@ -54,8 +54,7 @@ let test_target_data () =
   assert_equal (preferred_align td sty) 8;
   assert_equal (preferred_align_of_global td (declare_global sty "g" m)) 8;
   assert_equal (element_at_offset td sty (Int64.of_int 1)) 0;
-  assert_equal (offset_of_element td sty 1) (Int64.of_int 4);
-  DataLayout.dispose td
+  assert_equal (offset_of_element td sty 1) (Int64.of_int 4)
 
 
 (*===-- Driver ------------------------------------------------------------===*)
index 53f92bf2cf91572bce2199145f5f22775a20b2dc..4e015a250c7517529578eba4ac98ab9a8932e01b 100644 (file)
@@ -49,9 +49,7 @@ let test_transforms () =
            ++ add_loop_vectorize
            ++ add_slp_vectorize
            ++ PassManager.run_module m
-           ++ PassManager.dispose);
-
-  DataLayout.dispose td
+           ++ PassManager.dispose)
 
 
 (*===-- Driver ------------------------------------------------------------===*)