summaryrefslogtreecommitdiffstats
path: root/llvm/bindings
diff options
context:
space:
mode:
authorAditya Kumar <hiraditya@msn.com>2019-10-01 03:45:09 +0000
committerAditya Kumar <hiraditya@msn.com>2019-10-01 03:45:09 +0000
commit07286cb384c48301111cdf80fc31023befc71ee6 (patch)
treeae056f72568a24ba6fe7702c281e291f9c17cf20 /llvm/bindings
parentfdea5e02ce598be1cdda0259381039e8b5d6cba5 (diff)
downloadbcm5719-llvm-07286cb384c48301111cdf80fc31023befc71ee6.tar.gz
bcm5719-llvm-07286cb384c48301111cdf80fc31023befc71ee6.zip
[OCaml] Handle nullptr in Llvm.global_initializer
LLVMGetInitializer returns nullptr in case there is no initializer. There is not much that can be done with nullptr in OCaml, not even test if it is null. Also, there does not seem to be a C or OCaml API to test if there is an initializer. So this diff changes Llvm.global_initializer to return an option. Differential Revision: https://reviews.llvm.org/D65195 Reviewed by: whitequark Authored by: kren1 llvm-svn: 373299
Diffstat (limited to 'llvm/bindings')
-rw-r--r--llvm/bindings/ocaml/llvm/llvm.ml2
-rw-r--r--llvm/bindings/ocaml/llvm/llvm.mli6
-rw-r--r--llvm/bindings/ocaml/llvm/llvm_ocaml.c12
3 files changed, 16 insertions, 4 deletions
diff --git a/llvm/bindings/ocaml/llvm/llvm.ml b/llvm/bindings/ocaml/llvm/llvm.ml
index f3ff600bde4..587972429f3 100644
--- a/llvm/bindings/ocaml/llvm/llvm.ml
+++ b/llvm/bindings/ocaml/llvm/llvm.ml
@@ -710,7 +710,7 @@ external define_qualified_global : string -> llvalue -> int -> llmodule ->
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
index 6e145fa44f0..5fedd57971d 100644
--- a/llvm/bindings/ocaml/llvm/llvm.mli
+++ b/llvm/bindings/ocaml/llvm/llvm.mli
@@ -1454,9 +1454,9 @@ val is_global_constant : llvalue -> bool
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
index 6af34bd9c17..abff3ee04a0 100644
--- a/llvm/bindings/ocaml/llvm/llvm_ocaml.c
+++ b/llvm/bindings/ocaml/llvm/llvm_ocaml.c
@@ -1261,6 +1261,18 @@ CAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
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) {
OpenPOWER on IntegriCloud