diff options
author | Erick Tryzelaar <idadesub@users.sourceforge.net> | 2009-08-16 23:37:03 +0000 |
---|---|---|
committer | Erick Tryzelaar <idadesub@users.sourceforge.net> | 2009-08-16 23:37:03 +0000 |
commit | 45d6ac2cc13f7881687c2d7f03f9b9892fd85e6e (patch) | |
tree | 837c8a8dec14edd390965b6777e880a70b6f6c9b | |
parent | e0a1bf64c9885df16bf596447d037f1c75f92637 (diff) | |
download | external_llvm-45d6ac2cc13f7881687c2d7f03f9b9892fd85e6e.zip external_llvm-45d6ac2cc13f7881687c2d7f03f9b9892fd85e6e.tar.gz external_llvm-45d6ac2cc13f7881687c2d7f03f9b9892fd85e6e.tar.bz2 |
Expose creating constant ints and floats from strings to ocaml.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79214 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | bindings/ocaml/llvm/llvm.ml | 4 | ||||
-rw-r--r-- | bindings/ocaml/llvm/llvm.mli | 10 | ||||
-rw-r--r-- | bindings/ocaml/llvm/llvm_ocaml.c | 13 | ||||
-rw-r--r-- | test/Bindings/Ocaml/vmcore.ml | 12 |
4 files changed, 39 insertions, 0 deletions
diff --git a/bindings/ocaml/llvm/llvm.ml b/bindings/ocaml/llvm/llvm.ml index ed3e186..63c7930 100644 --- a/bindings/ocaml/llvm/llvm.ml +++ b/bindings/ocaml/llvm/llvm.ml @@ -237,7 +237,11 @@ external is_undef : llvalue -> bool = "llvm_is_undef" external const_int : lltype -> int -> llvalue = "llvm_const_int" external const_of_int64 : lltype -> Int64.t -> bool -> llvalue = "llvm_const_of_int64" +external const_int_of_string : lltype -> string -> int -> llvalue + = "llvm_const_int_of_string" external const_float : lltype -> float -> llvalue = "llvm_const_float" +external const_float_of_string : lltype -> string -> llvalue + = "llvm_const_float_of_string" (*--... Operations on composite constants ..................................--*) external const_string : string -> llvalue = "llvm_const_string" diff --git a/bindings/ocaml/llvm/llvm.mli b/bindings/ocaml/llvm/llvm.mli index f7fcfd9..cdcbdae 100644 --- a/bindings/ocaml/llvm/llvm.mli +++ b/bindings/ocaml/llvm/llvm.mli @@ -469,10 +469,20 @@ external const_int : lltype -> int -> llvalue = "llvm_const_int" external const_of_int64 : lltype -> Int64.t -> bool -> llvalue = "llvm_const_of_int64" +(** [const_int_of_string ty s r] returns the integer constant of type [ty] and + * value [s], with the radix [r]. See the method [llvm::ConstantInt::get]. *) +external const_int_of_string : lltype -> string -> int -> llvalue + = "llvm_const_int_of_string" + (** [const_float ty n] returns the floating point constant of type [ty] and value [n]. See the method [llvm::ConstantFP::get]. *) external const_float : lltype -> float -> llvalue = "llvm_const_float" +(** [const_float_of_string ty s] returns the floating point constant of type + [ty] and value [n]. See the method [llvm::ConstantFP::get]. *) +external const_float_of_string : lltype -> string -> llvalue + = "llvm_const_float_of_string" + (** {7 Operations on composite constants} *) diff --git a/bindings/ocaml/llvm/llvm_ocaml.c b/bindings/ocaml/llvm/llvm_ocaml.c index 88c9a23..69bd0a2 100644 --- a/bindings/ocaml/llvm/llvm_ocaml.c +++ b/bindings/ocaml/llvm/llvm_ocaml.c @@ -388,11 +388,24 @@ CAMLprim LLVMValueRef llvm_const_of_int64(LLVMTypeRef IntTy, value N, return LLVMConstInt(IntTy, Int64_val(N), Bool_val(SExt)); } +/* lltype -> string -> int -> llvalue */ +CAMLprim LLVMValueRef llvm_const_int_of_string(LLVMTypeRef IntTy, value S, + value Radix) { + return LLVMConstIntOfStringAndSize(IntTy, String_val(S), caml_string_length(S), + Int_val(Radix)); +} + /* lltype -> float -> llvalue */ CAMLprim LLVMValueRef llvm_const_float(LLVMTypeRef RealTy, value N) { return LLVMConstReal(RealTy, Double_val(N)); } +/* lltype -> string -> llvalue */ +CAMLprim LLVMValueRef llvm_const_float_of_string(LLVMTypeRef RealTy, value S) { + return LLVMConstRealOfStringAndSize(RealTy, String_val(S), + caml_string_length(S)); +} + /*--... Operations on composite constants ..................................--*/ /* string -> llvalue */ diff --git a/test/Bindings/Ocaml/vmcore.ml b/test/Bindings/Ocaml/vmcore.ml index ca15c65..c6c5e17 100644 --- a/test/Bindings/Ocaml/vmcore.ml +++ b/test/Bindings/Ocaml/vmcore.ml @@ -212,6 +212,13 @@ let test_constants () = ignore (define_global "Const03" c m); insist (i64_type = type_of c); + (* RUN: grep {ConstIntString.*i32.*-1} < %t.ll + *) + group "int string"; + let c = const_int_of_string i32_type "-1" 10 in + ignore (define_global "ConstIntString" c m); + insist (i32_type = type_of c); + (* RUN: grep {Const04.*"cruel\\\\00world"} < %t.ll *) group "string"; @@ -228,6 +235,7 @@ let test_constants () = (* RUN: grep {ConstSingle.*2.75} < %t.ll * RUN: grep {ConstDouble.*3.1459} < %t.ll + * RUN: grep {ConstDoubleString.*1.25} < %t.ll *) begin group "real"; let cs = const_float float_type 2.75 in @@ -236,6 +244,10 @@ let test_constants () = let cd = const_float double_type 3.1459 in ignore (define_global "ConstDouble" cd m); + insist (double_type = type_of cd); + + let cd = const_float_of_string double_type "1.25" in + ignore (define_global "ConstDoubleString" cd m); insist (double_type = type_of cd) end; |