Add (very basic) bindings for ModuleProvider.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44899 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Gordon Henriksen 2007-12-12 01:04:30 +00:00
parent 772de516b6
commit 1ae6135fa3
7 changed files with 90 additions and 0 deletions

View 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. *)

View 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"

View 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;
}

View 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);

View 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) */

View 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);
}

View 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