Message ID | 4C61573F.1070400@codesourcery.com |
---|---|
State | New |
Headers | show |
Jie Zhang wrote: > When testing GCC on a Cortex-M4 board, gcc.dg/builtin-apply2.c will hang > the testing. That is because we should not use 64 as the size of the > stack argument. For ARM EABI, NAME is passed in r0. D is passed in r2 > and r3. E, F and G are passed on stack. Is this true in all variants of the ABI? Or do we need to worry about hard-float vs. soft-float ABIs? Thanks,
Mark Mitchell wrote: > Jie Zhang wrote: >> When testing GCC on a Cortex-M4 board, gcc.dg/builtin-apply2.c will hang >> the testing. That is because we should not use 64 as the size of the >> stack argument. For ARM EABI, NAME is passed in r0. D is passed in r2 >> and r3. E, F and G are passed on stack. >> > > Is this true in all variants of the ABI? Or do we need to worry about > hard-float vs. soft-float ABIs? This test is skipped for hard-float, due to the case of passing arguments to a variadic function; it simply won't pass under -mfloat-abi=hard. Jie, while you're at it, why not use the new __ARM_PCS symbol instead of __ARM_EABI__? It more accurately marks the softfp conventions you're trying to assume here. Chung-Lin
* gcc.dg/builtin-apply2.c (STACK_ARGUMENTS_SIZE): Define to 20 for ARM EABI otherwise 64. (bar): Use STACK_ARGUMENTS_SIZE for the third argument instead of hard coded 64. Index: gcc.dg/builtin-apply2.c =================================================================== --- gcc.dg/builtin-apply2.c (revision 163048) +++ gcc.dg/builtin-apply2.c (working copy) @@ -12,6 +12,15 @@ #define INTEGER_ARG 5 +#ifdef __ARM_EABI__ +/* For ARM EABI, NAME is passed in r0. D is passed in r2 and r3. + E, F and G are passed on stack. So the size of the stack argument + data is 20. */ +#define STACK_ARGUMENTS_SIZE 20 +#else +#define STACK_ARGUMENTS_SIZE 64 +#endif + extern void abort(void); void foo(char *name, double d, double e, double f, int g) @@ -22,7 +31,7 @@ void foo(char *name, double d, double e, void bar(char *name, ...) { - __builtin_apply(foo, __builtin_apply_args(), 64); + __builtin_apply(foo, __builtin_apply_args(), STACK_ARGUMENTS_SIZE); } int main(void)