1 /*===-- passmgr_builder_ocaml.c - LLVM OCaml Glue ---------------*- C++ -*-===*\
2 |*                                                                            *|
3 |* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
4 |* Exceptions.                                                                *|
5 |* See https://llvm.org/LICENSE.txt for license information.                  *|
6 |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
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 
llvm_finalize_pmbuilder(value PMB)25 static void llvm_finalize_pmbuilder(value PMB) {
26   LLVMPassManagerBuilderDispose(PMBuilder_val(PMB));
27 }
28 
29 static struct custom_operations pmbuilder_ops = {
30     (char *)"Llvm_passmgr_builder.t", llvm_finalize_pmbuilder,
31     custom_compare_default,           custom_hash_default,
32     custom_serialize_default,         custom_deserialize_default,
33     custom_compare_ext_default};
34 
alloc_pmbuilder(LLVMPassManagerBuilderRef Ref)35 static value alloc_pmbuilder(LLVMPassManagerBuilderRef Ref) {
36   value Val =
37       alloc_custom(&pmbuilder_ops, sizeof(LLVMPassManagerBuilderRef), 0, 1);
38   PMBuilder_val(Val) = Ref;
39   return Val;
40 }
41 
42 /* t -> unit */
llvm_pmbuilder_create(value Unit)43 value llvm_pmbuilder_create(value Unit) {
44   return alloc_pmbuilder(LLVMPassManagerBuilderCreate());
45 }
46 
47 /* int -> t -> unit */
llvm_pmbuilder_set_opt_level(value OptLevel,value PMB)48 value llvm_pmbuilder_set_opt_level(value OptLevel, value PMB) {
49   LLVMPassManagerBuilderSetOptLevel(PMBuilder_val(PMB), Int_val(OptLevel));
50   return Val_unit;
51 }
52 
53 /* int -> t -> unit */
llvm_pmbuilder_set_size_level(value SizeLevel,value PMB)54 value llvm_pmbuilder_set_size_level(value SizeLevel, value PMB) {
55   LLVMPassManagerBuilderSetSizeLevel(PMBuilder_val(PMB), Int_val(SizeLevel));
56   return Val_unit;
57 }
58 
59 /* int -> t -> unit */
llvm_pmbuilder_use_inliner_with_threshold(value Threshold,value PMB)60 value llvm_pmbuilder_use_inliner_with_threshold(value Threshold, value PMB) {
61   LLVMPassManagerBuilderSetOptLevel(PMBuilder_val(PMB), Int_val(Threshold));
62   return Val_unit;
63 }
64 
65 /* bool -> t -> unit */
llvm_pmbuilder_set_disable_unit_at_a_time(value DisableUnitAtATime,value PMB)66 value llvm_pmbuilder_set_disable_unit_at_a_time(value DisableUnitAtATime,
67                                                 value PMB) {
68   LLVMPassManagerBuilderSetDisableUnitAtATime(PMBuilder_val(PMB),
69                                               Bool_val(DisableUnitAtATime));
70   return Val_unit;
71 }
72 
73 /* bool -> t -> unit */
llvm_pmbuilder_set_disable_unroll_loops(value DisableUnroll,value PMB)74 value llvm_pmbuilder_set_disable_unroll_loops(value DisableUnroll, value PMB) {
75   LLVMPassManagerBuilderSetDisableUnrollLoops(PMBuilder_val(PMB),
76                                               Bool_val(DisableUnroll));
77   return Val_unit;
78 }
79 
80 /* [ `Function ] Llvm.PassManager.t -> t -> unit */
llvm_pmbuilder_populate_function_pass_manager(LLVMPassManagerRef PM,value PMB)81 value llvm_pmbuilder_populate_function_pass_manager(LLVMPassManagerRef PM,
82                                                     value PMB) {
83   LLVMPassManagerBuilderPopulateFunctionPassManager(PMBuilder_val(PMB), PM);
84   return Val_unit;
85 }
86 
87 /* [ `Module ] Llvm.PassManager.t -> t -> unit */
llvm_pmbuilder_populate_module_pass_manager(LLVMPassManagerRef PM,value PMB)88 value llvm_pmbuilder_populate_module_pass_manager(LLVMPassManagerRef PM,
89                                                   value PMB) {
90   LLVMPassManagerBuilderPopulateModulePassManager(PMBuilder_val(PMB), PM);
91   return Val_unit;
92 }
93