#include #include #include #include "trg.h" #define NUM_TST_ARGS 12 #define FFI_FN(f) ((void (*)(void))f) static int test1(void) { uint32_t sValues[2 * NUM_TST_ARGS]; size_t sValues_idx = 0; ffi_cif cif; ffi_type *args[NUM_TST_ARGS]; size_t args_idx = 0; void *values[NUM_TST_ARGS]; int rc = -1; /* Initialize the argument info vectors */ args[args_idx] = &ffi_type_pointer; sValues[sValues_idx] = (uint32_t) 0xa; values[args_idx] = &(sValues[sValues_idx]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_pointer; sValues[sValues_idx] = (uint32_t) 0xb; values[args_idx] = &(sValues[sValues_idx]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_float; { const float tf = 11.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; } values[args_idx] = &(sValues[sValues_idx]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_double; { const double tf = 12.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; ++sValues_idx; sValues[sValues_idx] = *(tp + 1); } values[args_idx] = &(sValues[sValues_idx - 1]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_float; { const float tf = 13.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; } values[args_idx] = &(sValues[sValues_idx]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_double; { const double tf = 14.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; ++sValues_idx; sValues[sValues_idx] = *(tp + 1); } values[args_idx] = &(sValues[sValues_idx - 1]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_float; { const float tf = 15.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; } values[args_idx] = &(sValues[sValues_idx]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_double; { const double tf = 16.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; ++sValues_idx; sValues[sValues_idx] = *(tp + 1); } values[args_idx] = &(sValues[sValues_idx - 1]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_float; { const float tf = 17.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; } values[args_idx] = &(sValues[sValues_idx]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_double; { const double tf = 18.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; ++sValues_idx; sValues[sValues_idx] = *(tp + 1); } values[args_idx] = &(sValues[sValues_idx - 1]); ++args_idx; ++sValues_idx; args[args_idx] = &ffi_type_float; { const float tf = 19.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; } values[args_idx] = &(sValues[sValues_idx]); ++args_idx; ++sValues_idx; #ifdef __USE_F6__ args[args_idx] = &ffi_type_float; { const float tf = 20.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; } values[args_idx] = &(sValues[sValues_idx]); ++args_idx; ++sValues_idx; #else /* __USE_F6__ */ args[args_idx] = &ffi_type_double; { const double tf = 20.1; const uint32_t * const tp = (uint32_t *) &tf; sValues[sValues_idx] = *tp; ++sValues_idx; sValues[sValues_idx] = *(tp + 1); } values[args_idx] = &(sValues[sValues_idx - 1]); ++args_idx; ++sValues_idx; #endif /* __USE_F6__ */ printf("args_idx = %d\n", args_idx); /* Initialize the cif and issue ffi call */ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, NUM_TST_ARGS, &ffi_type_uint, args) == FFI_OK) { ffi_call(&cif, FFI_FN(tst_func1), &rc, values); printf("rc = %d - success? %c\n", rc, (1 == rc) ? 'Y' : 'N'); } return rc; } int main() { return test1(); }