2013-11-04 01:39:42 +00:00
|
|
|
/*===-- passmgr_builder_ocaml.c - LLVM OCaml Glue ---------------*- C++ -*-===*\
|
|
|
|
|* *|
|
|
|
|
|* The LLVM Compiler Infrastructure *|
|
|
|
|
|* *|
|
|
|
|
|* This file is distributed under the University of Illinois Open Source *|
|
|
|
|
|* License. See LICENSE.TXT for details. *|
|
|
|
|
|* *|
|
|
|
|
|*===----------------------------------------------------------------------===*|
|
|
|
|
|* *|
|
|
|
|
|* 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-c/Transforms/PassManagerBuilder.h"
|
|
|
|
#include "caml/mlvalues.h"
|
|
|
|
#include "caml/custom.h"
|
|
|
|
#include "caml/misc.h"
|
|
|
|
|
|
|
|
#define PMBuilder_val(v) (*(LLVMPassManagerBuilderRef *)(Data_custom_val(v)))
|
|
|
|
|
|
|
|
static void llvm_finalize_pmbuilder(value PMB) {
|
|
|
|
LLVMPassManagerBuilderDispose(PMBuilder_val(PMB));
|
|
|
|
}
|
|
|
|
|
|
|
|
static struct custom_operations pmbuilder_ops = {
|
2014-10-29 08:15:54 +00:00
|
|
|
(char *) "Llvm_passmgr_builder.t",
|
2013-11-04 01:39:42 +00:00
|
|
|
llvm_finalize_pmbuilder,
|
|
|
|
custom_compare_default,
|
|
|
|
custom_hash_default,
|
|
|
|
custom_serialize_default,
|
2014-10-29 08:15:54 +00:00
|
|
|
custom_deserialize_default,
|
|
|
|
custom_compare_ext_default
|
2013-11-04 01:39:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static value alloc_pmbuilder(LLVMPassManagerBuilderRef Ref) {
|
|
|
|
value Val = alloc_custom(&pmbuilder_ops,
|
|
|
|
sizeof(LLVMPassManagerBuilderRef), 0, 1);
|
|
|
|
PMBuilder_val(Val) = Ref;
|
|
|
|
return Val;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* t -> unit */
|
|
|
|
CAMLprim value llvm_pmbuilder_create(value Unit) {
|
|
|
|
return alloc_pmbuilder(LLVMPassManagerBuilderCreate());
|
|
|
|
}
|
|
|
|
|
|
|
|
/* int -> t -> unit */
|
|
|
|
CAMLprim value llvm_pmbuilder_set_opt_level(value OptLevel, value PMB) {
|
|
|
|
LLVMPassManagerBuilderSetOptLevel(PMBuilder_val(PMB), Int_val(OptLevel));
|
|
|
|
return Val_unit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* int -> t -> unit */
|
|
|
|
CAMLprim value llvm_pmbuilder_set_size_level(value SizeLevel, value PMB) {
|
|
|
|
LLVMPassManagerBuilderSetSizeLevel(PMBuilder_val(PMB), Int_val(SizeLevel));
|
|
|
|
return Val_unit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* int -> t -> unit */
|
|
|
|
CAMLprim value llvm_pmbuilder_use_inliner_with_threshold(
|
|
|
|
value Threshold, value PMB) {
|
|
|
|
LLVMPassManagerBuilderSetOptLevel(PMBuilder_val(PMB), Int_val(Threshold));
|
|
|
|
return Val_unit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* bool -> t -> unit */
|
|
|
|
CAMLprim value llvm_pmbuilder_set_disable_unit_at_a_time(
|
|
|
|
value DisableUnitAtATime, value PMB) {
|
|
|
|
LLVMPassManagerBuilderSetDisableUnitAtATime(
|
|
|
|
PMBuilder_val(PMB), Bool_val(DisableUnitAtATime));
|
|
|
|
return Val_unit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* bool -> t -> unit */
|
|
|
|
CAMLprim value llvm_pmbuilder_set_disable_unroll_loops(
|
|
|
|
value DisableUnroll, value PMB) {
|
|
|
|
LLVMPassManagerBuilderSetDisableUnrollLoops(
|
|
|
|
PMBuilder_val(PMB), Bool_val(DisableUnroll));
|
|
|
|
return Val_unit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* [ `Function ] Llvm.PassManager.t -> t -> unit */
|
|
|
|
CAMLprim value llvm_pmbuilder_populate_function_pass_manager(
|
|
|
|
LLVMPassManagerRef PM, value PMB) {
|
|
|
|
LLVMPassManagerBuilderPopulateFunctionPassManager(
|
|
|
|
PMBuilder_val(PMB), PM);
|
|
|
|
return Val_unit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* [ `Module ] Llvm.PassManager.t -> t -> unit */
|
|
|
|
CAMLprim value llvm_pmbuilder_populate_module_pass_manager(
|
|
|
|
LLVMPassManagerRef PM, value PMB) {
|
|
|
|
LLVMPassManagerBuilderPopulateModulePassManager(
|
|
|
|
PMBuilder_val(PMB), PM);
|
|
|
|
return Val_unit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* [ `Module ] Llvm.PassManager.t ->
|
|
|
|
internalize:bool -> run_inliner:bool -> t -> unit */
|
|
|
|
CAMLprim value llvm_pmbuilder_populate_lto_pass_manager(
|
|
|
|
LLVMPassManagerRef PM, value Internalize, value RunInliner,
|
|
|
|
value PMB) {
|
|
|
|
LLVMPassManagerBuilderPopulateLTOPassManager(
|
|
|
|
PMBuilder_val(PMB), PM,
|
|
|
|
Bool_val(Internalize), Bool_val(RunInliner));
|
|
|
|
return Val_unit;
|
|
|
|
}
|