From 1598b84403355fff2fa531135dbf5818587a2bfe Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 18 Sep 2018 13:35:39 +0000 Subject: [PATCH] [OCaml] Add OCaml API for LLVMGetIndices Summary: This patch adds a thin wrapper around LLVMGetNumIndices and LLVMGetIndices to return the indices of ExtractValue or InsertValue instructions as an OCaml array. It has not seemed to be necessary to expose LLVMGetNumIndices separately. Reviewers: whitequark Reviewed By: whitequark Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D52207 llvm-svn: 342474 --- bindings/ocaml/llvm/llvm.ml | 1 + bindings/ocaml/llvm/llvm.mli | 5 +++++ bindings/ocaml/llvm/llvm_ocaml.c | 13 +++++++++++++ 3 files changed, 19 insertions(+) diff --git a/bindings/ocaml/llvm/llvm.ml b/bindings/ocaml/llvm/llvm.ml index 2d2f1ca6aed..5612fae69ff 100644 --- a/bindings/ocaml/llvm/llvm.ml +++ b/bindings/ocaml/llvm/llvm.ml @@ -538,6 +538,7 @@ external operand : llvalue -> int -> llvalue = "llvm_operand" external operand_use : llvalue -> int -> lluse = "llvm_operand_use" external set_operand : llvalue -> int -> llvalue -> unit = "llvm_set_operand" external num_operands : llvalue -> int = "llvm_num_operands" +external indices : llvalue -> int array = "llvm_indices" (*--... Operations on constants of (mostly) any type .......................--*) external is_constant : llvalue -> bool = "llvm_is_constant" diff --git a/bindings/ocaml/llvm/llvm.mli b/bindings/ocaml/llvm/llvm.mli index caaac36ed18..97b6a695fa2 100644 --- a/bindings/ocaml/llvm/llvm.mli +++ b/bindings/ocaml/llvm/llvm.mli @@ -814,6 +814,11 @@ val set_operand : llvalue -> int -> llvalue -> unit val num_operands : llvalue -> int +(** [indices i] returns the indices for the ExtractValue or InsertValue + instruction [i]. + See the [llvm::getIndices] methods. *) +val indices : llvalue -> int array + (** {7 Operations on constants of (mostly) any type} *) (** [is_constant v] returns [true] if the value [v] is a constant, [false] diff --git a/bindings/ocaml/llvm/llvm_ocaml.c b/bindings/ocaml/llvm/llvm_ocaml.c index 477da9a0090..c637941d81d 100644 --- a/bindings/ocaml/llvm/llvm_ocaml.c +++ b/bindings/ocaml/llvm/llvm_ocaml.c @@ -732,6 +732,19 @@ CAMLprim value llvm_num_operands(LLVMValueRef V) { return Val_int(LLVMGetNumOperands(V)); } +/* llvalue -> int array */ +CAMLprim value llvm_indices(LLVMValueRef Instr) { + CAMLparam0(); + CAMLlocal1(indices); + unsigned n = LLVMGetNumIndices(Instr); + const unsigned *Indices = LLVMGetIndices(Instr); + indices = caml_alloc(n, 0); + for (unsigned i = 0; i < n; i++) { + Op_val(indices)[i] = Val_int(Indices[i]); + } + CAMLreturn(indices); +} + /*--... Operations on constants of (mostly) any type .......................--*/ /* llvalue -> bool */