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