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 @@ -629,7 +629,8 @@ = "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" @@ -659,8 +660,8 @@ 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" 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 @@ -1044,9 +1044,11 @@ 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} *) @@ -1169,10 +1171,10 @@ 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]. 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 @@ -968,9 +968,9 @@ 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 ...............................................--*/ @@ -995,9 +995,10 @@ } /* 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 */ 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 @@ -185,8 +185,9 @@ 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{{.*}} *)