Changeset View
Changeset View
Standalone View
Standalone View
cfe/trunk/include/clang/Basic/AttrDocs.td
Show First 20 Lines • Show All 1,853 Lines • ▼ Show 20 Lines | .. code-block: c++ | ||||
public: | public: | ||||
int foo1() override { | int foo1() override { | ||||
return callee(); // This call is tail-call optimized. | return callee(); // This call is tail-call optimized. | ||||
} | } | ||||
}; | }; | ||||
}]; | }]; | ||||
} | } | ||||
def AnyX86InterruptDocs : Documentation { | |||||
let Category = DocCatFunction; | |||||
let Content = [{ | |||||
Clang supports the GNU style ``__attribute__((interrupt))`` attribute on | |||||
x86/x86-64 targets.The compiler generates function entry and exit sequences | |||||
suitable for use in an interrupt handler when this attribute is present. | |||||
The 'IRET' instruction, instead of the 'RET' instruction, is used to return | |||||
from interrupt or exception handlers. All registers, except for the EFLAGS | |||||
register which is restored by the 'IRET' instruction, are preserved by the | |||||
compiler. | |||||
Any interruptible-without-stack-switch code must be compiled with | |||||
-mno-red-zone since interrupt handlers can and will, because of the | |||||
hardware design, touch the red zone. | |||||
1. interrupt handler must be declared with a mandatory pointer argument: | |||||
.. code-block:: c | |||||
struct interrupt_frame | |||||
{ | |||||
uword_t ip; | |||||
uword_t cs; | |||||
uword_t flags; | |||||
uword_t sp; | |||||
uword_t ss; | |||||
}; | |||||
__attribute__ ((interrupt)) | |||||
void f (struct interrupt_frame *frame) { | |||||
... | |||||
} | |||||
2. exception handler: | |||||
The exception handler is very similar to the interrupt handler with | |||||
a different mandatory function signature: | |||||
.. code-block:: c | |||||
__attribute__ ((interrupt)) | |||||
void f (struct interrupt_frame *frame, uword_t error_code) { | |||||
... | |||||
} | |||||
and compiler pops 'ERROR_CODE' off stack before the 'IRET' instruction. | |||||
The exception handler should only be used for exceptions which push an | |||||
error code and all other exceptions must use the interrupt handler. | |||||
The system will crash if the wrong handler is used. | |||||
}]; | |||||
} |