mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Add support for global variables in an address space for llvm-c and ocaml.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97377 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -371,8 +371,14 @@ external set_global_constant : bool -> llvalue -> unit
|
||||
(*--... Operations on global variables .....................................--*)
|
||||
external declare_global : lltype -> string -> llmodule -> llvalue
|
||||
= "llvm_declare_global"
|
||||
external declare_qualified_global : lltype -> string -> int -> llmodule ->
|
||||
llvalue
|
||||
= "llvm_declare_qualified_global"
|
||||
external define_global : string -> llvalue -> llmodule -> llvalue
|
||||
= "llvm_define_global"
|
||||
external define_qualified_global : string -> llvalue -> int -> llmodule ->
|
||||
llvalue
|
||||
= "llvm_define_qualified_global"
|
||||
external lookup_global : string -> llmodule -> llvalue option
|
||||
= "llvm_lookup_global"
|
||||
external delete_global : llvalue -> unit = "llvm_delete_global"
|
||||
|
@@ -1003,19 +1003,35 @@ external set_alignment : int -> llvalue -> unit = "llvm_set_alignment"
|
||||
(** {7 Operations on global variables} *)
|
||||
|
||||
(** [declare_global ty name m] returns a new global variable of type [ty] and
|
||||
with name [name] in module [m]. If such a global variable already exists,
|
||||
it is returned. If the type of the existing global differs, then a bitcast
|
||||
to [ty] is returned. *)
|
||||
with name [name] in module [m] in the default address space (0). If such a
|
||||
global variable already exists, it is returned. If the type of the existing
|
||||
global differs, then a bitcast to [ty] is returned. *)
|
||||
external declare_global : lltype -> string -> llmodule -> llvalue
|
||||
= "llvm_declare_global"
|
||||
|
||||
(** [declare_qualified_global ty name as m] returns a new global variable of
|
||||
type [ty] and with name [name] in module [m] in the address space [as]. If
|
||||
such a global variable already exists, it is returned. If the type of the
|
||||
existing global differs, then a bitcast to [ty] is returned. *)
|
||||
external declare_qualified_global : lltype -> string -> int -> llmodule ->
|
||||
llvalue
|
||||
= "llvm_declare_qualified_global"
|
||||
|
||||
(** [define_global name init m] returns a new global with name [name] and
|
||||
initializer [init] in module [m]. If the named global already exists, it is
|
||||
renamed.
|
||||
initializer [init] in module [m] in the default address space (0). If the
|
||||
named global already exists, it is renamed.
|
||||
See the constructor of [llvm::GlobalVariable]. *)
|
||||
external define_global : string -> llvalue -> llmodule -> llvalue
|
||||
= "llvm_define_global"
|
||||
|
||||
(** [define_qualified_global name init as m] returns a new global with name
|
||||
[name] and initializer [init] in module [m] in the address space [as]. If
|
||||
the named global already exists, it is renamed.
|
||||
See the constructor of [llvm::GlobalVariable]. *)
|
||||
external define_qualified_global : string -> llvalue -> int -> llmodule ->
|
||||
llvalue
|
||||
= "llvm_define_qualified_global"
|
||||
|
||||
(** [lookup_global name m] returns [Some g] if a global variable with name
|
||||
[name] exists in module [m]. If no such global exists, returns [None].
|
||||
See the [llvm::GlobalVariable] constructor. *)
|
||||
|
@@ -697,6 +697,20 @@ CAMLprim LLVMValueRef llvm_declare_global(LLVMTypeRef Ty, value Name,
|
||||
return LLVMAddGlobal(M, Ty, String_val(Name));
|
||||
}
|
||||
|
||||
/* lltype -> string -> int -> llmodule -> llvalue */
|
||||
CAMLprim LLVMValueRef llvm_declare_qualified_global(LLVMTypeRef Ty, value Name,
|
||||
value AddressSpace,
|
||||
LLVMModuleRef M) {
|
||||
LLVMValueRef GlobalVar;
|
||||
if ((GlobalVar = LLVMGetNamedGlobal(M, String_val(Name)))) {
|
||||
if (LLVMGetElementType(LLVMTypeOf(GlobalVar)) != Ty)
|
||||
return LLVMConstBitCast(GlobalVar,
|
||||
LLVMPointerType(Ty, Int_val(AddressSpace)));
|
||||
return GlobalVar;
|
||||
}
|
||||
return LLVMAddGlobal(M, Ty, String_val(Name));
|
||||
}
|
||||
|
||||
/* string -> llmodule -> llvalue option */
|
||||
CAMLprim value llvm_lookup_global(value Name, LLVMModuleRef M) {
|
||||
CAMLparam1(Name);
|
||||
@@ -718,6 +732,19 @@ CAMLprim LLVMValueRef llvm_define_global(value Name, LLVMValueRef Initializer,
|
||||
return GlobalVar;
|
||||
}
|
||||
|
||||
/* string -> llvalue -> int -> llmodule -> llvalue */
|
||||
CAMLprim LLVMValueRef llvm_define_qualified_global(value Name,
|
||||
LLVMValueRef Initializer,
|
||||
value AddressSpace,
|
||||
LLVMModuleRef M) {
|
||||
LLVMValueRef GlobalVar = LLVMAddGlobalInAddressSpace(M,
|
||||
LLVMTypeOf(Initializer),
|
||||
String_val(Name),
|
||||
Int_val(AddressSpace));
|
||||
LLVMSetInitializer(GlobalVar, Initializer);
|
||||
return GlobalVar;
|
||||
}
|
||||
|
||||
/* llvalue -> unit */
|
||||
CAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
|
||||
LLVMDeleteGlobal(GlobalVar);
|
||||
|
Reference in New Issue
Block a user