mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:40:38 +00:00
[LLVM-C] [OCaml] Expose Type::subtypes.
The C functions added are LLVMGetNumContainedTypes and LLVMGetSubtypes. The OCaml function added is Llvm.subtypes. Patch by Ekaterina Vaartis. Differential Revision: https://reviews.llvm.org/D33677 llvm-svn: 304709
This commit is contained in:
parent
f1079f20ef
commit
97186e1387
@ -459,6 +459,8 @@ external is_packed : lltype -> bool = "llvm_is_packed"
|
||||
external is_opaque : lltype -> bool = "llvm_is_opaque"
|
||||
|
||||
(*--... Operations on pointer, vector, and array types .....................--*)
|
||||
|
||||
external subtypes : lltype -> lltype array = "llvm_subtypes"
|
||||
external array_type : lltype -> int -> lltype = "llvm_array_type"
|
||||
external pointer_type : lltype -> lltype = "llvm_pointer_type"
|
||||
external qualified_pointer_type : lltype -> int -> lltype
|
||||
|
@ -658,6 +658,9 @@ val is_opaque : lltype -> bool
|
||||
|
||||
(** {7 Operations on pointer, vector, and array types} *)
|
||||
|
||||
(** [subtypes ty] returns [ty]'s subtypes *)
|
||||
val subtypes : lltype -> lltype array
|
||||
|
||||
(** [array_type ty n] returns the array type containing [n] elements of type
|
||||
[ty]. See the method [llvm::ArrayType::get]. *)
|
||||
val array_type : lltype -> int -> lltype
|
||||
|
@ -506,6 +506,20 @@ CAMLprim value llvm_is_opaque(LLVMTypeRef StructTy) {
|
||||
|
||||
/*--... Operations on array, pointer, and vector types .....................--*/
|
||||
|
||||
/* lltype -> lltype array */
|
||||
CAMLprim value llvm_subtypes(LLVMTypeRef Ty) {
|
||||
CAMLparam0();
|
||||
CAMLlocal1(Arr);
|
||||
|
||||
unsigned Size = LLVMGetNumContainedTypes(Ty);
|
||||
|
||||
Arr = caml_alloc(Size, 0);
|
||||
|
||||
LLVMGetSubtypes(Ty, (LLVMTypeRef *) Arr);
|
||||
|
||||
CAMLreturn(Arr);
|
||||
}
|
||||
|
||||
/* lltype -> int -> lltype */
|
||||
CAMLprim LLVMTypeRef llvm_array_type(LLVMTypeRef ElementTy, value Count) {
|
||||
return LLVMArrayType(ElementTy, Int_val(Count));
|
||||
|
@ -1039,6 +1039,20 @@ LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy);
|
||||
*/
|
||||
LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
|
||||
|
||||
/**
|
||||
* Returns type's subtypes
|
||||
*
|
||||
* @see llvm::Type::subtypes()
|
||||
*/
|
||||
void LLVMGetSubtypes(LLVMTypeRef Tp, LLVMTypeRef *Arr);
|
||||
|
||||
/**
|
||||
* Return the number of types in the derived type.
|
||||
*
|
||||
* @see llvm::Type::getNumContainedTypes()
|
||||
*/
|
||||
unsigned LLVMGetNumContainedTypes(LLVMTypeRef Tp);
|
||||
|
||||
/**
|
||||
* Create a fixed size array type that refers to a specific type.
|
||||
*
|
||||
|
@ -568,6 +568,14 @@ LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
|
||||
|
||||
/*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
|
||||
|
||||
void LLVMGetSubtypes(LLVMTypeRef Tp, LLVMTypeRef *Arr) {
|
||||
int i = 0;
|
||||
for (auto *T : unwrap(Tp)->subtypes()) {
|
||||
Arr[i] = wrap(T);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) {
|
||||
return wrap(ArrayType::get(unwrap(ElementType), ElementCount));
|
||||
}
|
||||
@ -587,6 +595,10 @@ LLVMTypeRef LLVMGetElementType(LLVMTypeRef WrappedTy) {
|
||||
return wrap(cast<SequentialType>(Ty)->getElementType());
|
||||
}
|
||||
|
||||
unsigned LLVMGetNumContainedTypes(LLVMTypeRef Tp) {
|
||||
return unwrap(Tp)->getNumContainedTypes();
|
||||
}
|
||||
|
||||
unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) {
|
||||
return unwrap<ArrayType>(ArrayTy)->getNumElements();
|
||||
}
|
||||
|
@ -66,6 +66,16 @@ let suite name f =
|
||||
let filename = Sys.argv.(1)
|
||||
let m = create_module context filename
|
||||
|
||||
(*===-- Contained types --------------------------------------------------===*)
|
||||
|
||||
let test_contained_types () =
|
||||
let pointer_i32 = pointer_type i32_type in
|
||||
insist (i32_type = (Array.get (subtypes pointer_i32) 0));
|
||||
|
||||
let ar = struct_type context [| i32_type; i8_type |] in
|
||||
insist (i32_type = (Array.get (subtypes ar)) 0);
|
||||
insist (i8_type = (Array.get (subtypes ar)) 1)
|
||||
|
||||
|
||||
(*===-- Conversion --------------------------------------------------------===*)
|
||||
|
||||
@ -1533,6 +1543,7 @@ let test_writer () =
|
||||
(*===-- Driver ------------------------------------------------------------===*)
|
||||
|
||||
let _ =
|
||||
suite "contained types" test_contained_types;
|
||||
suite "conversion" test_conversion;
|
||||
suite "target" test_target;
|
||||
suite "constants" test_constants;
|
||||
|
Loading…
Reference in New Issue
Block a user