aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bindings/ocaml/llvm/llvm.ml8
-rw-r--r--bindings/ocaml/llvm/llvm.mli17
-rw-r--r--bindings/ocaml/llvm/llvm_ocaml.c8
-rw-r--r--include/llvm-c/BitReader.h7
-rw-r--r--include/llvm-c/Core.h27
-rw-r--r--lib/VMCore/Core.cpp14
-rw-r--r--test/Bindings/Ocaml/vmcore.ml9
7 files changed, 90 insertions, 0 deletions
diff --git a/bindings/ocaml/llvm/llvm.ml b/bindings/ocaml/llvm/llvm.ml
index d9ef2d3af3..6ede17978b 100644
--- a/bindings/ocaml/llvm/llvm.ml
+++ b/bindings/ocaml/llvm/llvm.ml
@@ -14,6 +14,7 @@ type lltypehandle
type llvalue
type llbasicblock
type llbuilder
+type llmoduleprovider
type type_kind =
Void_type
@@ -427,6 +428,13 @@ external build_shufflevector : llvalue -> llvalue -> llvalue -> string ->
llbuilder -> llvalue = "llvm_build_shufflevector"
+(*===-- Module providers --------------------------------------------------===*)
+external create_module_provider : llmodule -> llmoduleprovider
+ = "LLVMCreateModuleProviderForExistingModule"
+external dispose_module_provider : llmoduleprovider -> unit
+ = "llvm_dispose_module_provider"
+
+
(*===-- Non-Externs -------------------------------------------------------===*)
(* These functions are built using the externals, so must be declared late. *)
diff --git a/bindings/ocaml/llvm/llvm.mli b/bindings/ocaml/llvm/llvm.mli
index 02bb58ca6c..2bc3e1a27c 100644
--- a/bindings/ocaml/llvm/llvm.mli
+++ b/bindings/ocaml/llvm/llvm.mli
@@ -40,6 +40,9 @@ type llbasicblock
class. **)
type llbuilder
+(** Used to provide a module to JIT or interpreter. **)
+type llmoduleprovider
+
(** The kind of an [lltype], the result of [classify_type ty]. See the
[llvm::Type::TypeID] enumeration. **)
type type_kind =
@@ -1217,3 +1220,17 @@ external build_insertelement : llvalue -> llvalue -> llvalue -> string ->
See the method [llvm::LLVMBuilder::CreateShuffleVector]. **)
external build_shufflevector : llvalue -> llvalue -> llvalue -> string ->
llbuilder -> llvalue = "llvm_build_shufflevector"
+
+
+(*===-- Module providers --------------------------------------------------===*)
+
+(** [create_module_provider m] encapsulates [m] in a module provider and takes
+ ownership of the module. See the constructor
+ [llvm::ExistingModuleProvider::ExistingModuleProvider]. **)
+external create_module_provider : llmodule -> llmoduleprovider
+ = "LLVMCreateModuleProviderForExistingModule"
+
+(** [dispose_module_provider mp] destroys the module provider [mp] as well as
+ the contained module. **)
+external dispose_module_provider : llmoduleprovider -> unit
+ = "llvm_dispose_module_provider"
diff --git a/bindings/ocaml/llvm/llvm_ocaml.c b/bindings/ocaml/llvm/llvm_ocaml.c
index 342d890e74..f9d7e6f478 100644
--- a/bindings/ocaml/llvm/llvm_ocaml.c
+++ b/bindings/ocaml/llvm/llvm_ocaml.c
@@ -1047,3 +1047,11 @@ CAMLprim LLVMValueRef llvm_build_shufflevector(LLVMValueRef V1, LLVMValueRef V2,
return LLVMBuildShuffleVector(Builder_val(B), V1, V2, Mask, String_val(Name));
}
+
+/*===-- Module Providers --------------------------------------------------===*/
+
+/* llmoduleprovider -> unit */
+CAMLprim value llvm_dispose_module_provider(LLVMModuleProviderRef MP) {
+ LLVMDisposeModuleProvider(MP);
+ return Val_unit;
+}
diff --git a/include/llvm-c/BitReader.h b/include/llvm-c/BitReader.h
index edd5ffa3f1..ba77988a74 100644
--- a/include/llvm-c/BitReader.h
+++ b/include/llvm-c/BitReader.h
@@ -32,6 +32,13 @@ extern "C" {
int LLVMReadBitcodeFromFile(const char *Path, LLVMModuleRef *OutModule,
char **OutMessage);
+/* Reads a module from the specified path, returning a reference to a lazy
+ module provider via the OutModule parameter. Returns 0 on success. Optionally
+ returns a human-readable error message. */
+int LLVMCreateModuleProviderFromFile(const char *Path,
+ LLVMModuleProviderRef *OutMP,
+ char **OutMessage);
+
/* Disposes of the message allocated by the bitcode reader, if any. */
void LLVMDisposeBitcodeReaderMessage(char *Message);
diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h
index d3308eff63..696ef6a168 100644
--- a/include/llvm-c/Core.h
+++ b/include/llvm-c/Core.h
@@ -51,6 +51,7 @@ typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
typedef struct LLVMOpaqueValue *LLVMValueRef;
typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
+typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
typedef enum {
LLVMVoidTypeKind, /* type with no size */
@@ -489,10 +490,26 @@ LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
LLVMValueRef V2, LLVMValueRef Mask,
const char *Name);
+/*===-- Module providers --------------------------------------------------===*/
+
+/* Encapsulates the module M in a module provider, taking ownership of the
+ * module.
+ * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
+ */
+LLVMModuleProviderRef
+LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
+
+/* Destroys the module provider MP as well as the contained module.
+ * See the destructor llvm::ModuleProvider::~ModuleProvider.
+ */
+void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
+
#ifdef __cplusplus
}
namespace llvm {
+ class ModuleProvider;
+
/* Opaque module conversions
*/
inline Module *unwrap(LLVMModuleRef M) {
@@ -587,6 +604,16 @@ namespace llvm {
inline LLVMTypeHandleRef wrap(PATypeHolder *B) {
return reinterpret_cast<LLVMTypeHandleRef>(B);
}
+
+ /* Opaque module provider conversions.
+ */
+ inline ModuleProvider *unwrap(LLVMModuleProviderRef P) {
+ return reinterpret_cast<ModuleProvider*>(P);
+ }
+
+ inline LLVMModuleProviderRef wrap(ModuleProvider *P) {
+ return reinterpret_cast<LLVMModuleProviderRef>(P);
+ }
}
#endif /* !defined(__cplusplus) */
diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp
index 2f0053a2f1..b910cf1501 100644
--- a/lib/VMCore/Core.cpp
+++ b/lib/VMCore/Core.cpp
@@ -18,6 +18,7 @@
#include "llvm/DerivedTypes.h"
#include "llvm/GlobalVariable.h"
#include "llvm/TypeSymbolTable.h"
+#include "llvm/ModuleProvider.h"
#include <cassert>
using namespace llvm;
@@ -1030,3 +1031,16 @@ LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1,
return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2),
unwrap(Mask), Name));
}
+
+
+/*===-- Module providers --------------------------------------------------===*/
+
+LLVMModuleProviderRef
+LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) {
+ return wrap(new ExistingModuleProvider(unwrap(M)));
+}
+
+void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) {
+ delete unwrap(MP);
+}
+
diff --git a/test/Bindings/Ocaml/vmcore.ml b/test/Bindings/Ocaml/vmcore.ml
index f17693258b..8bea6d23a9 100644
--- a/test/Bindings/Ocaml/vmcore.ml
+++ b/test/Bindings/Ocaml/vmcore.ml
@@ -790,6 +790,14 @@ let test_builder () =
end
+(*===-- Module Provider ---------------------------------------------------===*)
+
+let test_module_provider () =
+ let m = create_module "test" in
+ let mp = create_module_provider m in
+ dispose_module_provider mp
+
+
(*===-- Writer ------------------------------------------------------------===*)
let test_writer () =
@@ -814,5 +822,6 @@ let _ =
suite "functions" test_functions;
suite "basic blocks" test_basic_blocks;
suite "builder" test_builder;
+ suite "module provider" test_module_provider;
suite "writer" test_writer;
exit !exit_status