From 1ae6135fa37eb061499d079b9b33dc82dcc1283f Mon Sep 17 00:00:00 2001 From: Gordon Henriksen Date: Wed, 12 Dec 2007 01:04:30 +0000 Subject: [PATCH] Add (very basic) bindings for ModuleProvider. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44899 91177308-0d34-0410-b5e6-96231b3b80d8 --- bindings/ocaml/llvm/llvm.ml | 8 ++++++++ bindings/ocaml/llvm/llvm.mli | 17 +++++++++++++++++ bindings/ocaml/llvm/llvm_ocaml.c | 8 ++++++++ include/llvm-c/BitReader.h | 7 +++++++ include/llvm-c/Core.h | 27 +++++++++++++++++++++++++++ lib/VMCore/Core.cpp | 14 ++++++++++++++ test/Bindings/Ocaml/vmcore.ml | 9 +++++++++ 7 files changed, 90 insertions(+) diff --git a/bindings/ocaml/llvm/llvm.ml b/bindings/ocaml/llvm/llvm.ml index d9ef2d3af37..6ede17978bf 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 02bb58ca6c7..2bc3e1a27c8 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 342d890e747..f9d7e6f4780 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 edd5ffa3f12..ba77988a743 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 d3308eff638..696ef6a168b 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(B); } + + /* Opaque module provider conversions. + */ + inline ModuleProvider *unwrap(LLVMModuleProviderRef P) { + return reinterpret_cast(P); + } + + inline LLVMModuleProviderRef wrap(ModuleProvider *P) { + return reinterpret_cast(P); + } } #endif /* !defined(__cplusplus) */ diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index 2f0053a2f13..b910cf15011 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 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 f17693258b4..8bea6d23a9c 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