Skip to content

Commit

Permalink
[llvm][ocaml] Replace deprecated C functions in OCaml bindings
Browse files Browse the repository at this point in the history
Follow-up to D135524, to replace two more deprecated C functions
in the OCaml bindings. const_in_bounds_gep now accepts the source
element type as argument, and const_element has been changed into
aggregate_element, which works on a wider range of constants and
returns an option.

Differential Revision: https://reviews.llvm.org/D136914
  • Loading branch information
alan-j-hu authored and nikic committed Oct 31, 2022
1 parent d5e59e9 commit 181ede0
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 17 deletions.
7 changes: 4 additions & 3 deletions llvm/bindings/ocaml/llvm/llvm.ml
Expand Up @@ -629,7 +629,8 @@ external const_packed_struct : llcontext -> llvalue array -> llvalue
= "llvm_const_packed_struct"
external const_vector : llvalue array -> llvalue = "llvm_const_vector"
external string_of_const : llvalue -> string option = "llvm_string_of_const"
external const_element : llvalue -> int -> llvalue = "llvm_const_element"
external aggregate_element : llvalue -> int -> llvalue option
= "llvm_aggregate_element"

(*--... Constant expressions ...............................................--*)
external align_of : lltype -> llvalue = "LLVMAlignOf"
Expand Down Expand Up @@ -659,8 +660,8 @@ external const_lshr : llvalue -> llvalue -> llvalue = "LLVMConstLShr"
external const_ashr : llvalue -> llvalue -> llvalue = "LLVMConstAShr"
external const_gep : lltype -> llvalue -> llvalue array -> llvalue
= "llvm_const_gep"
external const_in_bounds_gep : llvalue -> llvalue array -> llvalue
= "llvm_const_in_bounds_gep"
external const_in_bounds_gep : lltype -> llvalue -> llvalue array -> llvalue
= "llvm_const_in_bounds_gep"
external const_trunc : llvalue -> lltype -> llvalue = "LLVMConstTrunc"
external const_sext : llvalue -> lltype -> llvalue = "LLVMConstSExt"
external const_zext : llvalue -> lltype -> llvalue = "LLVMConstZExt"
Expand Down
14 changes: 8 additions & 6 deletions llvm/bindings/ocaml/llvm/llvm.mli
Expand Up @@ -1044,9 +1044,11 @@ val const_vector : llvalue array -> llvalue
or [None] if this is not a string constant. *)
val string_of_const : llvalue -> string option

(** [const_element c] returns a constant for a specified index's element.
See the method ConstantDataSequential::getElementAsConstant. *)
val const_element : llvalue -> int -> llvalue
(** [aggregate_element c idx] returns [Some elt] where [elt] is the element of
constant aggregate [c] at the specified index [idx], or [None] if [idx] is
out of range or it's not possible to determine the element.
See the method [llvm::Constant::getAggregateElement]. *)
val aggregate_element : llvalue -> int -> llvalue option


(** {7 Constant expressions} *)
Expand Down Expand Up @@ -1169,10 +1171,10 @@ val const_ashr : llvalue -> llvalue -> llvalue
See the method [llvm::ConstantExpr::getGetElementPtr]. *)
val const_gep : lltype -> llvalue -> llvalue array -> llvalue

(** [const_in_bounds_gep pc indices] returns the constant [getElementPtr] of [pc]
with the constant integers indices from the array [indices].
(** [const_in_bounds_gep ty pc indices] returns the constant [getElementPtr] of
[pc] with the constant integers indices from the array [indices].
See the method [llvm::ConstantExpr::getInBoundsGetElementPtr]. *)
val const_in_bounds_gep : llvalue -> llvalue array -> llvalue
val const_in_bounds_gep : lltype -> llvalue -> llvalue array -> llvalue

(** [const_trunc c ty] returns the constant truncation of integer constant [c]
to the smaller integer type [ty].
Expand Down
13 changes: 7 additions & 6 deletions llvm/bindings/ocaml/llvm/llvm_ocaml.c
Expand Up @@ -968,9 +968,9 @@ value llvm_string_of_const(LLVMValueRef Const) {
return cstr_to_string_option(CStr, Len);
}

/* llvalue -> int -> llvalue */
LLVMValueRef llvm_const_element(LLVMValueRef Const, value N) {
return LLVMGetElementAsConstant(Const, Int_val(N));
/* llvalue -> int -> llvalue option */
value llvm_aggregate_element(LLVMValueRef Const, value N) {
return ptr_to_option(LLVMGetAggregateElement(Const, Int_val(N)));
}

/*--... Constant expressions ...............................................--*/
Expand All @@ -995,9 +995,10 @@ LLVMValueRef llvm_const_gep(LLVMTypeRef Ty, LLVMValueRef ConstantVal,
}

/* llvalue -> llvalue array -> llvalue */
LLVMValueRef llvm_const_in_bounds_gep(LLVMValueRef ConstantVal, value Indices) {
return LLVMConstInBoundsGEP(ConstantVal, (LLVMValueRef *)Op_val(Indices),
Wosize_val(Indices));
LLVMValueRef llvm_const_in_bounds_gep(LLVMTypeRef Ty, LLVMValueRef ConstantVal,
value Indices) {
return LLVMConstInBoundsGEP2(Ty, ConstantVal, (LLVMValueRef *)Op_val(Indices),
Wosize_val(Indices));
}

/* llvalue -> lltype -> is_signed:bool -> llvalue */
Expand Down
5 changes: 3 additions & 2 deletions llvm/test/Bindings/OCaml/core.ml
Expand Up @@ -185,8 +185,9 @@ let test_constants () =
let c = const_array i32_type [| three; four |] in
ignore (define_global "const_array" c m);
insist ((array_type i32_type 2) = (type_of c));
insist (three = (const_element c 0));
insist (four = (const_element c 1));
insist (Some three = (aggregate_element c 0));
insist (Some four = (aggregate_element c 1));
insist (None = (aggregate_element c 2));

(* CHECK: const_vector{{.*}}<i16 1, i16 2{{.*}}>
*)
Expand Down

0 comments on commit 181ede0

Please sign in to comment.