[OCaml] implement Llvm_passmgr_builder, bindings for PassManagerBuilder
[oota-llvm.git] / bindings / ocaml / transforms / passmgr_builder / passmgr_builder_ocaml.c
diff --git a/bindings/ocaml/transforms/passmgr_builder/passmgr_builder_ocaml.c b/bindings/ocaml/transforms/passmgr_builder/passmgr_builder_ocaml.c
new file mode 100644 (file)
index 0000000..a707856
--- /dev/null
@@ -0,0 +1,113 @@
+/*===-- passmgr_builder_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/Transforms/PassManagerBuilder.h"
+#include "caml/mlvalues.h"
+#include "caml/custom.h"
+#include "caml/misc.h"
+
+#define PMBuilder_val(v)  (*(LLVMPassManagerBuilderRef *)(Data_custom_val(v)))
+
+static void llvm_finalize_pmbuilder(value PMB) {
+  LLVMPassManagerBuilderDispose(PMBuilder_val(PMB));
+}
+
+static struct custom_operations pmbuilder_ops = {
+  (char *) "LLVMPassManagerBuilder",
+  llvm_finalize_pmbuilder,
+  custom_compare_default,
+  custom_hash_default,
+  custom_serialize_default,
+  custom_deserialize_default
+#ifdef custom_compare_ext_default
+  , custom_compare_ext_default
+#endif
+};
+
+static value alloc_pmbuilder(LLVMPassManagerBuilderRef Ref) {
+  value Val = alloc_custom(&pmbuilder_ops,
+                           sizeof(LLVMPassManagerBuilderRef), 0, 1);
+  PMBuilder_val(Val) = Ref;
+  return Val;
+}
+
+/* t -> unit */
+CAMLprim value llvm_pmbuilder_create(value Unit) {
+  return alloc_pmbuilder(LLVMPassManagerBuilderCreate());
+}
+
+/* int -> t -> unit */
+CAMLprim value llvm_pmbuilder_set_opt_level(value OptLevel, value PMB) {
+  LLVMPassManagerBuilderSetOptLevel(PMBuilder_val(PMB), Int_val(OptLevel));
+  return Val_unit;
+}
+
+/* int -> t -> unit */
+CAMLprim value llvm_pmbuilder_set_size_level(value SizeLevel, value PMB) {
+  LLVMPassManagerBuilderSetSizeLevel(PMBuilder_val(PMB), Int_val(SizeLevel));
+  return Val_unit;
+}
+
+/* int -> t -> unit */
+CAMLprim value llvm_pmbuilder_use_inliner_with_threshold(
+                      value Threshold, value PMB) {
+  LLVMPassManagerBuilderSetOptLevel(PMBuilder_val(PMB), Int_val(Threshold));
+  return Val_unit;
+}
+
+/* bool -> t -> unit */
+CAMLprim value llvm_pmbuilder_set_disable_unit_at_a_time(
+                      value DisableUnitAtATime, value PMB) {
+  LLVMPassManagerBuilderSetDisableUnitAtATime(
+                      PMBuilder_val(PMB), Bool_val(DisableUnitAtATime));
+  return Val_unit;
+}
+
+/* bool -> t -> unit */
+CAMLprim value llvm_pmbuilder_set_disable_unroll_loops(
+                      value DisableUnroll, value PMB) {
+  LLVMPassManagerBuilderSetDisableUnrollLoops(
+                      PMBuilder_val(PMB), Bool_val(DisableUnroll));
+  return Val_unit;
+}
+
+/* [ `Function ] Llvm.PassManager.t -> t -> unit */
+CAMLprim value llvm_pmbuilder_populate_function_pass_manager(
+                      LLVMPassManagerRef PM, value PMB) {
+  LLVMPassManagerBuilderPopulateFunctionPassManager(
+                      PMBuilder_val(PMB), PM);
+  return Val_unit;
+}
+
+/* [ `Module ] Llvm.PassManager.t -> t -> unit */
+CAMLprim value llvm_pmbuilder_populate_module_pass_manager(
+                      LLVMPassManagerRef PM, value PMB) {
+  LLVMPassManagerBuilderPopulateModulePassManager(
+                      PMBuilder_val(PMB), PM);
+  return Val_unit;
+}
+
+/* [ `Module ] Llvm.PassManager.t ->
+   internalize:bool -> run_inliner:bool -> t -> unit */
+CAMLprim value llvm_pmbuilder_populate_lto_pass_manager(
+                      LLVMPassManagerRef PM, value Internalize, value RunInliner,
+                      value PMB) {
+  LLVMPassManagerBuilderPopulateLTOPassManager(
+                      PMBuilder_val(PMB), PM,
+                      Bool_val(Internalize), Bool_val(RunInliner));
+  return Val_unit;
+}