diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/torture')
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr68037-1.c | 58 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr68037-2.c | 54 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr68037-3.c | 70 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr68661-1a.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr68661-1b.c | 45 |
5 files changed, 245 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr68037-1.c b/gcc/testsuite/gcc.dg/torture/pr68037-1.c new file mode 100644 index 00000000000..15fe08c156f --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr68037-1.c @@ -0,0 +1,58 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-mgeneral-regs-only" } */ + +extern void exit (int); + +typedef unsigned int uword_t __attribute__ ((mode (__word__))); + +#define ERROR 0x12345670 +#define IP 0x12345671 +#define CS 0x12345672 +#define FLAGS 0x12345673 +#define SP 0x12345674 +#define SS 0x12345675 + +#define STRING(x) XSTRING(x) +#define XSTRING(x) #x + +struct interrupt_frame +{ + uword_t ip; + uword_t cs; + uword_t flags; + uword_t sp; + uword_t ss; +}; + +__attribute__((interrupt, used)) +void +fn (struct interrupt_frame *frame, uword_t error) +{ + if (ERROR != error) + __builtin_abort (); + if (IP != frame->ip) + __builtin_abort (); + if (CS != frame->cs) + __builtin_abort (); + if (FLAGS != frame->flags) + __builtin_abort (); + if (SP != frame->sp) + __builtin_abort (); + if (SS != frame->ss) + __builtin_abort (); + + exit (0); +} + +int +main () +{ + asm ("push $" STRING (SS) "; \ + push $" STRING (SP) "; \ + push $" STRING (FLAGS) "; \ + push $" STRING (CS) "; \ + push $" STRING (IP) "; \ + push $" STRING (ERROR) "; \ + jmp fn"); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr68037-2.c b/gcc/testsuite/gcc.dg/torture/pr68037-2.c new file mode 100644 index 00000000000..00ba7d45464 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr68037-2.c @@ -0,0 +1,54 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-mgeneral-regs-only" } */ + +extern void exit (int); + +typedef unsigned int uword_t __attribute__ ((mode (__word__))); + +#define IP 0x12345671 +#define CS 0x12345672 +#define FLAGS 0x12345673 +#define SP 0x12345674 +#define SS 0x12345675 + +#define STRING(x) XSTRING(x) +#define XSTRING(x) #x + +struct interrupt_frame +{ + uword_t ip; + uword_t cs; + uword_t flags; + uword_t sp; + uword_t ss; +}; + +__attribute__((interrupt, used)) +void +fn (struct interrupt_frame *frame) +{ + if (IP != frame->ip) + __builtin_abort (); + if (CS != frame->cs) + __builtin_abort (); + if (FLAGS != frame->flags) + __builtin_abort (); + if (SP != frame->sp) + __builtin_abort (); + if (SS != frame->ss) + __builtin_abort (); + + exit (0); +} + +int +main () +{ + asm ("push $" STRING (SS) "; \ + push $" STRING (SP) "; \ + push $" STRING (FLAGS) "; \ + push $" STRING (CS) "; \ + push $" STRING (IP) "; \ + jmp fn"); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr68037-3.c b/gcc/testsuite/gcc.dg/torture/pr68037-3.c new file mode 100644 index 00000000000..abf8adbc734 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr68037-3.c @@ -0,0 +1,70 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-mgeneral-regs-only" } */ + +#include <stddef.h> + +extern void exit (int); + +typedef unsigned int uword_t __attribute__ ((mode (__word__))); +typedef int aligned __attribute__((aligned(64))); + +#define IP 0x12345671 +#define CS 0x12345672 +#define FLAGS 0x12345673 +#define SP 0x12345674 +#define SS 0x12345675 + +#define STRING(x) XSTRING(x) +#define XSTRING(x) #x + +struct interrupt_frame +{ + uword_t ip; + uword_t cs; + uword_t flags; + uword_t sp; + uword_t ss; +}; + +int +check_int (int *i, int align) +{ + *i = 20; + if ((((ptrdiff_t) i) & (align - 1)) != 0) + __builtin_abort (); + return *i; +} + +__attribute__((interrupt, used)) +void +fn (struct interrupt_frame *frame) +{ + aligned i; + if (check_int (&i, __alignof__(i)) != i) + __builtin_abort (); + + if (IP != frame->ip) + __builtin_abort (); + if (CS != frame->cs) + __builtin_abort (); + if (FLAGS != frame->flags) + __builtin_abort (); + if (SP != frame->sp) + __builtin_abort (); + if (SS != frame->ss) + __builtin_abort (); + + exit (0); +} + +int +main () +{ + asm ("push $" STRING (SS) "; \ + push $" STRING (SP) "; \ + push $" STRING (FLAGS) "; \ + push $" STRING (CS) "; \ + push $" STRING (IP) "; \ + jmp fn"); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr68661-1a.c b/gcc/testsuite/gcc.dg/torture/pr68661-1a.c new file mode 100644 index 00000000000..b343844185f --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr68661-1a.c @@ -0,0 +1,18 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-mgeneral-regs-only" } */ +/* { dg-additional-sources pr68661-1b.c } */ + +extern void bar0 (int, int, int, int, int, int, int, int, int) + __attribute__ ((no_caller_saved_registers)); + +void +foo (void) +{ + bar0 (0, 1, 2, 3, 4, 5, 6, 7, 8); +} + +void +bad (void) +{ + __builtin_abort (); +} diff --git a/gcc/testsuite/gcc.dg/torture/pr68661-1b.c b/gcc/testsuite/gcc.dg/torture/pr68661-1b.c new file mode 100644 index 00000000000..863c16a7365 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr68661-1b.c @@ -0,0 +1,45 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-mgeneral-regs-only" } */ + +extern void foo (void); +extern void bad (void); + +void +__attribute__ ((no_caller_saved_registers)) +bar0 (int i0, int i1, int i2, int i3, int i4, int i5, int i6, + int i7, int i8) +{ + if (i0 != 0) + bad (); + + if (i1 != 1) + bad (); + + if (i2 != 2) + bad (); + + if (i3 != 3) + bad (); + + if (i4 != 4) + bad (); + + if (i5 != 5) + bad (); + + if (i6 != 6) + bad (); + + if (i7 != 7) + bad (); + + if (i8 != 8) + bad (); +} + +int +main () +{ + foo (); + return 0; +} |