mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
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:
parent
772de516b6
commit
1ae6135fa3
@ -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. *)
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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) */
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user