1*49610eddSAlan /*===-- passbuilder_ocaml.c - LLVM OCaml Glue -------------------*- C++ -*-===*\
2*49610eddSAlan |* *|
3*49610eddSAlan |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
4*49610eddSAlan |* Exceptions. *|
5*49610eddSAlan |* See https://llvm.org/LICENSE.txt for license information. *|
6*49610eddSAlan |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
7*49610eddSAlan |* *|
8*49610eddSAlan |*===----------------------------------------------------------------------===*|
9*49610eddSAlan |* *|
10*49610eddSAlan |* This file glues LLVM's OCaml interface to its C interface. These functions *|
11*49610eddSAlan |* are by and large transparent wrappers to the corresponding C functions. *|
12*49610eddSAlan |* *|
13*49610eddSAlan |* Note that these functions intentionally take liberties with the CAMLparamX *|
14*49610eddSAlan |* macros, since most of the parameters are not GC heap objects. *|
15*49610eddSAlan |* *|
16*49610eddSAlan \*===----------------------------------------------------------------------===*/
17*49610eddSAlan
18*49610eddSAlan #include "llvm_ocaml.h"
19*49610eddSAlan #include "target_ocaml.h"
20*49610eddSAlan #include "llvm-c/Error.h"
21*49610eddSAlan #include "llvm-c/Transforms/PassBuilder.h"
22*49610eddSAlan #include <caml/memory.h>
23*49610eddSAlan
24*49610eddSAlan #define PassBuilderOptions_val(v) ((LLVMPassBuilderOptionsRef)from_val(v))
25*49610eddSAlan
llvm_run_passes(value M,value Passes,value TM,value Options)26*49610eddSAlan value llvm_run_passes(value M, value Passes, value TM, value Options) {
27*49610eddSAlan LLVMErrorRef Err =
28*49610eddSAlan LLVMRunPasses(Module_val(M), String_val(Passes), TargetMachine_val(TM),
29*49610eddSAlan PassBuilderOptions_val(Options));
30*49610eddSAlan if (Err == LLVMErrorSuccess) {
31*49610eddSAlan value result = caml_alloc(1, 0);
32*49610eddSAlan Store_field(result, 0, Val_unit);
33*49610eddSAlan return result;
34*49610eddSAlan } else {
35*49610eddSAlan char *str = LLVMGetErrorMessage(Err);
36*49610eddSAlan value v = caml_copy_string(str);
37*49610eddSAlan LLVMDisposeErrorMessage(str);
38*49610eddSAlan value result = caml_alloc(1, 1);
39*49610eddSAlan Store_field(result, 0, v);
40*49610eddSAlan return result;
41*49610eddSAlan }
42*49610eddSAlan }
43*49610eddSAlan
llvm_create_passbuilder_options(value Unit)44*49610eddSAlan value llvm_create_passbuilder_options(value Unit) {
45*49610eddSAlan LLVMPassBuilderOptionsRef PBO = LLVMCreatePassBuilderOptions();
46*49610eddSAlan return to_val(PBO);
47*49610eddSAlan }
48*49610eddSAlan
llvm_passbuilder_options_set_verify_each(value PBO,value VerifyEach)49*49610eddSAlan value llvm_passbuilder_options_set_verify_each(value PBO, value VerifyEach) {
50*49610eddSAlan LLVMPassBuilderOptionsSetVerifyEach(PassBuilderOptions_val(PBO),
51*49610eddSAlan Bool_val(VerifyEach));
52*49610eddSAlan return Val_unit;
53*49610eddSAlan }
54*49610eddSAlan
llvm_passbuilder_options_set_debug_logging(value PBO,value DebugLogging)55*49610eddSAlan value llvm_passbuilder_options_set_debug_logging(value PBO,
56*49610eddSAlan value DebugLogging) {
57*49610eddSAlan LLVMPassBuilderOptionsSetDebugLogging(PassBuilderOptions_val(PBO),
58*49610eddSAlan Bool_val(DebugLogging));
59*49610eddSAlan return Val_unit;
60*49610eddSAlan }
61*49610eddSAlan
llvm_passbuilder_options_set_loop_interleaving(value PBO,value LoopInterleaving)62*49610eddSAlan value llvm_passbuilder_options_set_loop_interleaving(value PBO,
63*49610eddSAlan value LoopInterleaving) {
64*49610eddSAlan LLVMPassBuilderOptionsSetLoopInterleaving(PassBuilderOptions_val(PBO),
65*49610eddSAlan Bool_val(LoopInterleaving));
66*49610eddSAlan return Val_unit;
67*49610eddSAlan }
68*49610eddSAlan
llvm_passbuilder_options_set_loop_vectorization(value PBO,value LoopVectorization)69*49610eddSAlan value llvm_passbuilder_options_set_loop_vectorization(value PBO,
70*49610eddSAlan value LoopVectorization) {
71*49610eddSAlan LLVMPassBuilderOptionsSetLoopVectorization(PassBuilderOptions_val(PBO),
72*49610eddSAlan Bool_val(LoopVectorization));
73*49610eddSAlan return Val_unit;
74*49610eddSAlan }
75*49610eddSAlan
llvm_passbuilder_options_set_slp_vectorization(value PBO,value SLPVectorization)76*49610eddSAlan value llvm_passbuilder_options_set_slp_vectorization(value PBO,
77*49610eddSAlan value SLPVectorization) {
78*49610eddSAlan LLVMPassBuilderOptionsSetSLPVectorization(PassBuilderOptions_val(PBO),
79*49610eddSAlan Bool_val(SLPVectorization));
80*49610eddSAlan return Val_unit;
81*49610eddSAlan }
82*49610eddSAlan
llvm_passbuilder_options_set_loop_unrolling(value PBO,value LoopUnrolling)83*49610eddSAlan value llvm_passbuilder_options_set_loop_unrolling(value PBO,
84*49610eddSAlan value LoopUnrolling) {
85*49610eddSAlan LLVMPassBuilderOptionsSetLoopUnrolling(PassBuilderOptions_val(PBO),
86*49610eddSAlan Bool_val(LoopUnrolling));
87*49610eddSAlan return Val_unit;
88*49610eddSAlan }
89*49610eddSAlan
llvm_passbuilder_options_set_forget_all_scev_in_loop_unroll(value PBO,value ForgetAllSCEVInLoopUnroll)90*49610eddSAlan value llvm_passbuilder_options_set_forget_all_scev_in_loop_unroll(
91*49610eddSAlan value PBO, value ForgetAllSCEVInLoopUnroll) {
92*49610eddSAlan LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll(
93*49610eddSAlan PassBuilderOptions_val(PBO), Bool_val(ForgetAllSCEVInLoopUnroll));
94*49610eddSAlan return Val_unit;
95*49610eddSAlan }
96*49610eddSAlan
llvm_passbuilder_options_set_licm_mssa_opt_cap(value PBO,value LicmMssaOptCap)97*49610eddSAlan value llvm_passbuilder_options_set_licm_mssa_opt_cap(value PBO,
98*49610eddSAlan value LicmMssaOptCap) {
99*49610eddSAlan LLVMPassBuilderOptionsSetLicmMssaOptCap(PassBuilderOptions_val(PBO),
100*49610eddSAlan Int_val(LicmMssaOptCap));
101*49610eddSAlan return Val_unit;
102*49610eddSAlan }
103*49610eddSAlan
llvm_passbuilder_options_set_licm_mssa_no_acc_for_promotion_cap(value PBO,value LicmMssaNoAccForPromotionCap)104*49610eddSAlan value llvm_passbuilder_options_set_licm_mssa_no_acc_for_promotion_cap(
105*49610eddSAlan value PBO, value LicmMssaNoAccForPromotionCap) {
106*49610eddSAlan LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap(
107*49610eddSAlan PassBuilderOptions_val(PBO), Int_val(LicmMssaNoAccForPromotionCap));
108*49610eddSAlan return Val_unit;
109*49610eddSAlan }
110*49610eddSAlan
llvm_passbuilder_options_set_call_graph_profile(value PBO,value CallGraphProfile)111*49610eddSAlan value llvm_passbuilder_options_set_call_graph_profile(value PBO,
112*49610eddSAlan value CallGraphProfile) {
113*49610eddSAlan LLVMPassBuilderOptionsSetCallGraphProfile(PassBuilderOptions_val(PBO),
114*49610eddSAlan Bool_val(CallGraphProfile));
115*49610eddSAlan return Val_unit;
116*49610eddSAlan }
117*49610eddSAlan
llvm_passbuilder_options_set_merge_functions(value PBO,value MergeFunctions)118*49610eddSAlan value llvm_passbuilder_options_set_merge_functions(value PBO,
119*49610eddSAlan value MergeFunctions) {
120*49610eddSAlan LLVMPassBuilderOptionsSetMergeFunctions(PassBuilderOptions_val(PBO),
121*49610eddSAlan Bool_val(MergeFunctions));
122*49610eddSAlan return Val_unit;
123*49610eddSAlan }
124*49610eddSAlan
llvm_passbuilder_options_set_inliner_threshold(value PBO,value InlinerThreshold)125*49610eddSAlan value llvm_passbuilder_options_set_inliner_threshold(value PBO,
126*49610eddSAlan value InlinerThreshold) {
127*49610eddSAlan LLVMPassBuilderOptionsSetInlinerThreshold(PassBuilderOptions_val(PBO),
128*49610eddSAlan Int_val(InlinerThreshold));
129*49610eddSAlan return Val_unit;
130*49610eddSAlan }
131*49610eddSAlan
llvm_dispose_passbuilder_options(value PBO)132*49610eddSAlan value llvm_dispose_passbuilder_options(value PBO) {
133*49610eddSAlan LLVMDisposePassBuilderOptions(PassBuilderOptions_val(PBO));
134*49610eddSAlan return Val_unit;
135*49610eddSAlan }
136