diff options
Diffstat (limited to 'gcc/testsuite/gcc.target')
31 files changed, 617 insertions, 5 deletions
diff --git a/gcc/testsuite/gcc.target/i386/pr39315-1.c b/gcc/testsuite/gcc.target/i386/pr39315-1.c new file mode 100644 index 00000000000..16ba5d59fe4 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39315-1.c @@ -0,0 +1,18 @@ +/* PR middle-end/39315 */ +/* { dg-do compile } */ +/* { dg-options "-O -msse2 -mtune=generic" } */ +/* { dg-final { scan-assembler-not "movups" } } */ +/* { dg-final { scan-assembler-not "movlps" } } */ +/* { dg-final { scan-assembler-not "movhps" } } */ +/* { dg-final { scan-assembler "movaps" } } */ + +typedef float __m128 __attribute__ ((__vector_size__ (16))); + +extern void bar (__m128 *); + +void +foo (__m128 *x) +{ + __m128 b = *x; + bar (&b); +} diff --git a/gcc/testsuite/gcc.target/i386/pr39315-2.c b/gcc/testsuite/gcc.target/i386/pr39315-2.c new file mode 100644 index 00000000000..ab3dcd0d24a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39315-2.c @@ -0,0 +1,15 @@ +/* PR middle-end/39315 */ +/* { dg-do run } */ +/* { dg-options "-O -msse2 -mtune=generic" } */ +/* { dg-additional-sources pr39315-check.c } */ + +typedef float __m128 __attribute__ ((__vector_size__ (16))); + +extern void bar (__m128 *, int); + +void +foo (__m128 *x) +{ + __m128 b = *x; + bar (&b, __alignof__ (x)); +} diff --git a/gcc/testsuite/gcc.target/i386/pr39315-3.c b/gcc/testsuite/gcc.target/i386/pr39315-3.c new file mode 100644 index 00000000000..07862db603a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39315-3.c @@ -0,0 +1,19 @@ +/* PR middle-end/39315 */ +/* { dg-do compile } */ +/* { dg-options "-O -msse2 -mtune=generic" } */ +/* { dg-final { scan-assembler-not "movups" } } */ +/* { dg-final { scan-assembler-not "movlps" } } */ +/* { dg-final { scan-assembler-not "movhps" } } */ +/* { dg-final { scan-assembler "and\[lq\]?\[\\t \]*\\$-128,\[\\t \]*%\[re\]?sp" } } */ +/* { dg-final { scan-assembler "movaps" } } */ + +typedef float __m128 __attribute__ ((__vector_size__ (16))); + +extern void bar (__m128 *); + +void +foo (__m128 *x) +{ + __m128 b __attribute__ ((aligned(128))) = *x; + bar (&b); +} diff --git a/gcc/testsuite/gcc.target/i386/pr39315-4.c b/gcc/testsuite/gcc.target/i386/pr39315-4.c new file mode 100644 index 00000000000..2e55c251b03 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39315-4.c @@ -0,0 +1,15 @@ +/* PR middle-end/39315 */ +/* { dg-do run } */ +/* { dg-options "-O -msse2 -mtune=generic" } */ +/* { dg-additional-sources pr39315-check.c } */ + +typedef float __m128 __attribute__ ((__vector_size__ (16))); + +extern void bar (__m128 *, int); + +void +foo (__m128 *x) +{ + __m128 b __attribute__ ((aligned(128))) = *x; + bar (&b, __alignof__ (x)); +} diff --git a/gcc/testsuite/gcc.target/i386/pr39315-check.c b/gcc/testsuite/gcc.target/i386/pr39315-check.c new file mode 100644 index 00000000000..ff926057536 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39315-check.c @@ -0,0 +1,22 @@ +typedef float __m128 __attribute__ ((__vector_size__ (16))); + +extern void foo (__m128 *); +extern void abort (void); + +__m128 y = { 0.0, 1.0, 2.0, 3.0 }; + +void +bar (__m128 *x, int align) +{ + if ((((__PTRDIFF_TYPE__) x) & (align - 1)) != 0) + abort (); + if (__builtin_memcmp (x, &y, sizeof (y)) != 0) + abort (); +} + +int +main () +{ + foo (&y); + return 0; +} diff --git a/gcc/testsuite/gcc.target/i386/pr39431.c b/gcc/testsuite/gcc.target/i386/pr39431.c new file mode 100644 index 00000000000..756bdb9ebb8 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39431.c @@ -0,0 +1,15 @@ +/* PR target/39431 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-options "-O2 -march=i686 -fpic" { target { ilp32 && fpic } } } */ + +extern void bar (char *, int); + +int +foo (long long *p, long long oldv, long long *q, int n) +{ + char buf[n]; + bar (buf, n); + p[256 + n] = __sync_val_compare_and_swap (p + n, oldv, oldv + 6); + return __sync_bool_compare_and_swap (q + n, oldv, oldv + 8); +} diff --git a/gcc/testsuite/gcc.target/i386/pr39445.c b/gcc/testsuite/gcc.target/i386/pr39445.c new file mode 100644 index 00000000000..6f0295bc1e0 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39445.c @@ -0,0 +1,25 @@ +/* { dg-do run } */ +/* { dg-options "-Os -msse2" } */ + +#include "sse2-check.h" + +typedef struct { __m128 f __attribute__((packed)); } packed; + +__m128 __attribute__((noinline)) +foo (__m128 a1, __m128 a2, __m128 a3, __m128 a4, + __m128 a5, __m128 a6, __m128 a7, __m128 a8, + int b1, int b2, int b3, int b4, int b5, int b6, int b7, packed y) +{ + return y.f; +} + +void +sse2_test (void) +{ + packed x; + __m128 y = { 0 }; + x.f = y; + y = foo (y, y, y, y, y, y, y, y, 1, 2, 3, 4, 5, 6, -1, x); + if (__builtin_memcmp (&y, &x.f, sizeof (y)) != 0) + abort (); +} diff --git a/gcc/testsuite/gcc.target/i386/pr39482.c b/gcc/testsuite/gcc.target/i386/pr39482.c new file mode 100644 index 00000000000..4e2dfa724a9 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39482.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-mno-sse2" } */ + +extern double log (double __x); + +double foo (unsigned long int m_liOutputBufferLen) +{ + return log ((double) m_liOutputBufferLen); +} diff --git a/gcc/testsuite/gcc.target/i386/pr39496.c b/gcc/testsuite/gcc.target/i386/pr39496.c new file mode 100644 index 00000000000..d90a2c7f3ea --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39496.c @@ -0,0 +1,35 @@ +/* PR target/39496 */ +/* { dg-do compile { target { { i?86-*-linux* x86_64-*-linux* } && ilp32 } } } */ +/* { dg-options "-O0 -fverbose-asm -fno-omit-frame-pointer -msse2 -mfpmath=sse" } */ +/* Verify that {foo,bar}{,2}param are all passed on the stack, using + normal calling conventions, when not optimizing. */ +/* { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*fooparam," } } */ +/* { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*barparam," } } */ +/* { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*foo2param," } } */ +/* { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*bar2param," } } */ + +static inline int foo (int fooparam) +{ + return fooparam; +} + +static int bar (int barparam) +{ + return foo (barparam); +} + +static inline double foo2 (double foo2param) +{ + return foo2param; +} + +static double bar2 (double bar2param) +{ + return foo2 (bar2param); +} + +int +main () +{ + return bar (0) + bar2 (0.0); +} diff --git a/gcc/testsuite/gcc.target/i386/pr39545-1.c b/gcc/testsuite/gcc.target/i386/pr39545-1.c new file mode 100644 index 00000000000..62bc33fa21d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39545-1.c @@ -0,0 +1,24 @@ +/* PR target/39545 */ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2" } */ + +struct flex +{ + int i; + int flex []; +}; + +int +foo (struct flex s) /* { dg-message "note: The ABI of passing struct with a flexible array member has changed in GCC 4.4" } */ +{ + return s.i; +} + +struct flex +bar (int x) +{ + struct flex s; + s.i = x; + return s; +} diff --git a/gcc/testsuite/gcc.target/i386/pr39545-2.c b/gcc/testsuite/gcc.target/i386/pr39545-2.c new file mode 100644 index 00000000000..143c3827fd6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39545-2.c @@ -0,0 +1,18 @@ +/* PR target/39545 */ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2" } */ + +struct flex +{ + int i; + int flex []; +}; + +struct flex +foo (int x) +{ /* { dg-message "note: The ABI of passing struct with a flexible array member has changed in GCC 4.4" } */ + struct flex s; + s.i = x; + return s; +} diff --git a/gcc/testsuite/gcc.target/i386/push-1.c b/gcc/testsuite/gcc.target/i386/push-1.c index cf5a1041364..da9b39ec9b5 100644 --- a/gcc/testsuite/gcc.target/i386/push-1.c +++ b/gcc/testsuite/gcc.target/i386/push-1.c @@ -12,4 +12,4 @@ bar (void) foo (x, x, x, x, 5); } -/* { dg-final { scan-assembler-not "movups" } } */ +/* { dg-final { scan-assembler-not "movups" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.target/i386/stackalign/longlong-1.c b/gcc/testsuite/gcc.target/i386/stackalign/longlong-1.c new file mode 100644 index 00000000000..225d0c5e558 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/stackalign/longlong-1.c @@ -0,0 +1,15 @@ +/* PR target/39137 */ +/* { dg-do compile } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-options "-O2 -mpreferred-stack-boundary=2" } */ +/* Make sure dynamic stack realignment isn't performed just because there + are long long variables. */ +/* { dg-final { scan-assembler-not "and\[lq\]?\[^\\n\]*-8,\[^\\n\]*sp" } } */ + +void fn (void *); + +void f1 (void) +{ + unsigned long long a; + fn (&a); +} diff --git a/gcc/testsuite/gcc.target/i386/stackalign/longlong-2.c b/gcc/testsuite/gcc.target/i386/stackalign/longlong-2.c new file mode 100644 index 00000000000..ae7f3ee333a --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/stackalign/longlong-2.c @@ -0,0 +1,33 @@ +/* { dg-do compile { target { ! *-*-darwin* } } } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-options "-O2 -mpreferred-stack-boundary=2" } */ +/* { dg-final { scan-assembler-times "and\[lq\]?\[^\\n\]*-8,\[^\\n\]*sp" 2 } } */ +/* { dg-final { scan-assembler-times "and\[lq\]?\[^\\n\]*-16,\[^\\n\]*sp" 2 } } */ + +void fn (void *); + +void f2 (void) +{ + unsigned long long a __attribute__((aligned (8))); + fn (&a); +} + +void f3 (void) +{ + typedef unsigned long long L __attribute__((aligned (8))); + L a; + fn (&a); +} + +void f4 (void) +{ + unsigned long long a __attribute__((aligned (16))); + fn (&a); +} + +void f5 (void) +{ + typedef unsigned long long L __attribute__((aligned (16))); + L a; + fn (&a); +} diff --git a/gcc/testsuite/gcc.target/i386/stackalign/return-4.c b/gcc/testsuite/gcc.target/i386/stackalign/return-4.c index c66c369c8fc..a1e35dcc213 100644 --- a/gcc/testsuite/gcc.target/i386/stackalign/return-4.c +++ b/gcc/testsuite/gcc.target/i386/stackalign/return-4.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-mpreferred-stack-boundary=4" } */ -/* { dg-final { scan-assembler-not "andl\[^\\n\]*-64,\[^\\n\]*sp" } } */ +/* { dg-final { scan-assembler-not "and\[lq\]?\[^\\n\]*-64,\[^\\n\]*sp" } } */ /* This compile only test is to detect an assertion failure in stack branch development. */ diff --git a/gcc/testsuite/gcc.target/i386/stackalign/return-5.c b/gcc/testsuite/gcc.target/i386/stackalign/return-5.c index 84531ddfe29..208bc0d8ad6 100644 --- a/gcc/testsuite/gcc.target/i386/stackalign/return-5.c +++ b/gcc/testsuite/gcc.target/i386/stackalign/return-5.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-mpreferred-stack-boundary=4" } */ -/* { dg-final { scan-assembler-not "andl\[^\\n\]*-64,\[^\\n\]*sp" } } */ +/* { dg-final { scan-assembler-not "and\[lq\]?\[^\\n\]*-64,\[^\\n\]*sp" } } */ /* This compile only test is to detect an assertion failure in stack branch development. */ diff --git a/gcc/testsuite/gcc.target/i386/stackalign/return-6.c b/gcc/testsuite/gcc.target/i386/stackalign/return-6.c index ceadbad1acf..b1aa1eac888 100644 --- a/gcc/testsuite/gcc.target/i386/stackalign/return-6.c +++ b/gcc/testsuite/gcc.target/i386/stackalign/return-6.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-mpreferred-stack-boundary=4" } */ -/* { dg-final { scan-assembler-not "andl\[^\\n\]*-64,\[^\\n\]*sp" } } */ +/* { dg-final { scan-assembler-not "and\[lq\]?\[^\\n\]*-64,\[^\\n\]*sp" } } */ /* This compile only test is to detect an assertion failure in stack branch development. */ diff --git a/gcc/testsuite/gcc.target/ia64/20090324-1.c b/gcc/testsuite/gcc.target/ia64/20090324-1.c new file mode 100644 index 00000000000..d9aff6a18b4 --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/20090324-1.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fmodulo-sched" } */ + +static char *place_region_bounds_x, *place_region_bounds_y; +static void read_place () { + char msg[300]; + update_screen (msg); +} +static void alloc_and_load_placement_structs () { + int i, j; + for (j=0; + j<100; + j++) { + place_region_bounds_x[i] = place_region_bounds_x[i-1]; + place_region_bounds_y[i] = place_region_bounds_y[i-1]; + } +} +void place_and_route () { + read_place (); + alloc_and_load_placement_structs (); +} diff --git a/gcc/testsuite/gcc.target/ia64/sync-1.c b/gcc/testsuite/gcc.target/ia64/sync-1.c new file mode 100644 index 00000000000..95f6daeb997 --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/sync-1.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler "xchg4 .*, r0" } } */ +/* { dg-final { scan-assembler "cmpxchg4.*, r0, .*" } } */ +/* { dg-final { scan-assembler "cmpxchg8.*, r0, .*" } } */ + +int +foo1 (int *p) +{ + return __sync_lock_test_and_set (p, 0); +} + +int +foo2 (int *p, int v) +{ + return __sync_bool_compare_and_swap (p, v, 0); +} + +long +foo3 (long *p, long v) +{ + return __sync_bool_compare_and_swap (p, v, 0); +} diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-28.c b/gcc/testsuite/gcc.target/powerpc/altivec-28.c new file mode 100644 index 00000000000..db6c25ac7e8 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/altivec-28.c @@ -0,0 +1,16 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +#define B bool +#define P pixel +#define I int +#define BI bool int +#define PI pixel int + +vector B int i; +vector P int j; +vector B I k; +vector P I l; +vector BI m; +vector PI n; diff --git a/gcc/testsuite/gcc.target/s390/20090223-1.c b/gcc/testsuite/gcc.target/s390/20090223-1.c new file mode 100644 index 00000000000..443ccb9aa69 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/20090223-1.c @@ -0,0 +1,60 @@ +/* The RTL loop optimizer used to replace the output register of the + inline assembly with a pseudo although the variable is declared as + register asm ("0"). */ + +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +extern void abort (void); + +static unsigned char __attribute__ ((always_inline)) +mytoupper (unsigned char c) +{ + if (c >= 'a' && c <= 'z') + c -= 'a' - 'A'; + return c; +} + +static unsigned long __attribute__ ((always_inline)) +strlen (const char *s) +{ + register unsigned long r0 asm ("0"); + const char *tmp = s; + + asm ( +#ifdef __s390x__ + " lghi %0, 0\n" +#else + " lhi %0, 0\n" +#endif + "0:srst %0,%1\n" + " jo 0b" + : "=d" (r0), "+a" (tmp) + : + :"cc"); + return r0 - (unsigned long) s; +} + +char boot_command_line[] = "this is a test"; + +void __attribute__ ((noinline)) +foo (char *str) +{ + if (strcmp (str, "THIS IS A TEST") != 0) + abort (); +} + +int +main () +{ + char upper_command_line[1024]; + int i; + + for (i = 0; i < strlen (boot_command_line); i++) + upper_command_line[i] = mytoupper (boot_command_line[i]); + + upper_command_line[strlen (boot_command_line)] = 0; + foo (upper_command_line); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2a.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2a.c new file mode 100644 index 00000000000..048da6e56ac --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2a.c @@ -0,0 +1,27 @@ +/* Test for cross x86_64<->w64 abi standard calls. */ +/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */ +/* { dg-options "-O2 -mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */ +/* { dg-additional-sources "func-2b.c" } */ + +extern void __attribute__ ((sysv_abi)) abort (void); +long double func_cross (long double, double, float, long, int, char); + +long double __attribute__ ((sysv_abi)) +func_native (long double a, double b, float c, long d, int e, char f) +{ + long double ret; + ret = a + (long double) b + (long double) c; + ret *= (long double) (d + (long) e); + if (f>0) + ret += func_native (a,b,c,d,e,-f); + return ret; +} + +int __attribute__ ((sysv_abi)) +main () +{ + if (func_cross (1.0,2.0,3.0,1,2,3) + != func_native (1.0,2.0,3.0,1,2,3)) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2b.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2b.c new file mode 100644 index 00000000000..fe85dd1860d --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-2b.c @@ -0,0 +1,13 @@ +/* Test for cross x86_64<->w64 abi standard calls. */ +/* { dg-options "-mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */ + +long double func_cross (long double a, double b, float c, long d, int e, + char f) +{ + long double ret; + ret = a + (long double) b + (long double) c; + ret *= (long double) (d + (long) e); + if (f>0) + ret += func_cross (a,b,c,d,e,-f); + return ret; +} diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2a.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2a.c new file mode 100644 index 00000000000..730b8db9c1f --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2a.c @@ -0,0 +1,17 @@ +/* Test for cross x86_64<->w64 abi standard calls via variable. */ +/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */ +/* { dg-options "-O2 -mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */ +/* { dg-additional-sources "func-indirect-2b.c" } */ + +extern void __attribute__ ((sysv_abi)) abort (void); +typedef int (*func)(void *, char *, char *, short, long long); +extern func get_callback (void); + +int __attribute__ ((sysv_abi)) +main () +{ + func callme = get_callback (); + if (callme (0, 0, 0, 0x1234, 0x1234567890abcdefLL)) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2b.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2b.c new file mode 100644 index 00000000000..1a9fccd97f6 --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect-2b.c @@ -0,0 +1,24 @@ +/* Test for cross x86_64<->w64 abi standard calls via variable. */ +/* { dg-options "-O2 -mabi=ms -std=gnu99 -ffast-math -fno-builtin" } */ + +typedef int (*func)(void *, char *, char *, short, long long); + +static int +callback (void *ptr, char *string1, char *string2, short number, + long long rand) +{ + if (ptr != 0 + || string1 != 0 + || string2 != 0 + || number != 0x1234 + || rand != 0x1234567890abcdefLL) + return 1; + else + return 0; +} + +func +get_callback (void) +{ + return callback; +} diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect.c index 8c1cac82e1b..0c0cbb271ca 100644 --- a/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect.c +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/func-indirect.c @@ -20,5 +20,5 @@ int main() volatile func callme = callback; if(callme(0, 0, 0, 0, 0x1234567890abcdefLL)) abort(); + return 0; } - diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4a.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4a.c new file mode 100644 index 00000000000..a44470431ff --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4a.c @@ -0,0 +1,24 @@ +/* Test for cross x86_64<->w64 abi va_list calls. */ +/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */ +/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */ +/* { dg-additional-sources "vaarg-4b.c" } */ + +extern __SIZE_TYPE__ __attribute__ ((sysv_abi)) strlen (const char *); +extern int __attribute__ ((sysv_abi)) sprintf (char *,const char *, ...); +extern void __attribute__ ((sysv_abi)) abort (void); + +extern void do_cpy (char *, ...); + +int __attribute__ ((sysv_abi)) +main () +{ + char s[256]; + + do_cpy (s, "1","2","3","4", "5", "6", "7", ""); + + if (s[0] != '1' || s[1] !='2' || s[2] != '3' || s[3] != '4' + || s[4] != '5' || s[5] != '6' || s[6] != '7' || s[7] != 0) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4b.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4b.c new file mode 100644 index 00000000000..f33906bd293 --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-4b.c @@ -0,0 +1,31 @@ +/* Test for cross x86_64<->w64 abi va_list calls. */ +/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */ + +#include <stdarg.h> + +extern __SIZE_TYPE__ __attribute__ ((sysv_abi)) strlen (const char *); +extern int __attribute__ ((sysv_abi)) sprintf (char *, const char *, ...); + +static void +vdo_cpy (char *s, va_list argp) +{ + __SIZE_TYPE__ len; + char *r = s; + char *e; + *r = 0; + for (;;) { + e = va_arg (argp, char *); + if (*e == 0) break; + sprintf (r,"%s", e); + r += strlen (r); + } +} + +void +do_cpy (char *s, ...) +{ + va_list argp; + va_start (argp, s); + vdo_cpy (s, argp); + va_end (argp); +} diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5a.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5a.c new file mode 100644 index 00000000000..e9912957e7c --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5a.c @@ -0,0 +1,17 @@ +/* Test for cross x86_64<->w64 abi va_list calls. */ +/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */ +/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */ +/* { dg-additional-sources "vaarg-5b.c" } */ + +extern void __attribute__ ((sysv_abi)) abort (void); +extern int fct2 (int, ...); + +#define SZ_ARGS 1ll,2ll,3ll,4ll,5ll,6ll,7ll,0ll + +int __attribute__ ((sysv_abi)) +main() +{ + if (fct2 (-1, SZ_ARGS) != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5b.c b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5b.c new file mode 100644 index 00000000000..e5dd4727bdd --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5b.c @@ -0,0 +1,37 @@ +/* Test for cross x86_64<->w64 abi va_list calls. */ +/* { dg-options "-O2 -mabi=ms -std=gnu99 -fno-builtin" } */ + +#include <stdarg.h> + +#define SZ_ARGS 1ll,2ll,3ll,4ll,5ll,6ll,7ll,0ll + +static int __attribute__ ((sysv_abi)) +fct1 (va_list argp, ...) +{ + long long p1,p2; + int ret = 1; + __builtin_sysv_va_list argp_2; + + __builtin_sysv_va_start (argp_2, argp); + do { + p1 = va_arg (argp_2, long long); + p2 = va_arg (argp, long long); + if (p1 != p2) + ret = 0; + } while (ret && p1 != 0); + __builtin_sysv_va_end (argp_2); + + return ret; +} + +int +fct2 (int dummy, ...) +{ + va_list argp; + int ret = dummy; + + va_start (argp, dummy); + ret += fct1 (argp, SZ_ARGS); + va_end (argp); + return ret; +} diff --git a/gcc/testsuite/gcc.target/x86_64/abi/test_passing_structs.c b/gcc/testsuite/gcc.target/x86_64/abi/test_passing_structs.c index 3ce0db14652..68eca53a2e4 100644 --- a/gcc/testsuite/gcc.target/x86_64/abi/test_passing_structs.c +++ b/gcc/testsuite/gcc.target/x86_64/abi/test_passing_structs.c @@ -92,6 +92,33 @@ check_struct_passing6 (struct m128_2_struct ms ATTRIBUTE_UNUSED) } #endif +struct flex1_struct +{ + long i; + long flex[]; +}; + +struct flex2_struct +{ + long i; + long flex[0]; +}; + +void +check_struct_passing7 (struct flex1_struct is ATTRIBUTE_UNUSED) +{ + check_int_arguments; +} + +void +check_struct_passing8 (struct flex2_struct is ATTRIBUTE_UNUSED) +{ + check_int_arguments; +} + +static struct flex1_struct f1s = { 60, { } }; +static struct flex2_struct f2s = { 61, { } }; + int main (void) { @@ -146,5 +173,17 @@ main (void) WRAP_CALL (check_struct_passing6)(m128_2s); #endif + clear_struct_registers; + iregs.I0 = f1s.i; + num_iregs = 1; + clear_int_hardware_registers; + WRAP_CALL (check_struct_passing7)(f1s); + + clear_struct_registers; + iregs.I0 = f2s.i; + num_iregs = 1; + clear_int_hardware_registers; + WRAP_CALL (check_struct_passing8)(f2s); + return 0; } |