brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.7 KiB · 6144c9a Raw
136 lines · c
1/*===-- passbuilder_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_ocaml.h"19#include "target_ocaml.h"20#include "llvm-c/Error.h"21#include "llvm-c/Transforms/PassBuilder.h"22#include <caml/memory.h>23 24#define PassBuilderOptions_val(v) ((LLVMPassBuilderOptionsRef)from_val(v))25 26value llvm_run_passes(value M, value Passes, value TM, value Options) {27  LLVMErrorRef Err =28      LLVMRunPasses(Module_val(M), String_val(Passes), TargetMachine_val(TM),29                    PassBuilderOptions_val(Options));30  if (Err == LLVMErrorSuccess) {31    value result = caml_alloc(1, 0);32    Store_field(result, 0, Val_unit);33    return result;34  } else {35    char *str = LLVMGetErrorMessage(Err);36    value v = caml_copy_string(str);37    LLVMDisposeErrorMessage(str);38    value result = caml_alloc(1, 1);39    Store_field(result, 0, v);40    return result;41  }42}43 44value llvm_create_passbuilder_options(value Unit) {45  LLVMPassBuilderOptionsRef PBO = LLVMCreatePassBuilderOptions();46  return to_val(PBO);47}48 49value llvm_passbuilder_options_set_verify_each(value PBO, value VerifyEach) {50  LLVMPassBuilderOptionsSetVerifyEach(PassBuilderOptions_val(PBO),51                                      Bool_val(VerifyEach));52  return Val_unit;53}54 55value llvm_passbuilder_options_set_debug_logging(value PBO,56                                                 value DebugLogging) {57  LLVMPassBuilderOptionsSetDebugLogging(PassBuilderOptions_val(PBO),58                                        Bool_val(DebugLogging));59  return Val_unit;60}61 62value llvm_passbuilder_options_set_loop_interleaving(value PBO,63                                                     value LoopInterleaving) {64  LLVMPassBuilderOptionsSetLoopInterleaving(PassBuilderOptions_val(PBO),65                                            Bool_val(LoopInterleaving));66  return Val_unit;67}68 69value llvm_passbuilder_options_set_loop_vectorization(value PBO,70                                                      value LoopVectorization) {71  LLVMPassBuilderOptionsSetLoopVectorization(PassBuilderOptions_val(PBO),72                                             Bool_val(LoopVectorization));73  return Val_unit;74}75 76value llvm_passbuilder_options_set_slp_vectorization(value PBO,77                                                     value SLPVectorization) {78  LLVMPassBuilderOptionsSetSLPVectorization(PassBuilderOptions_val(PBO),79                                            Bool_val(SLPVectorization));80  return Val_unit;81}82 83value llvm_passbuilder_options_set_loop_unrolling(value PBO,84                                                  value LoopUnrolling) {85  LLVMPassBuilderOptionsSetLoopUnrolling(PassBuilderOptions_val(PBO),86                                         Bool_val(LoopUnrolling));87  return Val_unit;88}89 90value llvm_passbuilder_options_set_forget_all_scev_in_loop_unroll(91    value PBO, value ForgetAllSCEVInLoopUnroll) {92  LLVMPassBuilderOptionsSetForgetAllSCEVInLoopUnroll(93      PassBuilderOptions_val(PBO), Bool_val(ForgetAllSCEVInLoopUnroll));94  return Val_unit;95}96 97value llvm_passbuilder_options_set_licm_mssa_opt_cap(value PBO,98                                                     value LicmMssaOptCap) {99  LLVMPassBuilderOptionsSetLicmMssaOptCap(PassBuilderOptions_val(PBO),100                                          Int_val(LicmMssaOptCap));101  return Val_unit;102}103 104value llvm_passbuilder_options_set_licm_mssa_no_acc_for_promotion_cap(105    value PBO, value LicmMssaNoAccForPromotionCap) {106  LLVMPassBuilderOptionsSetLicmMssaNoAccForPromotionCap(107      PassBuilderOptions_val(PBO), Int_val(LicmMssaNoAccForPromotionCap));108  return Val_unit;109}110 111value llvm_passbuilder_options_set_call_graph_profile(value PBO,112                                                      value CallGraphProfile) {113  LLVMPassBuilderOptionsSetCallGraphProfile(PassBuilderOptions_val(PBO),114                                            Bool_val(CallGraphProfile));115  return Val_unit;116}117 118value llvm_passbuilder_options_set_merge_functions(value PBO,119                                                   value MergeFunctions) {120  LLVMPassBuilderOptionsSetMergeFunctions(PassBuilderOptions_val(PBO),121                                          Bool_val(MergeFunctions));122  return Val_unit;123}124 125value llvm_passbuilder_options_set_inliner_threshold(value PBO,126                                                     value InlinerThreshold) {127  LLVMPassBuilderOptionsSetInlinerThreshold(PassBuilderOptions_val(PBO),128                                            Int_val(InlinerThreshold));129  return Val_unit;130}131 132value llvm_dispose_passbuilder_options(value PBO) {133  LLVMDisposePassBuilderOptions(PassBuilderOptions_val(PBO));134  return Val_unit;135}136