Home | History | Annotate | Download | only in passmgr_builder
      1 /*===-- passmgr_builder_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/Transforms/PassManagerBuilder.h"
     19 #include "caml/mlvalues.h"
     20 #include "caml/custom.h"
     21 #include "caml/misc.h"
     22 
     23 #define PMBuilder_val(v)  (*(LLVMPassManagerBuilderRef *)(Data_custom_val(v)))
     24 
     25 static void llvm_finalize_pmbuilder(value PMB) {
     26   LLVMPassManagerBuilderDispose(PMBuilder_val(PMB));
     27 }
     28 
     29 static struct custom_operations pmbuilder_ops = {
     30   (char *) "LLVMPassManagerBuilder",
     31   llvm_finalize_pmbuilder,
     32   custom_compare_default,
     33   custom_hash_default,
     34   custom_serialize_default,
     35   custom_deserialize_default
     36 #ifdef custom_compare_ext_default
     37   , custom_compare_ext_default
     38 #endif
     39 };
     40 
     41 static value alloc_pmbuilder(LLVMPassManagerBuilderRef Ref) {
     42   value Val = alloc_custom(&pmbuilder_ops,
     43                            sizeof(LLVMPassManagerBuilderRef), 0, 1);
     44   PMBuilder_val(Val) = Ref;
     45   return Val;
     46 }
     47 
     48 /* t -> unit */
     49 CAMLprim value llvm_pmbuilder_create(value Unit) {
     50   return alloc_pmbuilder(LLVMPassManagerBuilderCreate());
     51 }
     52 
     53 /* int -> t -> unit */
     54 CAMLprim value llvm_pmbuilder_set_opt_level(value OptLevel, value PMB) {
     55   LLVMPassManagerBuilderSetOptLevel(PMBuilder_val(PMB), Int_val(OptLevel));
     56   return Val_unit;
     57 }
     58 
     59 /* int -> t -> unit */
     60 CAMLprim value llvm_pmbuilder_set_size_level(value SizeLevel, value PMB) {
     61   LLVMPassManagerBuilderSetSizeLevel(PMBuilder_val(PMB), Int_val(SizeLevel));
     62   return Val_unit;
     63 }
     64 
     65 /* int -> t -> unit */
     66 CAMLprim value llvm_pmbuilder_use_inliner_with_threshold(
     67                       value Threshold, value PMB) {
     68   LLVMPassManagerBuilderSetOptLevel(PMBuilder_val(PMB), Int_val(Threshold));
     69   return Val_unit;
     70 }
     71 
     72 /* bool -> t -> unit */
     73 CAMLprim value llvm_pmbuilder_set_disable_unit_at_a_time(
     74                       value DisableUnitAtATime, value PMB) {
     75   LLVMPassManagerBuilderSetDisableUnitAtATime(
     76                       PMBuilder_val(PMB), Bool_val(DisableUnitAtATime));
     77   return Val_unit;
     78 }
     79 
     80 /* bool -> t -> unit */
     81 CAMLprim value llvm_pmbuilder_set_disable_unroll_loops(
     82                       value DisableUnroll, value PMB) {
     83   LLVMPassManagerBuilderSetDisableUnrollLoops(
     84                       PMBuilder_val(PMB), Bool_val(DisableUnroll));
     85   return Val_unit;
     86 }
     87 
     88 /* [ `Function ] Llvm.PassManager.t -> t -> unit */
     89 CAMLprim value llvm_pmbuilder_populate_function_pass_manager(
     90                       LLVMPassManagerRef PM, value PMB) {
     91   LLVMPassManagerBuilderPopulateFunctionPassManager(
     92                       PMBuilder_val(PMB), PM);
     93   return Val_unit;
     94 }
     95 
     96 /* [ `Module ] Llvm.PassManager.t -> t -> unit */
     97 CAMLprim value llvm_pmbuilder_populate_module_pass_manager(
     98                       LLVMPassManagerRef PM, value PMB) {
     99   LLVMPassManagerBuilderPopulateModulePassManager(
    100                       PMBuilder_val(PMB), PM);
    101   return Val_unit;
    102 }
    103 
    104 /* [ `Module ] Llvm.PassManager.t ->
    105    internalize:bool -> run_inliner:bool -> t -> unit */
    106 CAMLprim value llvm_pmbuilder_populate_lto_pass_manager(
    107                       LLVMPassManagerRef PM, value Internalize, value RunInliner,
    108                       value PMB) {
    109   LLVMPassManagerBuilderPopulateLTOPassManager(
    110                       PMBuilder_val(PMB), PM,
    111                       Bool_val(Internalize), Bool_val(RunInliner));
    112   return Val_unit;
    113 }
    114