[OCaml] Move Llvm.clone_module to its own Llvm_transform_utils module.

This way most code won't link this (substantially large) library,
if compiled statically with LLVM.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223072 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Peter Zotov 2014-12-01 19:50:39 +00:00
parent a0a26f222b
commit 787a41926a
15 changed files with 117 additions and 7 deletions

View File

@ -1,7 +1,7 @@
add_ocaml_library(llvm
OCAML llvm
C llvm_ocaml
LLVM core transformutils support)
LLVM core support)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/META.llvm.in"

View File

@ -61,6 +61,14 @@ package "scalar_opts" (
archive(native) = "llvm_scalar_opts.cmxa"
)
package "transform_utils" (
requires = "llvm"
version = "@PACKAGE_VERSION@"
description = "Transform utilities for LLVM"
archive(byte) = "llvm_transform_utils.cma"
archive(native) = "llvm_transform_utils.cmxa"
)
package "vectorize" (
requires = "llvm"
version = "@PACKAGE_VERSION@"

View File

@ -13,7 +13,7 @@
LEVEL := ../../..
LIBRARYNAME := llvm
UsedComponents := core transformutils
UsedComponents := core
UsedOcamlLibs := llvm
ExtraLibs := -lstdc++

View File

@ -313,7 +313,6 @@ external mdkind_id : llcontext -> string -> llmdkind = "llvm_mdkind_id"
(*===-- Modules -----------------------------------------------------------===*)
external create_module : llcontext -> string -> llmodule = "llvm_create_module"
external dispose_module : llmodule -> unit = "llvm_dispose_module"
external clone_module : llmodule -> llmodule = "LLVMCloneModule"
external target_triple: llmodule -> string
= "llvm_target_triple"
external set_target_triple: string -> llmodule -> unit

View File

@ -431,9 +431,6 @@ val create_module : llcontext -> string -> llmodule
[llvm::Module::~Module]. *)
val dispose_module : llmodule -> unit
(** [clone_module m] returns an exact copy of module [m]. *)
val clone_module : llmodule -> llmodule
(** [target_triple m] is the target specifier for the module [m], something like
[i686-apple-darwin8]. See the method [llvm::Module::getTargetTriple]. *)
val target_triple: llmodule -> string

View File

@ -1,4 +1,5 @@
add_subdirectory(ipo)
add_subdirectory(passmgr_builder)
add_subdirectory(scalar_opts)
add_subdirectory(utils)
add_subdirectory(vectorize)

View File

@ -8,7 +8,7 @@
##===----------------------------------------------------------------------===##
LEVEL := ../../..
DIRS = scalar_opts ipo vectorize passmgr_builder
DIRS = ipo passmgr_builder scalar_opts utils vectorize
ocamldoc:
$(Verb) for i in $(DIRS) ; do \

View File

@ -0,0 +1,5 @@
add_ocaml_library(llvm_transform_utils
OCAML llvm_transform_utils
OCAMLDEP llvm
C transform_utils_ocaml
LLVM transformutils)

View File

@ -0,0 +1,19 @@
##===- bindings/ocaml/transforms/utils/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_vectorize interface.
#
##===----------------------------------------------------------------------===##
LEVEL := ../../../..
LIBRARYNAME := llvm_transform_utils
UsedComponents := transformutils
UsedOcamlInterfaces := llvm
include ../../Makefile.ocaml

View File

@ -0,0 +1,10 @@
(*===-- llvm_transform_utils.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 clone_module : Llvm.llmodule -> Llvm.llmodule = "llvm_clone_module"

View File

@ -0,0 +1,17 @@
(*===-- llvm_transform_utils.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.
*
*===----------------------------------------------------------------------===*)
(** Transform Utilities.
This interface provides an OCaml API for LLVM transform utilities, the
classes in the [LLVMTransformUtils] library. *)
(** [clone_module m] returns an exact copy of module [m].
See the [llvm::CloneModule] function. *)
external clone_module : Llvm.llmodule -> Llvm.llmodule = "llvm_clone_module"

View File

@ -0,0 +1,31 @@
/*===-- vectorize_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/Core.h"
#include "caml/mlvalues.h"
#include "caml/misc.h"
/*
* Do not move directly into external. This function is here to pull in
* -lLLVMTransformUtils, which would otherwise be not linked on static builds,
* as ld can't see the reference from OCaml code.
*/
/* llmodule -> llmodule */
CAMLprim LLVMModuleRef llvm_clone_module(LLVMModuleRef M) {
return LLVMCloneModule(M);
}

View File

@ -120,6 +120,7 @@ if( NOT uses_ocaml LESS 0 )
ocaml_llvm_ipo
ocaml_llvm_passmgr_builder
ocaml_llvm_scalar_opts
ocaml_llvm_transform_utils
ocaml_llvm_vectorize
)

View File

@ -0,0 +1,21 @@
(* RUN: cp %s %T/transform_utils.ml
* RUN: %ocamlc -g -warn-error A -package llvm.transform_utils -linkpkg %T/transform_utils.ml -o %t
* RUN: %t
* RUN: %ocamlopt -g -warn-error A -package llvm.transform_utils -linkpkg %T/transform_utils.ml -o %t
* RUN: %t
* XFAIL: vg_leak
*)
open Llvm
open Llvm_transform_utils
let context = global_context ()
let test_clone_module () =
let m = create_module context "mod" in
let m' = clone_module m in
if m == m' then failwith "m == m'";
if string_of_llmodule m <> string_of_llmodule m' then failwith "string_of m <> m'"
let () =
test_clone_module ()

View File

@ -82,6 +82,7 @@ if(TARGET ocaml_llvm)
ocaml_llvm_ipo
ocaml_llvm_passmgr_builder
ocaml_llvm_scalar_opts
ocaml_llvm_transform_utils
ocaml_llvm_vectorize
)
endif()