mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-23 19:59:48 +00:00
C and Objective Caml bindings for several scalar transforms.
Patch originally by Erick Tryzelaar, but has been modified somewhat. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48419 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
395b414906
commit
41ba1546eb
@ -8,7 +8,7 @@
|
||||
##===----------------------------------------------------------------------===##
|
||||
|
||||
LEVEL := ../..
|
||||
DIRS = llvm bitreader bitwriter analysis executionengine
|
||||
DIRS = llvm bitreader bitwriter analysis executionengine transforms
|
||||
ExtraMakefiles = $(PROJ_OBJ_DIR)/Makefile.ocaml
|
||||
|
||||
ocamldoc:
|
||||
|
13
bindings/ocaml/transforms/Makefile
Normal file
13
bindings/ocaml/transforms/Makefile
Normal file
@ -0,0 +1,13 @@
|
||||
##===- bindings/ocaml/transforms/Makefile ------------------*- Makefile -*-===##
|
||||
#
|
||||
# The LLVM Compiler Infrastructure
|
||||
#
|
||||
# This file is distributed under the University of Illinois Open Source
|
||||
# License. See LICENSE.TXT for details.
|
||||
#
|
||||
##===----------------------------------------------------------------------===##
|
||||
|
||||
LEVEL := ../../..
|
||||
DIRS = scalar
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
20
bindings/ocaml/transforms/scalar/Makefile
Normal file
20
bindings/ocaml/transforms/scalar/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_scalar_opts
|
||||
DONT_BUILD_RELINKED := 1
|
||||
UsedComponents := scalaropts
|
||||
UsedOcamlInterfaces := llvm
|
||||
|
||||
include ../../Makefile.ocaml
|
24
bindings/ocaml/transforms/scalar/llvm_scalar_opts.ml
Normal file
24
bindings/ocaml/transforms/scalar/llvm_scalar_opts.ml
Normal file
@ -0,0 +1,24 @@
|
||||
(*===-- llvm_scalar_opts.ml - 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.
|
||||
*
|
||||
*===----------------------------------------------------------------------===*)
|
||||
|
||||
external add_constant_propagation : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_constant_propagation"
|
||||
external add_instruction_combining : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_instruction_combining"
|
||||
external add_reassociation : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_reassociation"
|
||||
external add_gvn : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_gvn"
|
||||
external add_cfg_simplification : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_cfg_simplification"
|
38
bindings/ocaml/transforms/scalar/llvm_scalar_opts.mli
Normal file
38
bindings/ocaml/transforms/scalar/llvm_scalar_opts.mli
Normal file
@ -0,0 +1,38 @@
|
||||
(*===-- llvm_scalar_opts.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.
|
||||
*
|
||||
*===----------------------------------------------------------------------===*)
|
||||
|
||||
(** Scalar Transforms.
|
||||
|
||||
This interface provides an ocaml API for LLVM scalar transforms, the
|
||||
classes in the [LLVMScalarOpts] library. *)
|
||||
|
||||
(** See the [llvm::createConstantPropogationPass] function. *)
|
||||
external add_constant_propagation : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_constant_propagation"
|
||||
|
||||
(** See the [llvm::createInstructionCombiningPass] function. *)
|
||||
external add_instruction_combining : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_instruction_combining"
|
||||
|
||||
(** See the [llvm::createReassociatePass] function. *)
|
||||
external add_reassociation : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_reassociation"
|
||||
|
||||
(** See the [llvm::createGVNPass] function. *)
|
||||
external add_gvn : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_gvn"
|
||||
|
||||
(** See the [llvm::createCFGSimplificationPass] function. *)
|
||||
external add_cfg_simplification : [<Llvm.PassManager.any] Llvm.PassManager.t
|
||||
-> unit
|
||||
= "llvm_add_cfg_simplification"
|
50
bindings/ocaml/transforms/scalar/scalar_opts_ocaml.c
Normal file
50
bindings/ocaml/transforms/scalar/scalar_opts_ocaml.c
Normal file
@ -0,0 +1,50 @@
|
||||
/*===-- scalar_opts_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/Scalar.h"
|
||||
#include "caml/mlvalues.h"
|
||||
#include "caml/misc.h"
|
||||
|
||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_constant_propagation(LLVMPassManagerRef PM) {
|
||||
LLVMAddConstantPropagationPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_instruction_combining(LLVMPassManagerRef PM) {
|
||||
LLVMAddInstructionCombiningPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_reassociation(LLVMPassManagerRef PM) {
|
||||
LLVMAddReassociatePass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_gvn(LLVMPassManagerRef PM) {
|
||||
LLVMAddGVNPass(PM);
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* [<Llvm.PassManager.any] Llvm.PassManager.t -> unit */
|
||||
CAMLprim value llvm_add_cfg_simplification(LLVMPassManagerRef PM) {
|
||||
LLVMAddCFGSimplificationPass(PM);
|
||||
return Val_unit;
|
||||
}
|
47
include/llvm-c/Transforms/Scalar.h
Normal file
47
include/llvm-c/Transforms/Scalar.h
Normal file
@ -0,0 +1,47 @@
|
||||
/*===-- Scalar.h - Scalar Transformation Library C Interface ----*- C++ -*-===*\
|
||||
|* *|
|
||||
|* The LLVM Compiler Infrastructure *|
|
||||
|* *|
|
||||
|* This file is distributed under the University of Illinois Open Source *|
|
||||
|* License. See LICENSE.TXT for details. *|
|
||||
|* *|
|
||||
|*===----------------------------------------------------------------------===*|
|
||||
|* *|
|
||||
|* This header declares the C interface to libLLVMScalarOpts.a, which *|
|
||||
|* implements various scalar transformations of the LLVM IR. *|
|
||||
|* *|
|
||||
|* Many exotic languages can interoperate with C code but have a harder time *|
|
||||
|* with C++ due to name mangling. So in addition to C, this interface enables *|
|
||||
|* tools written in such languages. *|
|
||||
|* *|
|
||||
\*===----------------------------------------------------------------------===*/
|
||||
|
||||
#ifndef LLVM_C_TRANSFORMS_SCALAR_H
|
||||
#define LLVM_C_TRANSFORMS_SCALAR_H
|
||||
|
||||
#include "llvm-c/Core.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** See llvm::createConstantPropagationPass function. */
|
||||
void LLVMAddConstantPropagationPass(LLVMPassManagerRef PM);
|
||||
|
||||
/** See llvm::createInstructionCombiningPass function. */
|
||||
void LLVMAddInstructionCombiningPass(LLVMPassManagerRef PM);
|
||||
|
||||
/** See llvm::createReassociatePass function. */
|
||||
void LLVMAddReassociatePass(LLVMPassManagerRef PM);
|
||||
|
||||
/** See llvm::createGVNPass function. */
|
||||
void LLVMAddGVNPass(LLVMPassManagerRef PM);
|
||||
|
||||
/** See llvm::createCFGSimplificationPass function. */
|
||||
void LLVMAddCFGSimplificationPass(LLVMPassManagerRef PM);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* defined(__cplusplus) */
|
||||
|
||||
#endif
|
39
lib/Transforms/Scalar/Scalar.cpp
Normal file
39
lib/Transforms/Scalar/Scalar.cpp
Normal file
@ -0,0 +1,39 @@
|
||||
//===-- Scalar.cpp --------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements the C bindings for libLLVMScalarOpts.a, which implements
|
||||
// several scalar transformations over the LLVM intermediate representation.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm-c/Transforms/Scalar.h"
|
||||
#include "llvm/PassManager.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
void LLVMAddConstantPropagationPass(LLVMPassManagerRef PM) {
|
||||
unwrap(PM)->add(createConstantPropagationPass());
|
||||
}
|
||||
|
||||
void LLVMAddInstructionCombiningPass(LLVMPassManagerRef PM) {
|
||||
unwrap(PM)->add(createInstructionCombiningPass());
|
||||
}
|
||||
|
||||
void LLVMAddReassociatePass(LLVMPassManagerRef PM) {
|
||||
unwrap(PM)->add(createReassociatePass());
|
||||
}
|
||||
|
||||
void LLVMAddGVNPass(LLVMPassManagerRef PM) {
|
||||
unwrap(PM)->add(createGVNPass());
|
||||
}
|
||||
|
||||
void LLVMAddCFGSimplificationPass(LLVMPassManagerRef PM) {
|
||||
unwrap(PM)->add(createCFGSimplificationPass());
|
||||
}
|
50
test/Bindings/Ocaml/scalar_opts.ml
Normal file
50
test/Bindings/Ocaml/scalar_opts.ml
Normal file
@ -0,0 +1,50 @@
|
||||
(* RUN: %ocamlc -warn-error A llvm.cma llvm_scalar_opts.cma %s -o %t
|
||||
*)
|
||||
|
||||
(* Note: It takes several seconds for ocamlc 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_scalar_opts
|
||||
|
||||
|
||||
(* Tiny unit test framework - really just to help find which line is busted *)
|
||||
let suite name f =
|
||||
prerr_endline (name ^ ":");
|
||||
f ()
|
||||
|
||||
|
||||
(*===-- Fixture -----------------------------------------------------------===*)
|
||||
|
||||
let filename = Sys.argv.(1)
|
||||
let m = create_module filename
|
||||
let mp = ModuleProvider.create m
|
||||
|
||||
|
||||
(*===-- Transforms --------------------------------------------------------===*)
|
||||
|
||||
let test_transforms () =
|
||||
let (++) x f = ignore (f x); x in
|
||||
|
||||
let fty = function_type void_type [| |] in
|
||||
let fn = define_function "fn" fty m in
|
||||
ignore (build_ret_void (builder_at_end (entry_block fn)));
|
||||
|
||||
ignore (PassManager.create_function mp
|
||||
(* ++ add_instruction_combining Requires target data. *)
|
||||
++ add_reassociation
|
||||
++ add_gvn
|
||||
++ add_cfg_simplification
|
||||
++ add_constant_propagation
|
||||
++ PassManager.initialize
|
||||
++ PassManager.run_function fn
|
||||
++ PassManager.finalize
|
||||
++ PassManager.dispose)
|
||||
|
||||
|
||||
(*===-- Driver ------------------------------------------------------------===*)
|
||||
|
||||
let _ =
|
||||
suite "transforms" test_transforms;
|
||||
ModuleProvider.dispose mp
|
Loading…
Reference in New Issue
Block a user