(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
guality/
pr25967-1.c
       1  /* { dg-do run { target i?86-*-* x86_64-*-* } } */
       2  /* { dg-options "-g -mgeneral-regs-only" } */
       3  
       4  extern void exit (int);
       5  
       6  typedef unsigned int uword_t __attribute__ ((mode (__word__)));
       7  
       8  #define ERROR		0x12345670
       9  #define IP		0x12345671
      10  #define CS		0x12345672
      11  #define FLAGS		0x12345673
      12  #define SP		0x12345674
      13  #define SS		0x12345675
      14  
      15  #define STRING(x)	XSTRING(x)
      16  #define XSTRING(x)	#x
      17  #define ASMNAME(cname)  ASMNAME2 (__USER_LABEL_PREFIX__, cname)
      18  #define ASMNAME2(prefix, cname) XSTRING (prefix) cname
      19  
      20  struct interrupt_frame
      21  {
      22    uword_t ip;
      23    uword_t cs;
      24    uword_t flags;
      25    uword_t sp;
      26    uword_t ss;
      27  };
      28  
      29  __attribute__((naked, used))
      30  void
      31  fn (void)
      32  {
      33    register uword_t *sp __asm__("sp");
      34    uword_t error = *sp;
      35    struct interrupt_frame *frame = (struct interrupt_frame *) (sp + 1);
      36    if (ERROR != error)		/* BREAK */
      37      __builtin_abort ();
      38    if (IP != frame->ip)
      39      __builtin_abort ();
      40    if (CS != frame->cs)
      41      __builtin_abort ();
      42    if (FLAGS != frame->flags)
      43      __builtin_abort ();
      44    if (SP != frame->sp)
      45      __builtin_abort ();
      46    if (SS != frame->ss)
      47      __builtin_abort ();
      48  
      49    exit (0);
      50  }
      51  
      52  int
      53  main ()
      54  {
      55    asm ("push	$" STRING (SS) ";		\
      56  	push	$" STRING (SP) ";		\
      57  	push	$" STRING (FLAGS) ";		\
      58  	push	$" STRING (CS) ";		\
      59  	push	$" STRING (IP) ";		\
      60  	push	$" STRING (ERROR) ";		\
      61  	jmp	 " ASMNAME ("fn"));
      62    return 0;
      63  }
      64  
      65  /* { dg-final { gdb-test 36 "error" "0x12345670" } } */
      66  /* { dg-final { gdb-test 36 "frame->ip" "0x12345671" } } */
      67  /* { dg-final { gdb-test 36 "frame->cs" "0x12345672" } } */
      68  /* { dg-final { gdb-test 36 "frame->flags" "0x12345673" } } */
      69  /* { dg-final { gdb-test 36 "frame->sp" "0x12345674" } } */
      70  /* { dg-final { gdb-test 36 "frame->ss" "0x12345675" } } */