| /*===-- passbuilder_ocaml.c - LLVM OCaml Glue -------------------*- C++ -*-===*\ |
| |* *| |
| |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| |
| |* Exceptions. *| |
| |* See https://llvm.org/LICENSE.txt for license information. *| |
| |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| |
| |* *| |
| |*===----------------------------------------------------------------------===*| |
| |* *| |
| |* 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_ocaml.h" |
| #include "target_ocaml.h" |
| #include "llvm-c/Error.h" |
| #include "llvm-c/Transforms/PassBuilder.h" |
| #include <caml/memory.h> |
| |
| #define PassBuilderOptions_val(v) ((LLVMPassBuilderOptionsRef)from_val(v)) |
| |
| value llvm_run_passes(value M, value Passes, value TM, value Options) { |
| LLVMErrorRef Err = |
| LLVMRunPasses(Module_val(M), String_val(Passes), TargetMachine_val(TM), |
| PassBuilderOptions_val(Options)); |
| if (Err == LLVMErrorSuccess) { |
| value result = caml_alloc(1, 0); |
| Store_field(result, 0, Val_unit); |
| return result; |
| } else { |
| char *str = LLVMGetErrorMessage(Err); |
| value v = caml_copy_string(str); |
| LLVMDisposeErrorMessage(str); |
| value result = caml_alloc(1, 1); |
| Store_field(result, 0, v); |
| return result; |
| } |
| } |
| |
| value llvm_create_passbuilder_options(value Unit) { |
| LLVMPassBuilderOptionsRef PBO = LLVMCreatePassBuilderOptions(); |
| return to_val(PBO); |
| } |
| |
| value llvm_passbuilder_options_set_verify_each(value PBO, value VerifyEach) { |
| LLVMPassBuilderOptionsSetVerifyEach(PassBuilderOptions_val(PBO), |
| Bool_val(VerifyEach)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_debug_logging(value PBO, |
| value DebugLogging) { |
| LLVMPassBuilderOptionsSetDebugLogging(PassBuilderOptions_val(PBO), |
| Bool_val(DebugLogging)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_loop_interleaving(value PBO, |
| value LoopInterleaving) { |
| LLVMPassBuilderOptionsSetLoopInterleaving(PassBuilderOptions_val(PBO), |
| Bool_val(LoopInterleaving)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_loop_vectorization(value PBO, |
| value LoopVectorization) { |
| LLVMPassBuilderOptionsSetLoopVectorization(PassBuilderOptions_val(PBO), |
| Bool_val(LoopVectorization)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_slp_vectorization(value PBO, |
| value SLPVectorization) { |
| LLVMPassBuilderOptionsSetSLPVectorization(PassBuilderOptions_val(PBO), |
| Bool_val(SLPVectorization)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_loop_unrolling(value PBO, |
| value LoopUnrolling) { |
| LLVMPassBuilderOptionsSetLoopUnrolling(PassBuilderOptions_val(PBO), |
| Bool_val(LoopUnrolling)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_forget_all_scev_in_loop_unroll( |
| value PBO, value ForgetAllSCEVInLoopUnroll) { |
| LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll( |
| PassBuilderOptions_val(PBO), Bool_val(ForgetAllSCEVInLoopUnroll)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_licm_mssa_opt_cap(value PBO, |
| value LicmMssaOptCap) { |
| LLVMPassBuilderOptionsSetLicmMssaOptCap(PassBuilderOptions_val(PBO), |
| Int_val(LicmMssaOptCap)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_licm_mssa_no_acc_for_promotion_cap( |
| value PBO, value LicmMssaNoAccForPromotionCap) { |
| LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap( |
| PassBuilderOptions_val(PBO), Int_val(LicmMssaNoAccForPromotionCap)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_call_graph_profile(value PBO, |
| value CallGraphProfile) { |
| LLVMPassBuilderOptionsSetCallGraphProfile(PassBuilderOptions_val(PBO), |
| Bool_val(CallGraphProfile)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_merge_functions(value PBO, |
| value MergeFunctions) { |
| LLVMPassBuilderOptionsSetMergeFunctions(PassBuilderOptions_val(PBO), |
| Bool_val(MergeFunctions)); |
| return Val_unit; |
| } |
| |
| value llvm_passbuilder_options_set_inliner_threshold(value PBO, |
| value InlinerThreshold) { |
| LLVMPassBuilderOptionsSetInlinerThreshold(PassBuilderOptions_val(PBO), |
| Int_val(InlinerThreshold)); |
| return Val_unit; |
| } |
| |
| value llvm_dispose_passbuilder_options(value PBO) { |
| LLVMDisposePassBuilderOptions(PassBuilderOptions_val(PBO)); |
| return Val_unit; |
| } |