mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 23:32:58 +00:00
[OCaml] Add Llvm.{string_of_const,const_element}.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214677 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5f3f0620f6
commit
0980da373c
@ -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"
|
||||
|
@ -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} *)
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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";
|
||||
|
Loading…
x
Reference in New Issue
Block a user