[PERF]: Make all trap handlers, trap exit code, fatal exit code, and exception dispatch code "no return" since it always leads to an iret or other kind of non-directly-returning mechanism. This allows the compiler to optimize better and also remove useless code at the bottom of the functions. Since __builtin_unreachable is only for GCC 4.5, we use exit(0) for now (it will never be reached) to trick GCC.

svn path=/trunk/; revision=45223
This commit is contained in:
Sir Richard 2010-01-23 23:59:59 +00:00
parent f4cdf7ef0f
commit 280c5bef1e
2 changed files with 46 additions and 1 deletions

View file

@ -214,6 +214,7 @@ KiCheckForApcDelivery(IN PKTRAP_FRAME TrapFrame)
VOID
FORCEINLINE
DECLSPEC_NORETURN
KiDispatchException0Args(IN NTSTATUS Code,
IN ULONG_PTR Address,
IN PKTRAP_FRAME TrapFrame)
@ -224,6 +225,7 @@ KiDispatchException0Args(IN NTSTATUS Code,
VOID
FORCEINLINE
DECLSPEC_NORETURN
KiDispatchException1Args(IN NTSTATUS Code,
IN ULONG_PTR Address,
IN ULONG P1,
@ -235,6 +237,7 @@ KiDispatchException1Args(IN NTSTATUS Code,
VOID
FORCEINLINE
DECLSPEC_NORETURN
KiDispatchException2Args(IN NTSTATUS Code,
IN ULONG_PTR Address,
IN ULONG P1,
@ -247,6 +250,7 @@ KiDispatchException2Args(IN NTSTATUS Code,
FORCEINLINE
VOID
DECLSPEC_NORETURN
KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame)
{
/* Restore nonvolatiles, EAX, and do a "jump" back to the kernel caller */
@ -272,10 +276,12 @@ KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame)
[v] "i"(KTRAP_FRAME_ESP)
: "%esp"
);
exit(0);
}
FORCEINLINE
VOID
DECLSPEC_NORETURN
KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame)
{
/* Regular interrupt exit, but we only restore EAX as a volatile */
@ -299,10 +305,12 @@ KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame)
[e] "i"(KTRAP_FRAME_EIP)
: "%esp"
);
exit(0);
}
FORCEINLINE
VOID
DECLSPEC_NORETURN
KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame)
{
/* Restore nonvolatiles, EAX, and do a SYSEXIT back to the user caller */
@ -330,10 +338,12 @@ KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame)
[v] "i"(KTRAP_FRAME_V86_ES)
: "%esp"
);
exit(0);
}
FORCEINLINE
VOID
DECLSPEC_NORETURN
KiTrapReturn(IN PKTRAP_FRAME TrapFrame)
{
/* Regular interrupt exit */
@ -361,10 +371,12 @@ KiTrapReturn(IN PKTRAP_FRAME TrapFrame)
[e] "i"(KTRAP_FRAME_EIP)
: "%esp"
);
exit(0);
}
FORCEINLINE
VOID
DECLSPEC_NORETURN
KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame)
{
/* Regular interrupt exit */
@ -393,6 +405,7 @@ KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame)
[e] "i"(KTRAP_FRAME_ERROR_CODE) /* We *WANT* the error code since ESP is there! */
: "%esp"
);
exit(0);
}
NTSTATUS

View file

