1 /* Area: ffi_call 2 Purpose: Check strlen function call with additional arguments. 3 Limitations: none. 4 PR: none. 5 Originator: From the original ffitest.c */ 6 7 /* { dg-do run } */ 8 9 #include "ffitest.h" 10 11 static size_t ABI_ATTR my_f(float a, char *s, int i) 12 { 13 return (size_t) ((int) strlen(s) + (int) a + i); 14 } 15 16 int main (void) 17 { 18 ffi_cif cif; 19 ffi_type *args[MAX_ARGS]; 20 void *values[MAX_ARGS]; 21 ffi_arg rint; 22 char *s; 23 int v1; 24 float v2; 25 args[2] = &ffi_type_sint; 26 args[1] = &ffi_type_pointer; 27 args[0] = &ffi_type_float; 28 values[2] = (void*) &v1; 29 values[1] = (void*) &s; 30 values[0] = (void*) &v2; 31 32 /* Initialize the cif */ 33 CHECK(ffi_prep_cif(&cif, ABI_NUM, 3, 34 &ffi_type_sint, args) == FFI_OK); 35 36 s = "a"; 37 v1 = 1; 38 v2 = 0.0; 39 ffi_call(&cif, FFI_FN(my_f), &rint, values); 40 CHECK(rint == 2); 41 42 s = "1234567"; 43 v2 = -1.0; 44 v1 = -2; 45 ffi_call(&cif, FFI_FN(my_f), &rint, values); 46 CHECK(rint == 4); 47 48 s = "1234567890123456789012345"; 49 v2 = 1.0; 50 v1 = 2; 51 ffi_call(&cif, FFI_FN(my_f), &rint, values); 52 CHECK(rint == 28); 53 54 exit(0); 55 } 56