On Tue, Aug 1, 2017 at 11:05 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Tue, Aug 1, 2017 at 1:49 PM, Uros Bizjak <ubiz...@gmail.com> wrote: >> On Tue, Aug 1, 2017 at 9:46 PM, H.J. Lu <hongjiu...@intel.com> wrote: >>> Add some tests for implementing interrupt handlers with naked attribute. >>> >>> OK for trunk? >>> >>> H.J. >>> --- >>> * gcc.dg/guality/pr25967-1.c: New test. >>> * gcc.dg/guality/pr25967-2.c: Likewise. >>> * gcc.dg/torture/pr25967-1.c: Likewise. >>> * gcc.dg/torture/pr25967-2.c: Likewise. >> >> OK with a small change below. >> > >>> +void >>> +fn (void) >>> +{ >>> + struct interrupt_frame *frame; >>> + uword_t error; >>> + asm ("lea " WORD_SIZE "(%%" STACK_POINTER "), %0" : "=r" (frame) : ); >>> + asm ("mov (%%" STACK_POINTER "), %0" : "=r" (error) : ); >> >> The above two asm needs to be volatile. They are not "simple" asm, and >> access stack pointer behind the compilers back. And please merge them >> to one multi-line volatile asm statement. >> > > > This is what I am checking in.
OTOH, these asms can be avoided with something like: --cut here-- typedef unsigned int uword_t __attribute__ ((mode (__word__))); struct interrupt_frame { uword_t ip; uword_t cs; uword_t flags; uword_t sp; uword_t ss; }; void __attribute__((naked)) test (void) { register uword_t sp __asm__("sp"); long *error = (long *) sp; struct interrupt_frame *frame = (struct interrupt_frame *) (sp + sizeof (uword_t)); ... } Uros.