This is the mail archive of the libffi-discuss@sourceware.org mailing list for the libffi project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi, I am not very familiar with libffi but I believe I may have stumbled upon a bug. If you build the attached test code, you will get two test programs - namely, ex1 and ex2. The only difference between the two is '-D__USE_F6__' , which passes the last parameter of test_func1() as a float instead of a double. I have tried these test programs on both X86 and PPC (32-bit in both cases) using libffi 3.2.1. I did not use any special configure flags when I built libffi 3.2.1 for both platforms. This is what I get on X86: $ ./ex1 args_idx = 12 tst_func1 : 0xa 0xb 11.100000 12.1 13.100000 14.1 15.100000 16.1 17.100000 18.1 19.100000 20.100000 rc = 1 - success? Y $ ./ex2 args_idx = 12 tst_func1 : 0xa 0xb 11.100000 12.1 13.100000 14.1 15.100000 16.1 17.100000 18.1 19.100000 20.1 rc = 1 - success? Y That looks fine. The last parameter is always 20.1. If I run the same code on PPC I get: $ uname -a Linux tstsrv 3.0.101-0.47.52-ppc64 #1 SMP Thu Mar 26 10:55:49 UTC 2015 (0e3c7c8) ppc64 ppc64 ppc64 GNU/Linux $ file ./ppc/libffi_3.2.1/lib/libffi.so.6.0.4 ./ppc/libffi_3.2.1/lib/libffi.so.6.0.4: ELF 32-bit MSB shared object, PowerPC or cisco 4500, version 1 (SYSV), dynamically linked, not stripped $ gcc -dumpversion 4.3 $ ./ex1 args_idx = 12 tst_func1 : 0xa 0xb 11.100000 12.1 13.100000 14.1 15.100000 16.1 17.100000 18.1 19.100000 20.100000 rc = 1 - success? Y $ ./ex2 args_idx = 12 tst_func1 : 0xa 0xb 11.100000 12.1 13.100000 14.1 15.100000 16.1 17.100000 18.1 19.100000 -2.35344e-185 rc = 0 - success? N You can see above that the last parameter printed by tst_func1() is incorrect in the case of ex2 (i.e., when passed as a double). Any idea? Thanks in advance
#include <stdint.h> #include <stdio.h> #include <ffi.h> #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(); }
Attachment:
Makefile
Description: Binary data
#include <stdio.h> int tst_func1(const char * p1, const char * p2, float f1, double d1, float f2, double d2, #ifdef __USE_F6__ float f3, double d3, float f4, double d4, float f5, float f6) #else /* __USE_F6__ */ float f3, double d3, float f4, double d4, float f5, double d5) #endif /* __USE_F6__ */ { const int success = ((const char *) 0xa == p1) && ((const char *) 0xb == p2) && ((float) 11.1 == f1) && ((double) 12.1 == d1) && ((float) 13.1 == f2) && ((double) 14.1 == d2) && ((float) 15.1 == f3) && ((double) 16.1 == d3) && ((float) 17.1 == f4) && ((double) 18.1 == d4) && ((float) 19.1 == f5) && #ifdef __USE_F6__ ((float) 20.1 == f6); #else /* __USE_F6__ */ ((double) 20.1 == d5); #endif /* __USE_F6__ */ #ifdef __USE_F6__ printf("%s : %p %p %f %g %f %g %f %g %f %g %f %f\n", #else /* __USE_F6__ */ printf("%s : %p %p %f %g %f %g %f %g %f %g %f %g\n", #endif /* __USE_F6__ */ __func__, p1, p2, f1, d1, f2, d2, f3, d3, f4, d4, f5, #ifdef __USE_F6__ f6); #else /* __USE_F6__ */ d5); #endif /* __USE_F6__ */ return success; }
#ifndef __TRG_H__ #define __TRG_H__ int tst_func1(const char * p1, const char * p2, float f1, double d1, float f2, double d2, #ifdef __USE_F6__ float f3, double d3, float f4, double d4, float f5, float f6); #else /* __USE_F6__ */ float f3, double d3, float f4, double d4, float f5, double d5); #endif /* __USE_F6__ */ #endif /* __TRG_H__ */
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |