https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81654

            Bug ID: 81654
           Summary: Should interrupt attribute be allowed together with
                    naked attribute?
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hjl.tools at gmail dot com
                CC: ubizjak at gmail dot com
  Target Milestone: ---

[hjl@gnu-6 naked-1]$ cat x.c
/* { 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
#define ASMNAME(cname)  ASMNAME2 (__USER_LABEL_PREFIX__, cname)
#define ASMNAME2(prefix, cname) XSTRING (prefix) cname

struct interrupt_frame
{
  uword_t ip;
  uword_t cs;
  uword_t flags;
  uword_t sp;
  uword_t ss;
};

__attribute__((interrupt, naked, 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      " ASMNAME ("fn"));
  return 0;
}
[hjl@gnu-6 naked-1]$ make
/export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -O2 -mgeneral-regs-only -c -o
x.o x.c
/export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/gcc/build-x86_64-linux/gcc/   x.o   -o x
./x
make: *** [Makefile:12: all] Segmentation fault
[hjl@gnu-6 naked-1]$

Reply via email to