<div dir="ltr"><div>-gcc-dev, not because I'm exclusionary, I'm just not sure if cross-posting to it is OK...</div><div><br></div>For what it's worth, there's precedent for this in clang. We already support __attribute__((interrupt)) on ARM and MSP430. Neither of them introduce a new calling convention at the Clang level. I think MSP430 adds one at the LLVM level, but I don't think it matters.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 3, 2015 at 10:37 AM, H.J. Lu via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The interrupt and exception handlers are called by x86 processors.  X86<br>
hardware puts information on stack and calls the handler.  The<br>
requirements are<br>
<br>
1. Both interrupt and exception handlers must use the 'IRET' instruction,<br>
instead of the 'RET' instruction, to return from the handlers.<br>
2. All registers are callee-saved in interrupt and exception handlers.<br>
3. The difference between interrupt and exception handlers is the<br>
exception handler must pop 'ERROR_CODE' off the stack before the 'IRET'<br>
instruction.<br>
<br>
The design goals of interrupt and exception handlers for x86 processors<br>
are:<br>
<br>
1. No new calling convention in compiler.<br>
2. Support both 32-bit and 64-bit modes.<br>
3. Flexible for compilers to optimize.<br>
4. Easy to use by programmers.<br>
<br>
To implement interrupt and exception handlers for x86 processors, a<br>
compiler should support:<br>
<br>
1. void * __builtin_ia32_interrupt_data (void)<br>
<br>
This function returns a pointer to interrupt or exception data pushed<br>
onto the stack by processor.<br>
<br>
The __builtin_frame_address builtin isn't suitable for interrupt and<br>
exception handlers since it returns the stack frame address on the<br>
callee side and compiler may generate a new stack frame for stack<br>
alignment.<br>
<br>
2. 'interrupt' attribute<br>
<br>
Use this attribute to indicate that the specified void function without<br>
arguments is an interrupt handler.  The compiler generates function entry<br>
and exit sequences suitable for use in an interrupt handler when this<br>
attribute is present.  The 'IRET' instruction, instead of the<br>
'RET' instruction, is used to return from interrupt handlers.  All<br>
registers, except for the EFLAGS register which is restored by the<br>
'IRET' instruction, are preserved by the compiler.  The red zone<br>
isn't supported in an interrupt handler; that is an interrupt<br>
handler can't access stack beyond the current stack pointer.<br>
<br>
You can use the builtin '__builtin_ia32_interrupt_data' function to access<br>
data pushed onto the stack by processor:<br>
<br>
void<br>
f () __attribute__ ((interrupt))<br>
{<br>
  void *p = __builtin_ia32_interrupt_data ();<br>
  ...<br>
}<br>
<br>
3. 'exception' attribute<br>
<br>
Use 'exception' instead of 'interrupt' for handlers intended to be<br>
used for 'exception' (i.e. those that must pop 'ERROR_CODE' off the<br>
stack before the 'IRET' instruction):<br>
<br>
void<br>
f () __attribute__ ((exception))<br>
{<br>
  void *p = __builtin_ia32_interrupt_data ();<br>
  ...<br>
}<br>
<br>
Any comments, suggestions?<br>
<br>
Thanks.<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
--<br>
H.J.<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</font></span></blockquote></div><br></div>