summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Zotov <whitequark@whitequark.org>2014-08-03 23:54:22 +0000
committerPeter Zotov <whitequark@whitequark.org>2014-08-03 23:54:22 +0000
commit454b85606e434d19f6f1e56c1781d2681f50aa62 (patch)
treefc428fa7540dac926f7609944ce6f12304f1e5d7
parentf9aa882ca18c0c67b72a73c4bc1e97ab6c1634ae (diff)
downloadbcm5719-llvm-454b85606e434d19f6f1e56c1781d2681f50aa62.tar.gz
bcm5719-llvm-454b85606e434d19f6f1e56c1781d2681f50aa62.zip
[OCaml] Add Llvm.{string_of_const,const_element}.
llvm-svn: 214677
-rw-r--r--llvm/bindings/ocaml/llvm/llvm.ml2
-rw-r--r--llvm/bindings/ocaml/llvm/llvm.mli9
-rw-r--r--llvm/bindings/ocaml/llvm/llvm_ocaml.c25
-rw-r--r--llvm/test/Bindings/Ocaml/vmcore.ml6
4 files changed, 40 insertions, 2 deletions
diff --git a/llvm/bindings/ocaml/llvm/llvm.ml b/llvm/bindings/ocaml/llvm/llvm.ml
index 39875a5ed48..a52bf004e59 100644
--- a/llvm/bindings/ocaml/llvm/llvm.ml
+++ b/llvm/bindings/ocaml/llvm/llvm.ml
@@ -479,6 +479,8 @@ external const_named_struct : lltype -> llvalue array -> llvalue
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"
(*--... Constant expressions ...............................................--*)
external align_of : lltype -> llvalue = "LLVMAlignOf"
diff --git a/llvm/bindings/ocaml/llvm/llvm.mli b/llvm/bindings/ocaml/llvm/llvm.mli
index f5f5b53e84d..adb87ef1170 100644
--- a/llvm/bindings/ocaml/llvm/llvm.mli
+++ b/llvm/bindings/ocaml/llvm/llvm.mli
@@ -841,7 +841,6 @@ val const_float : lltype -> float -> llvalue
[ty] and value [n]. See the method [llvm::ConstantFP::get]. *)
val const_float_of_string : lltype -> string -> llvalue
-
(** {7 Operations on composite constants} *)
(** [const_string c s] returns the constant [i8] array with the values of the
@@ -887,6 +886,14 @@ val const_packed_struct : llcontext -> llvalue array -> llvalue
values [elts]. See the method [llvm::ConstantVector::get]. *)
val const_vector : llvalue array -> llvalue
+(** [string_of_const c] returns [Some str] if [c] is a string constant,
+ 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
+
(** {7 Constant expressions} *)
diff --git a/llvm/bindings/ocaml/llvm/llvm_ocaml.c b/llvm/bindings/ocaml/llvm/llvm_ocaml.c
index 2044856ef2d..3ec76835696 100644
--- a/llvm/bindings/ocaml/llvm/llvm_ocaml.c
+++ b/llvm/bindings/ocaml/llvm/llvm_ocaml.c
@@ -782,6 +782,31 @@ CAMLprim LLVMValueRef llvm_const_vector(value ElementVals) {
Wosize_val(ElementVals));
}
+/* llvalue -> string option */
+CAMLprim value llvm_string_of_const(LLVMValueRef Const) {
+ const char *S;
+ size_t Len;
+ CAMLparam0();
+ CAMLlocal2(Option, Str);
+
+ if(LLVMIsAConstantDataSequential(Const) && LLVMIsConstantString(Const)) {
+ S = LLVMGetAsString(Const, &Len);
+ Str = caml_alloc_string(Len);
+ memcpy(String_val(Str), S, Len);
+
+ Option = alloc(1, 0);
+ Field(Option, 0) = Str;
+ CAMLreturn(Option);
+ } else {
+ CAMLreturn(Val_int(0));
+ }
+}
+
+/* llvalue -> int -> llvalue */
+CAMLprim LLVMValueRef llvm_const_element(LLVMValueRef Const, value N) {
+ return LLVMGetElementAsConstant(Const, Int_val(N));
+}
+
/*--... Constant expressions ...............................................--*/
/* Icmp.t -> llvalue -> llvalue -> llvalue */
diff --git a/llvm/test/Bindings/Ocaml/vmcore.ml b/llvm/test/Bindings/Ocaml/vmcore.ml
index 53e0553b0d5..ea9129497f3 100644
--- a/llvm/test/Bindings/Ocaml/vmcore.ml
+++ b/llvm/test/Bindings/Ocaml/vmcore.ml
@@ -125,6 +125,7 @@ let test_constants () =
let c = const_int_of_string i32_type "-1" 10 in
ignore (define_global "const_int_string" c m);
insist (i32_type = type_of c);
+ insist (None = (string_of_const c));
if Sys.word_size = 64; then begin
group "long int";
@@ -138,6 +139,7 @@ let test_constants () =
let c = const_string context "cruel\000world" in
ignore (define_global "const_string" c m);
insist ((array_type i8_type 11) = type_of c);
+ insist ((Some "cruel\000world") = (string_of_const c));
(* CHECK: const_stringz{{.*}}"hi\00again\00"
*)
@@ -175,7 +177,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));
+
(* CHECK: const_vector{{.*}}<i16 1, i16 2{{.*}}>
*)
group "vector";
OpenPOWER on IntegriCloud