/*===-- 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 #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; }