diff --git a/llvm/bindings/ocaml/llvm/llvm.ml b/llvm/bindings/ocaml/llvm/llvm.ml --- a/llvm/bindings/ocaml/llvm/llvm.ml +++ b/llvm/bindings/ocaml/llvm/llvm.ml @@ -710,7 +710,7 @@ external lookup_global : string -> llmodule -> llvalue option = "llvm_lookup_global" external delete_global : llvalue -> unit = "llvm_delete_global" -external global_initializer : llvalue -> llvalue = "LLVMGetInitializer" +external global_initializer : llvalue -> llvalue option = "llvm_global_initializer" external set_initializer : llvalue -> llvalue -> unit = "llvm_set_initializer" external remove_initializer : llvalue -> unit = "llvm_remove_initializer" external is_thread_local : llvalue -> bool = "llvm_is_thread_local" diff --git a/llvm/bindings/ocaml/llvm/llvm.mli b/llvm/bindings/ocaml/llvm/llvm.mli --- a/llvm/bindings/ocaml/llvm/llvm.mli +++ b/llvm/bindings/ocaml/llvm/llvm.mli @@ -1454,9 +1454,9 @@ See the method [llvm::GlobalVariable::setConstant]. *) val set_global_constant : bool -> llvalue -> unit -(** [global_initializer gv] returns the initializer for the global variable - [gv]. See the method [llvm::GlobalVariable::getInitializer]. *) -val global_initializer : llvalue -> llvalue +(** [global_initializer gv] If global variable [gv] has an initializer it is returned, + otherwise returns [None]. See the method [llvm::GlobalVariable::getInitializer]. *) +val global_initializer : llvalue -> llvalue option (** [set_initializer c gv] sets the initializer for the global variable [gv] to the constant [c]. diff --git a/llvm/bindings/ocaml/llvm/llvm_ocaml.c b/llvm/bindings/ocaml/llvm/llvm_ocaml.c --- a/llvm/bindings/ocaml/llvm/llvm_ocaml.c +++ b/llvm/bindings/ocaml/llvm/llvm_ocaml.c @@ -1261,6 +1261,18 @@ return Val_unit; } +/* llvalue -> llvalue option */ +CAMLprim value llvm_global_initializer(LLVMValueRef GlobalVar) { + CAMLparam0(); + LLVMValueRef Init; + if ((Init = LLVMGetInitializer(GlobalVar))) { + value Option = alloc(1, 0); + Field(Option, 0) = (value) Init; + CAMLreturn(Option); + } + CAMLreturn(Val_int(0)); +} + /* llvalue -> llvalue -> unit */ CAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal, LLVMValueRef GlobalVar) { diff --git a/llvm/test/Bindings/OCaml/core.ml b/llvm/test/Bindings/OCaml/core.ml --- a/llvm/test/Bindings/OCaml/core.ml +++ b/llvm/test/Bindings/OCaml/core.ml @@ -540,14 +540,14 @@ set_initializer forty_two32 in insist (not (is_declaration g)); insist (not (is_declaration g2)); - insist ((global_initializer g) == (global_initializer g2)); + insist ((global_initializer g) = (global_initializer g2)); let g = define_qualified_global "QGVar02" forty_two32 3 m in let g2 = declare_qualified_global i32_type "QGVar03" 3 m ++ set_initializer forty_two32 in insist (not (is_declaration g)); insist (not (is_declaration g2)); - insist ((global_initializer g) == (global_initializer g2)); + insist ((global_initializer g) = (global_initializer g2)); end; (* CHECK: GVar04{{.*}}thread_local diff --git a/llvm/test/Bindings/OCaml/irreader.ml b/llvm/test/Bindings/OCaml/irreader.ml --- a/llvm/test/Bindings/OCaml/irreader.ml +++ b/llvm/test/Bindings/OCaml/irreader.ml @@ -38,7 +38,7 @@ let m = parse_ir context buf in match lookup_global "foo" m with | Some foo -> - insist ((global_initializer foo) = (const_int (i32_type context) 42)) + insist ((global_initializer foo) = (Some (const_int (i32_type context) 42))) | None -> failwith "global" end;