Add (very basic) bindings for ModuleProvider.
authorGordon Henriksen <gordonhenriksen@mac.com>
Wed, 12 Dec 2007 01:04:30 +0000 (01:04 +0000)
committerGordon Henriksen <gordonhenriksen@mac.com>
Wed, 12 Dec 2007 01:04:30 +0000 (01:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44899 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/ocaml/llvm/llvm.ml
bindings/ocaml/llvm/llvm.mli
bindings/ocaml/llvm/llvm_ocaml.c
include/llvm-c/BitReader.h
include/llvm-c/Core.h
lib/VMCore/Core.cpp
test/Bindings/Ocaml/vmcore.ml

index d9ef2d3af373b34006c84dec3e0bccebb81bab21..6ede17978bff2a418ca51334cf3bb986fbd42883 100644 (file)
@@ -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.   *)
 
index 02bb58ca6c72ab96cda16ba2a30c2a6472164244..2bc3e1a27c85ae93aaf2f3d79c671fb88e53b7c1 100644 (file)
@@ -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"
index 342d890e7473996bab22869c489866ef2ac4f3fc..f9d7e6f4780f5e6c8201c05dace0e8af26fd2d05 100644 (file)
@@ -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;
+}
index edd5ffa3f12fb6abfe1a9c372b5d6bbddbd9bdf3..ba77988a74381186bf193c35aafee2fdae1ec3cd 100644 (file)
@@ -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);
 
index d3308eff638343fb933ee672f18f5def95dd147b..696ef6a168b1e347dd19c4d52979e719e6b7b1c4 100644 (file)
@@ -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) */
index 2f0053a2f137e0080f4f0a1e9ace477c412d5cd8..b910cf1501160e6f158d34b2d7fff36fe02da090 100644 (file)
@@ -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);
+}
+
index f17693258b4a4a2d393149f268304784edc23a8e..8bea6d23a9c920c3436774e4c7958d3b669659d4 100644 (file)
@@ -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