Skip to content

Commit 2571a09

Browse files
kren1jberdine
authored andcommitted
[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. Reviewed By: whitequark Differential Revision: https://reviews.llvm.org/D65195
1 parent 4a8c01a commit 2571a09

File tree

5 files changed

+19
-7
lines changed

5 files changed

+19
-7
lines changed

llvm/bindings/ocaml/llvm/llvm.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ external define_qualified_global : string -> llvalue -> int -> llmodule ->
739739
external lookup_global : string -> llmodule -> llvalue option
740740
= "llvm_lookup_global"
741741
external delete_global : llvalue -> unit = "llvm_delete_global"
742-
external global_initializer : llvalue -> llvalue = "LLVMGetInitializer"
742+
external global_initializer : llvalue -> llvalue option = "llvm_global_initializer"
743743
external set_initializer : llvalue -> llvalue -> unit = "llvm_set_initializer"
744744
external remove_initializer : llvalue -> unit = "llvm_remove_initializer"
745745
external is_thread_local : llvalue -> bool = "llvm_is_thread_local"

llvm/bindings/ocaml/llvm/llvm.mli

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1504,9 +1504,9 @@ val is_global_constant : llvalue -> bool
15041504
See the method [llvm::GlobalVariable::setConstant]. *)
15051505
val set_global_constant : bool -> llvalue -> unit
15061506

1507-
(** [global_initializer gv] returns the initializer for the global variable
1508-
[gv]. See the method [llvm::GlobalVariable::getInitializer]. *)
1509-
val global_initializer : llvalue -> llvalue
1507+
(** [global_initializer gv] If global variable [gv] has an initializer it is returned,
1508+
otherwise returns [None]. See the method [llvm::GlobalVariable::getInitializer]. *)
1509+
val global_initializer : llvalue -> llvalue option
15101510

15111511
(** [set_initializer c gv] sets the initializer for the global variable
15121512
[gv] to the constant [c].

llvm/bindings/ocaml/llvm/llvm_ocaml.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,18 @@ CAMLprim value llvm_delete_global(LLVMValueRef GlobalVar) {
13341334
return Val_unit;
13351335
}
13361336

1337+
/* llvalue -> llvalue option */
1338+
CAMLprim value llvm_global_initializer(LLVMValueRef GlobalVar) {
1339+
CAMLparam0();
1340+
LLVMValueRef Init;
1341+
if ((Init = LLVMGetInitializer(GlobalVar))) {
1342+
value Option = alloc(1, 0);
1343+
Field(Option, 0) = (value) Init;
1344+
CAMLreturn(Option);
1345+
}
1346+
CAMLreturn(Val_int(0));
1347+
}
1348+
13371349
/* llvalue -> llvalue -> unit */
13381350
CAMLprim value llvm_set_initializer(LLVMValueRef ConstantVal,
13391351
LLVMValueRef GlobalVar) {

llvm/test/Bindings/OCaml/core.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,14 +548,14 @@ let test_global_variables () =
548548
set_initializer forty_two32 in
549549
insist (not (is_declaration g));
550550
insist (not (is_declaration g2));
551-
insist ((global_initializer g) == (global_initializer g2));
551+
insist ((global_initializer g) = (global_initializer g2));
552552

553553
let g = define_qualified_global "QGVar02" forty_two32 3 m in
554554
let g2 = declare_qualified_global i32_type "QGVar03" 3 m ++
555555
set_initializer forty_two32 in
556556
insist (not (is_declaration g));
557557
insist (not (is_declaration g2));
558-
insist ((global_initializer g) == (global_initializer g2));
558+
insist ((global_initializer g) = (global_initializer g2));
559559
end;
560560

561561
(* CHECK: GVar04{{.*}}thread_local

llvm/test/Bindings/OCaml/irreader.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ let test_irreader () =
3838
let m = parse_ir context buf in
3939
match lookup_global "foo" m with
4040
| Some foo ->
41-
insist ((global_initializer foo) = (const_int (i32_type context) 42))
41+
insist ((global_initializer foo) = (Some (const_int (i32_type context) 42)))
4242
| None ->
4343
failwith "global"
4444
end;

0 commit comments

Comments
 (0)