mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
ocaml bindings: add llvm_ipo based on IPO.h
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141284 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0e68e90175
commit
624c5edcd4
@ -8,7 +8,7 @@
|
||||
##===----------------------------------------------------------------------===##
|
||||
|
||||
LEVEL := ../../..
|
||||
DIRS = scalar
|
||||
DIRS = scalar ipo
|
||||
|
||||
ocamldoc:
|
||||
$(Verb) for i in $(DIRS) ; do \
|
||||
|
20
bindings/ocaml/transforms/ipo/Makefile
Normal file
20
bindings/ocaml/transforms/ipo/Makefile
Normal file
@ -0,0 +1,20 @@
|
||||
##===- bindings/ocaml/transforms/scalar/Makefile -----------*- Makefile -*-===##
|
||||
#
|
||||
# The LLVM Compiler Infrastructure
|
||||
#
|
||||
# This file is distributed under the University of Illinois Open Source
|
||||
# License. See LICENSE.TXT for details.
|
||||
#
|
||||
##===----------------------------------------------------------------------===##
|
||||
#
|
||||
# This is the makefile for the Objective Caml Llvm_scalar_opts interface.
|
||||
#
|
||||
##===----------------------------------------------------------------------===##
|
||||
|
||||
LEVEL := ../../../..
|
||||
LIBRARYNAME := llvm_ipo
|
||||
DONT_BUILD_RELINKED := 1
|
||||
UsedComponents := ipo
|
||||
UsedOcamlInterfaces := llvm
|
||||
|
||||
include ../../Makefile.ocaml
|
104
bindings/ocaml/transforms/ipo/ipo_ocaml.c
Normal file
104
bindings/ocaml/transforms/ipo/ipo_ocaml.c
Normal file
@ -0,0 +1,104 @@
|
||||
/*===-- ipo_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/IPO.h"
|
||||
#include "caml/mlvalues.h"
|
||||
#include "caml/misc.h"
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_argument_promotion(LLVMPassManagerRef PM) {
|
||||
LLVMAddArgumentPromotionPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_constant_merge(LLVMPassManagerRef PM) {
|
||||
LLVMAddConstantMergePass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_dead_arg_elimination(LLVMPassManagerRef PM) {
|
||||
LLVMAddDeadArgEliminationPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_function_attrs(LLVMPassManagerRef PM) {
|
||||
LLVMAddFunctionAttrsPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_function_inlining(LLVMPassManagerRef PM) {
|
||||
LLVMAddFunctionInliningPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_always_inliner_pass(LLVMPassManagerRef PM) {
|
||||
LLVMAddAlwaysInlinerPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_global_dce(LLVMPassManagerRef PM) {
|
||||
LLVMAddGlobalDCEPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_global_optimizer(LLVMPassManagerRef PM) {
|
||||
LLVMAddGlobalOptimizerPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_ipc_propagation(LLVMPassManagerRef PM) {
|
||||
LLVMAddIPConstantPropagationPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_prune_eh(LLVMPassManagerRef PM) {
|
||||
LLVMAddPruneEHPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_ipsccp(LLVMPassManagerRef PM) {
|
||||
LLVMAddIPSCCPPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> bool -> unit */
|
||||
CAMLprim value llvm_add_internalize(LLVMPassManagerRef PM, value AllButMain) {
|
||||
LLVMAddInternalizePass(PM, Bool_val(AllButMain));
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_strip_dead_prototypes(LLVMPassManagerRef PM) {
|
||||
LLVMAddStripDeadPrototypesPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [`Module] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_strip_symbols(LLVMPassManagerRef PM) {
|
||||
LLVMAddStripSymbolsPass(PM);
|
||||
return Val_unit;
|
||||
}
|
65
bindings/ocaml/transforms/ipo/llvm_ipo.ml
Normal file
65
bindings/ocaml/transforms/ipo/llvm_ipo.ml
Normal file
@ -0,0 +1,65 @@
|
||||
(*===-- llvm_ipo.mli - LLVM Ocaml Interface ------------*- OCaml -*-===*
|
||||
*
|
||||
* The LLVM Compiler Infrastructure
|
||||
*
|
||||
* This file is distributed under the University of Illinois Open Source
|
||||
* License. See LICENSE.TXT for details.
|
||||
*
|
||||
*===----------------------------------------------------------------------===*)
|
||||
|
||||
(** IPO Transforms.
|
||||
|
||||
This interface provides an ocaml API for LLVM interprocedural optimizations, the
|
||||
classes in the [LLVMIPO] library. *)
|
||||
|
||||
(** See llvm::createAddArgumentPromotionPass *)
|
||||
external add_argument_promotion : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_argument_promotion"
|
||||
|
||||
(** See llvm::createConstantMergePass function. *)
|
||||
external add_constant_merge : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_constant_merge"
|
||||
|
||||
(** See llvm::createDeadArgEliminationPass function. *)
|
||||
external add_dead_arg_elimination :
|
||||
[ | `Module ] Llvm.PassManager.t -> unit = "llvm_add_dead_arg_elimination"
|
||||
|
||||
(** See llvm::createFunctionAttrsPass function. *)
|
||||
external add_function_attrs : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_function_attrs"
|
||||
|
||||
(** See llvm::createFunctionInliningPass function. *)
|
||||
external add_function_inlining : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_function_inlining"
|
||||
|
||||
(** See llvm::createGlobalDCEPass function. *)
|
||||
external add_global_dce : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_global_dce"
|
||||
|
||||
(** See llvm::createGlobalOptimizerPass function. *)
|
||||
external add_global_optimizer : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_global_optimizer"
|
||||
|
||||
(** See llvm::createIPConstantPropagationPass function. *)
|
||||
external add_ipc_propagation : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_ipc_propagation"
|
||||
|
||||
(** See llvm::createPruneEHPass function. *)
|
||||
external add_prune_eh : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_prune_eh"
|
||||
|
||||
(** See llvm::createIPSCCPPass function. *)
|
||||
external add_ipsccp : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_ipsccp"
|
||||
|
||||
(** See llvm::createInternalizePass function. *)
|
||||
external add_internalize : [ | `Module ] Llvm.PassManager.t -> bool -> unit =
|
||||
"llvm_add_internalize"
|
||||
|
||||
(** See llvm::createStripDeadPrototypesPass function. *)
|
||||
external add_strip_dead_prototypes :
|
||||
[ | `Module ] Llvm.PassManager.t -> unit = "llvm_add_strip_dead_prototypes"
|
||||
|
||||
(** See llvm::createStripSymbolsPass function. *)
|
||||
external add_strip_symbols : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_strip_symbols"
|
65
bindings/ocaml/transforms/ipo/llvm_ipo.mli
Normal file
65
bindings/ocaml/transforms/ipo/llvm_ipo.mli
Normal file
@ -0,0 +1,65 @@
|
||||
(*===-- llvm_ipo.mli - LLVM Ocaml Interface ------------*- OCaml -*-===*
|
||||
*
|
||||
* The LLVM Compiler Infrastructure
|
||||
*
|
||||
* This file is distributed under the University of Illinois Open Source
|
||||
* License. See LICENSE.TXT for details.
|
||||
*
|
||||
*===----------------------------------------------------------------------===*)
|
||||
|
||||
(** IPO Transforms.
|
||||
|
||||
This interface provides an ocaml API for LLVM interprocedural optimizations, the
|
||||
classes in the [LLVMIPO] library. *)
|
||||
|
||||
(** See llvm::createAddArgumentPromotionPass *)
|
||||
external add_argument_promotion : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
|
||||
"llvm_add_argument_promotion"
|
||||
(** See llvm::createConstantMergePass function. *)
|
||||
external add_constant_merge : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_constant_merge"
|
||||
|
||||
(** See llvm::createDeadArgEliminationPass function. *)
|
||||
external add_dead_arg_elimination :
|
||||
[ | `Module ] Llvm.PassManager.t -> unit = "llvm_add_dead_arg_elimination"
|
||||
|
||||
(** See llvm::createFunctionAttrsPass function. *)
|
||||
external add_function_attrs : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_function_attrs"
|
||||
|
||||
(** See llvm::createFunctionInliningPass function. *)
|
||||
external add_function_inlining : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_function_inlining"
|
||||
|
||||
(** See llvm::createGlobalDCEPass function. *)
|
||||
external add_global_dce : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_global_dce"
|
||||
|
||||
(** See llvm::createGlobalOptimizerPass function. *)
|
||||
external add_global_optimizer : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_global_optimizer"
|
||||
|
||||
(** See llvm::createIPConstantPropagationPass function. *)
|
||||
external add_ipc_propagation : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_ipc_propagation"
|
||||
|
||||
(** See llvm::createPruneEHPass function. *)
|
||||
external add_prune_eh : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_prune_eh"
|
||||
|
||||
(** See llvm::createIPSCCPPass function. *)
|
||||
external add_ipsccp : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_ipsccp"
|
||||
|
||||
(** See llvm::createInternalizePass function. *)
|
||||
external add_internalize : [ | `Module ] Llvm.PassManager.t -> bool -> unit =
|
||||
"llvm_add_internalize"
|
||||
|
||||
(** See llvm::createStripDeadPrototypesPass function. *)
|
||||
external add_strip_dead_prototypes :
|
||||
[ | `Module ] Llvm.PassManager.t -> unit = "llvm_add_strip_dead_prototypes"
|
||||
|
||||
(** See llvm::createStripSymbolsPass function. *)
|
||||
external add_strip_symbols : [ | `Module ] Llvm.PassManager.t -> unit =
|
||||
"llvm_add_strip_symbols"
|
73
test/Bindings/Ocaml/ipo_opts.ml
Normal file
73
test/Bindings/Ocaml/ipo_opts.ml
Normal file
@ -0,0 +1,73 @@
|
||||
(* RUN: %ocamlopt -warn-error A llvm.cmxa llvm_ipo.cmxa llvm_target.cmxa %s -o %t
|
||||
* RUN: %t %t.bc
|
||||
* XFAIL: vg_leak
|
||||
*)
|
||||
|
||||
(* Note: It takes several seconds for ocamlopt to link an executable with
|
||||
libLLVMCore.a, so it's better to write a big test than a bunch of
|
||||
little ones. *)
|
||||
|
||||
open Llvm
|
||||
open Llvm_ipo
|
||||
open Llvm_target
|
||||
|
||||
let context = global_context ()
|
||||
let void_type = Llvm.void_type context
|
||||
let i8_type = Llvm.i8_type context
|
||||
|
||||
(* Tiny unit test framework - really just to help find which line is busted *)
|
||||
let print_checkpoints = false
|
||||
|
||||
let suite name f =
|
||||
if print_checkpoints then
|
||||
prerr_endline (name ^ ":");
|
||||
f ()
|
||||
|
||||
|
||||
(*===-- Fixture -----------------------------------------------------------===*)
|
||||
|
||||
let filename = Sys.argv.(1)
|
||||
let m = create_module context filename
|
||||
|
||||
|
||||
(*===-- Transforms --------------------------------------------------------===*)
|
||||
|
||||
let test_transforms () =
|
||||
let (++) x f = ignore (f x); x in
|
||||
|
||||
let fty = function_type i8_type [| |] in
|
||||
let fn = define_function "fn" fty m in
|
||||
let fn2 = define_function "fn2" fty m in begin
|
||||
ignore (build_ret (const_int i8_type 4) (builder_at_end context (entry_block fn)));
|
||||
let b = builder_at_end context (entry_block fn2) in
|
||||
ignore (build_ret (build_call fn [| |] "" b) b);
|
||||
end;
|
||||
|
||||
let td = TargetData.create (target_triple m) in
|
||||
|
||||
ignore (PassManager.create ()
|
||||
++ TargetData.add td
|
||||
++ add_argument_promotion
|
||||
++ add_constant_merge
|
||||
++ add_dead_arg_elimination
|
||||
++ add_function_attrs
|
||||
++ add_function_inlining
|
||||
++ add_global_dce
|
||||
++ add_global_optimizer
|
||||
++ add_ipc_propagation
|
||||
++ add_prune_eh
|
||||
++ add_ipsccp
|
||||
++ add_internalize
|
||||
++ add_strip_dead_prototypes
|
||||
++ add_strip_symbols
|
||||
++ PassManager.run_module m
|
||||
++ PassManager.dispose);
|
||||
|
||||
TargetData.dispose td
|
||||
|
||||
|
||||
(*===-- Driver ------------------------------------------------------------===*)
|
||||
|
||||
let _ =
|
||||
suite "transforms" test_transforms;
|
||||
dispose_module m
|
Loading…
Reference in New Issue
Block a user