136 lines
5.7 KiB
C
136 lines
5.7 KiB
C
/*===-- 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;
|
|
}
|