(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
torture/
pr25967-2.c
       1  /* { dg-do run { target i?86-*-* x86_64-*-* } } */
       2  /* { dg-skip-if "PR81693 sp not aligned to 16 bytes" { "*-*-darwin*" } } */
       3  /* { dg-options "-mgeneral-regs-only" } */
       4  
       5  extern void exit (int);
       6  
       7  typedef unsigned int uword_t __attribute__ ((mode (__word__)));
       8  
       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    struct interrupt_frame *frame = (struct interrupt_frame *) sp;
      35    if (IP != frame->ip)		/* BREAK */
      36      __builtin_abort ();
      37    if (CS != frame->cs)
      38      __builtin_abort ();
      39    if (FLAGS != frame->flags)
      40      __builtin_abort ();
      41    if (SP != frame->sp)
      42      __builtin_abort ();
      43    if (SS != frame->ss)
      44      __builtin_abort ();
      45  
      46    exit (0);
      47  }
      48  
      49  int
      50  main ()
      51  {
      52    asm ("push	$" STRING (SS) ";		\
      53  	push	$" STRING (SP) ";		\
      54  	push	$" STRING (FLAGS) ";		\
      55  	push	$" STRING (CS) ";		\
      56  	push	$" STRING (IP) ";		\
      57  	jmp	 " ASMNAME ("fn"));
      58    return 0;
      59  }