@ -50,6 +50,7 @@ UCHAR KiTrapIoTable[] =
VOID
FASTCALL
DECLSPEC_NORETURN
KiExitTrap(IN PKTRAP_FRAME TrapFrame,
IN UCHAR Skip)
{
@ -235,6 +236,7 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
{
/* Disable interrupts until we return */
@ -249,6 +251,7 @@ KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiServiceExit(IN PKTRAP_FRAME TrapFrame,
IN NTSTATUS Status)
{
@ -267,6 +270,7 @@ KiServiceExit(IN PKTRAP_FRAME TrapFrame,
VOID
FASTCALL
DECLSPEC_NORETURN
KiServiceExit2(IN PKTRAP_FRAME TrapFrame)
{
/* Disable interrupts until we return */
@ -423,6 +427,7 @@ KiEnterTrap(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiSystemFatalException(IN ULONG ExceptionCode,
IN PKTRAP_FRAME TrapFrame)
{
@ -437,6 +442,7 @@ KiSystemFatalException(IN ULONG ExceptionCode,
VOID
NTAPI
DECLSPEC_NORETURN
KiDispatchExceptionFromTrapFrame(IN NTSTATUS Code,
IN ULONG_PTR Address,
IN ULONG ParameterCount,
@ -477,6 +483,7 @@ KiDispatchExceptionFromTrapFrame(IN NTSTATUS Code,
VOID
FASTCALL
DECLSPEC_NORETURN
KiDebugHandler(IN PKTRAP_FRAME TrapFrame,
IN ULONG Parameter1,
IN ULONG Parameter2,
@ -500,6 +507,7 @@ KiDebugHandler(IN PKTRAP_FRAME TrapFrame,
VOID
FASTCALL
DECLSPEC_NORETURN
KiNpxHandler(IN PKTRAP_FRAME TrapFrame,
IN PKTHREAD Thread,
IN PFX_SAVE_AREA SaveArea)
@ -656,6 +664,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame,
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap00Handler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -675,6 +684,7 @@ KiTrap00Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap01Handler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -694,6 +704,7 @@ KiTrap01Handler(IN PKTRAP_FRAME TrapFrame)
}
VOID
DECLSPEC_NORETURN
KiTrap02(VOID)
{
PKTSS Tss, NmiTss;
@ -840,6 +851,7 @@ KiTrap02(VOID)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap03Handler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -851,6 +863,7 @@ KiTrap03Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap04Handler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -870,6 +883,7 @@ KiTrap04Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap05Handler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -892,6 +906,7 @@ KiTrap05Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap06Handler(IN PKTRAP_FRAME TrapFrame)
{
PUCHAR Instruction;
@ -937,6 +952,7 @@ KiTrap06Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap07Handler(IN PKTRAP_FRAME TrapFrame)
{
PKTHREAD Thread, NpxThread;
@ -1046,6 +1062,7 @@ KiTrap07Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap08Handler(IN PKTRAP_FRAME TrapFrame)
{
/* FIXME: Not handled */
@ -1054,6 +1071,7 @@ KiTrap08Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap09Handler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -1066,6 +1084,7 @@ KiTrap09Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap0AHandler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -1080,6 +1099,7 @@ KiTrap0AHandler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap0BHandler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -1092,6 +1112,7 @@ KiTrap0BHandler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap0CHandler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -1104,6 +1125,7 @@ KiTrap0CHandler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame,
IN ULONG EFlags)
{
@ -1388,6 +1410,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame,
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap0EHandler(IN PKTRAP_FRAME TrapFrame)
{
PKTHREAD Thread;
@ -1510,6 +1533,7 @@ KiTrap0EHandler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap0FHandler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -1520,9 +1544,9 @@ KiTrap0FHandler(IN PKTRAP_FRAME TrapFrame)
KiSystemFatalException(EXCEPTION_RESERVED_TRAP, TrapFrame);
}
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap10Handler(IN PKTRAP_FRAME TrapFrame)
{
PKTHREAD Thread;
@ -1550,6 +1574,7 @@ KiTrap10Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap11Handler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -1562,6 +1587,7 @@ KiTrap11Handler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiTrap13Handler(IN PKTRAP_FRAME TrapFrame)
{
PKTHREAD Thread;
@ -1664,6 +1690,7 @@ KiCallbackReturnHandler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiRaiseAssertionHandler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -1680,6 +1707,7 @@ KiRaiseAssertionHandler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiDebugServiceHandler(IN PKTRAP_FRAME TrapFrame)
{
/* Save trap frame */
@ -1694,6 +1722,7 @@ KiDebugServiceHandler(IN PKTRAP_FRAME TrapFrame)
VOID
FASTCALL
DECLSPEC_NORETURN
KiSystemCall(IN ULONG SystemCallNumber,
IN PVOID Arguments)
{
@ -1784,6 +1813,7 @@ ExitCall:
VOID
FORCEINLINE
DECLSPEC_NORETURN
KiSystemCallHandler(IN PKTRAP_FRAME TrapFrame,
IN ULONG ServiceNumber,
IN PVOID Arguments,
@ -1825,6 +1855,7 @@ KiSystemCallHandler(IN PKTRAP_FRAME TrapFrame,
VOID
__attribute__((regparm(3)))
DECLSPEC_NORETURN
KiFastCallEntryHandler(IN ULONG ServiceNumber,
IN PVOID Arguments,
IN PKTRAP_FRAME TrapFrame)
@ -1858,6 +1889,7 @@ KiFastCallEntryHandler(IN ULONG ServiceNumber,
VOID
__attribute__((regparm(3)))
DECLSPEC_NORETURN
KiSystemServiceHandler(IN ULONG ServiceNumber,
IN PVOID Arguments,
IN PKTRAP_FRAME TrapFrame)