1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Area: ffi_call 2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Purpose: Check different structures. 3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Limitations: none. 4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project PR: none. 5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Originator: Ronald Oussoren <oussoren@cistron.nl> 20030824 */ 6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* { dg-do run } */ 8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include "ffitest.h" 9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef struct Point { 11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project float x; 12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project float y; 13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} Point; 14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef struct Size { 16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project float h; 17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project float w; 18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} Size; 19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef struct Rect { 21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Point o; 22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Size s; 23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} Rect; 24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint doit(int o, char* s, Point p, Rect r, int last) 26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", 28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last); 29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project return 42; 30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint main(void) 34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type point_type; 36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type size_type; 37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type rect_type; 38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_cif cif; 39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type* arglist[6]; 40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void* values[6]; 41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project int r; 42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* 44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project * First set up FFI types for the 3 struct types 45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project */ 46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project point_type.size = 0; /*sizeof(Point);*/ 48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project point_type.alignment = 0; /*__alignof__(Point);*/ 49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project point_type.type = FFI_TYPE_STRUCT; 50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project point_type.elements = malloc(3 * sizeof(ffi_type*)); 51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project point_type.elements[0] = &ffi_type_float; 52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project point_type.elements[1] = &ffi_type_float; 53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project point_type.elements[2] = NULL; 54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project size_type.size = 0;/* sizeof(Size);*/ 56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project size_type.alignment = 0;/* __alignof__(Size);*/ 57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project size_type.type = FFI_TYPE_STRUCT; 58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project size_type.elements = malloc(3 * sizeof(ffi_type*)); 59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project size_type.elements[0] = &ffi_type_float; 60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project size_type.elements[1] = &ffi_type_float; 61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project size_type.elements[2] = NULL; 62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project rect_type.size = 0;/*sizeof(Rect);*/ 64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project rect_type.alignment =0;/* __alignof__(Rect);*/ 65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project rect_type.type = FFI_TYPE_STRUCT; 66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project rect_type.elements = malloc(3 * sizeof(ffi_type*)); 67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project rect_type.elements[0] = &point_type; 68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project rect_type.elements[1] = &size_type; 69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project rect_type.elements[2] = NULL; 70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* 72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project * Create a CIF 73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project */ 74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project arglist[0] = &ffi_type_sint; 75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project arglist[1] = &ffi_type_pointer; 76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project arglist[2] = &point_type; 77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project arglist[3] = &rect_type; 78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project arglist[4] = &ffi_type_sint; 79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project arglist[5] = NULL; 80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 5, &ffi_type_sint, arglist); 83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project if (r != FFI_OK) { 84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project abort(); 85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project } 86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* And call the function through the CIF */ 89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project { 91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Point p = { 1.0, 2.0 }; 92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Rect r = { { 9.0, 10.0}, { -1.0, -2.0 } }; 93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project int o = 0; 94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project int l = 42; 95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project char* m = "myMethod"; 96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_arg result; 97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project values[0] = &o; 99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project values[1] = &m; 100a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project values[2] = &p; 101a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project values[3] = &r; 102a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project values[4] = &l; 103a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project values[5] = NULL; 104a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 105a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n", 106a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l); 107a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 108a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_call(&cif, FFI_FN(doit), &result, values); 109a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 110a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf ("The result is %d\n", (int)result); 111a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 112a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project } 113a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project exit(0); 114a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 115