1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Area: ffi_call 2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Purpose: Check that negative integers are passed correctly. 3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Limitations: none. 4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project PR: none. 5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Originator: From the original ffitest.c */ 6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* { dg-do run } */ 8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* { dg-options -O2 } */ 9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include "ffitest.h" 11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectstatic int checking(int a, short b, signed char c) 13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project return (a < 0 && b < 0 && c < 0); 16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint main (void) 19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_cif cif; 21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type *args[MAX_ARGS]; 22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void *values[MAX_ARGS]; 23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_arg rint; 24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project signed int si; 26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project signed short ss; 27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project signed char sc; 28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args[0] = &ffi_type_sint; 30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project values[0] = &si; 31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args[1] = &ffi_type_sshort; 32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project values[1] = &ss; 33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project args[2] = &ffi_type_schar; 34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project values[2] = ≻ 35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* Initialize the cif */ 37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, 38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project &ffi_type_sint, args) == FFI_OK); 39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project si = -6; 41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ss = -12; 42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project sc = -1; 43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project checking (si, ss, sc); 45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_call(&cif, FFI_FN(checking), &rint, values); 47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf ("%d vs %d\n", (int)rint, checking (si, ss, sc)); 49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(rint != 0); 51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project exit (0); 53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 54