| /*===-- 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 *) "Llvm_passmgr_builder.t", |
| llvm_finalize_pmbuilder, |
| custom_compare_default, |
| custom_hash_default, |
| custom_serialize_default, |
| custom_deserialize_default, |
| custom_compare_ext_default |
| }; |
| |
| 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; |
| } |