Use local labels in the inline asm code to avoid a clash when building with link-time code generation.
[PSEH]
Do not push memory operands with ESP as the base register (can happen when compiling with some GCC options), load arguments into registers.
Fix formatting.
svn path=/trunk/; revision=55628
* Fix several modules to compile with the recent gcc versions.
* ReactOS now compiles with mingw-w64 gcc 4.6.0 and boots to shell.
* Dedicated to dreimer.
svn path=/trunk/; revision=52114
Trampoline-related definitions are no longer necessary in the public header
modified lib/pseh/i386/framebased-gcchack.c
Don't use byte arrays when you mean unaligned field, Arch: use __attribute__((packed)) instead, and gcc will thank you for not violating strong aliasing
svn path=/trunk/; revision=42737
Notorious ass-clown Arch Blackmann forgot to pop the trylevel that handled an exception. Subsequent throws would keep being caught by the same trylevel over and over again, and infinite loops are indeed possible. Eat shit and die, Arch
If test_bug_4663 test in the PSEH2 test suite is actually representative of the bug, the bug itself may have been fixed
svn path=/trunk/; revision=41815
added lib/pseh/i386/framebased-gcchack-asm.S
added lib/pseh/i386/framebased-gcchack.c
deleted lib/pseh/i386/framebased-gcchack.S
modified lib/pseh/pseh.rbuild
framebased-gcchack.c is irreversibly married to the x86 architecture. Move it to the appropriate place
Rename framebased-gcchack.S because its base name now conflicts with framebased-gcchack.c
svn path=/trunk/; revision=38760
modified lib/pseh/framebased-gcchack.c
modified lib/pseh/i386/framebased-gcchack.S
Don't save just ESP and EBP, save all volatile registers because we might catch an exception thrown by another frame and end up clobbering all volatile registers (thanks to Dmitry Gorbachev for bug report and test case)
Conversely, save volatile registers for _SEH2_EXCEPT scopes only
Specialized frame setup routines, to reduce the amount of inline code and only de-optimize when strictly necessary
svn path=/trunk/; revision=38668
modified lib/pseh/framebased-gcchack.c
Call _SEH2EnterFrame before any goto. Gotos confuse GCC's flow control analysis making it disregard the returns_twice attribute on _SEH2EnterFrame. We avoid redundant inline code (NULL-initializing the top trylevel pointer) by modifying the library accordingly
svn path=/trunk/; revision=38480
modified lib/pseh/i386/framebased-gcchack.S
Correctly handle exceptions thrown during unwinding
Renamed some internal routines to more appropriate names
svn path=/trunk/; revision=38460
modified lib/pseh/framebased-gcchack.c
modified lib/pseh/i386/framebased-gcchack.S
(Re)added arguments to _SEH2_EXCEPT nested routines, so that using _SEH2_GetExceptionCode and _SEH2_GetExceptionInformation in exception filters doesn't force the creation of function trampolines (and related horrid inline code)
Reimplemented some internal library routines in C
svn path=/trunk/; revision=38295
modified lib/pseh/i386/framebased-gcchack.S
For some reason, "call _RtlUnwind@16" is being linked as "call 0" (very likely a linker bug). Reimplementing _SEH2GlobalUnwind in C and taking the address of RtlUnwind from C code seems to work
Annotate functions implemented in assembler with .func/.endfunc, so the symbols are more correct
svn path=/trunk/; revision=38208
modified include/reactos/libs/pseh/pseh2.h
modified lib/pseh/framebased-gcchack.c
modified lib/pseh/i386/framebased-gcchack.S
Disassemble trampolines in the library, instead of the macros. Results in better, smaller code. As a side effect, PSEH no longer requires a trampoline for nested functions - which results in even better, even smaller code in many common cases where the nested functions don't use any variables from the containing function
Simulate a no-op setjmp so that GCC correctly handles variables in registers, instead of surprise-corrupting random variables in random conditions
Save EBP and ESP every time a _SEH2_TRY/_SEH2_EXCEPT is entered, instead of only the first time. Probably not entirely correct yet
Don't generate a nested function for a _SEH2_EXCEPT() filter expression if the value is a compile-time constant: convert the value to (void *)0, (void *)1 or (void *)-1, and set that as the filter, instead (like Visual C++ does, incidentally)
If a _SEH2_EXCEPT() filter expression is a compile-time constant evaluating to EXCEPTION_CONTINUE_EXECUTION or EXCEPTION_CONTINUE_SEARCH, allow GCC to optimize out the body of the _SEH2_EXCEPT (because it'd be unreachable). This should really result in a compile-time warning, but #pragma message is unsupported in GCC 4.1.3
Let _SEH2_EXCEPT() accept a comma expression as filter expression (e.g. _SEH2_EXCEPT(MessageBox(...), EXCEPTION_EXECUTE_HANDLER) instead of _SEH2_EXCEPT((MessageBox(...), EXCEPTION_EXECUTE_HANDLER)))
Small optimizations in PSEH library
Clean up GCC hacks
Remove currently unused PSEH 3 hacks
svn path=/trunk/; revision=38197
modified include/reactos/libs/pseh/pseh2.h
modified lib/pseh/framebased-gcchack.c
modified lib/pseh/i386/framebased-gcchack.S
Disassemble trampolines in the library, instead of the macros. Results in better, smaller code. As a side effect, PSEH no longer requires a trampoline for nested functions - which results in even better, even smaller code in many common cases where the nested functions don't use any variables from the containing function
Simulate a no-op setjmp so that GCC correctly handles variables in registers, instead of surprise-corrupting random variables in random conditions
Save EBP every time a _SEH2_TRY/_SEH2_EXCEPT is entered, instead of only the first time: correctly handles code compiled with -fomit-frame-pointers
Don't generate a nested function for a _SEH2_EXCEPT() filter expression if the value is a compile-time constant: convert the value to (void *)0, (void *)1 or (void *)-1, and set that as the filter, instead (like Visual C++ does, incidentally)
If a _SEH2_EXCEPT() filter expression is a compile-time constant evaluating to EXCEPTION_CONTINUE_EXECUTION or EXCEPTION_CONTINUE_SEARCH, allow GCC to optimize out the body of the _SEH2_EXCEPT (because it'd be unreachable). This should really result in a compile-time warning, but #pragma message is unsupported in GCC 4.1.3
Let _SEH2_EXCEPT() accept a comma expression as filter expression (e.g. _SEH2_EXCEPT(MessageBox(...), EXCEPTION_EXECUTE_HANDLER) instead of _SEH2_EXCEPT((MessageBox(...), EXCEPTION_EXECUTE_HANDLER)))
Small optimizations in PSEH library
Clean up GCC hacks
Remove currently unused PSEH 3 hacks
svn path=/trunk/; revision=38084
modified lib/pseh/framebased-gcchack.c
Disassemble trampolines in the library, instead of the macros. Results in better, smaller code. As a side effect, PSEH no longer requires a trampoline for nested functions - which results in even better, even smaller code in many common cases where the nested functions don't use any variables from the containing function
Simulate a no-op setjmp so that GCC correctly handles variables in registers, instead of surprise-corrupting random variables in random conditions
Save EBP every time a _SEH2_TRY/_SEH2_EXCEPT is entered, instead of only the first time: correctly handles code compiled with -fomit-frame-pointers
Don't generate a nested function for a _SEH2_EXCEPT() filter expression if the value is a compile-time constant: convert the value to (void *)0, (void *)1 or (void *)-1, and set that as the filter, instead (like Visual C++ does, incidentally)
If a _SEH2_EXCEPT() filter expression is a compile-time constant evaluating to EXCEPTION_CONTINUE_EXECUTION or EXCEPTION_CONTINUE_SEARCH, allow GCC to optimize out the body of the _SEH2_EXCEPT (because it'd be unreachable). This should really result in a compile-time warning, but #pragma message is unsupported in GCC 4.1.3
Let _SEH2_EXCEPT() accept a comma expression as filter expression (e.g. _SEH2_EXCEPT(MessageBox(...), EXCEPTION_EXECUTE_HANDLER) instead of _SEH2_EXCEPT((MessageBox(...), EXCEPTION_EXECUTE_HANDLER)))
Small optimizations in PSEH library
Clean up GCC hacks
Remove currently unused PSEH 3 hacks
svn path=/trunk/; revision=38081
modified lib/pseh/i386/framebased-gcchack.S
Correctly chain exceptions raised during unwinding by "finally" blocks
Sanitize direction flag before any C code is executed, just to be totally safe
Clean up code
svn path=/trunk/; revision=38069
If the compiler is not GCC, assume native SEH support
modified lib/pseh/framebased-gcchack.c
modified lib/pseh/i386/framebased-gcchack.S
Allow pseh to be compiled with Visual C++ without warnings
svn path=/trunk/; revision=37663
Make SF_FramePointer field of _SEHFrame_t volatile, too, just to be safe
Unoptimized compilation doesn't perform const-folding - "static const" could result in compilation errors, use just "const"
Renamed _SEH2_GetExceptionPointers to _SEH2_GetExceptionInformation to be closer to the "standard" SEH syntax
modified lib/pseh/framebased-gcchack.c
Clobber the register that's actually used
svn path=/trunk/; revision=37570
added lib/pseh/framebased-gcchack.c
added lib/pseh/i386/framebased-gcchack.S
modified lib/pseh/pseh.rbuild
Introducing PSEH 2.0. It only wants to be loved. Highlights of this version:
- PSEH 2.0 syntax is 99% compatible with native SEH syntax
- PSEH 2.0 binary code a vast improvement over 1.1 - no more setjmp, no bogus loops, no weird optimizer behavior
PSEH 2.0 is a horrible, GCC-only, x86-only hack. It makes several non-portable assumptions and hey, did you know __builtin_frame_address(0) is *not* the same thing as EBP? Overall, it must be a world record for compiler abuse
PSEH 2.0 is, sadly, not binary-compatible with PSEH 1.1, although I will almost certainly unify the implementation at a later time
PSEH 2.0 needs testers. And love.
Not implemented yet: returning from a SEH block (i.e. _SEH2_YIELD())
Example of 2.0 syntax (yes, _SEH2_END is unavoidable):
_SEH2_TRY
{
_SEH2_TRY
{
/* ... */
}
_SEH2_EXCEPT((/* ... */))
{
/* ... */
}
_SEH2_END;
}
_SEH2_FINALLY
{
/* ... */
}
_SEH2_END;
--
Happy early birthday, Aleksey.
svn path=/trunk/; revision=37315
are indeed still stubs or WIP code.
Some people have been interested in helping out from some time and I'm sorry
I haven't been able to do this merge finally for a while.
svn path=/trunk/; revision=29407
- Rename framebased.asm to framebased.S and write in GAS compatible assembly, instead of using nasmw.
- Fix WDK compatibility.
svn path=/trunk/; revision=28221
!!! ATTENTION PSEH USERS - new features & a change in rules !!!
modified include/reactos/libs/pseh/framebased.h
modified include/reactos/libs/pseh/framebased/internal.h
deleted include/reactos/libs/pseh/setjmp.h
modified lib/pseh/framebased.c
deleted lib/pseh/i386/setjmp.asm
modified lib/pseh/pseh.rbuild
Big PSEH revamp. If God is kind and merciful, this might be the last revision to PSEH ever
!!! RULE CHANGE !!! Obsoleted _SEH_NO_NATIVE_NLG, do NOT use it anymore, it will now cause fatal compile-time errors
!!! RULE CHANGE !!! As a side effect to the fix for a bug where a _SEH_TRY nested in a _SEH_HANDLE would lead to stack corruption, using "return" or "goto" from anywhere inside a PSEH block is now FORBIDDEN; all code that already did has been fixed in this revision
!!! NEW FEATURE !!! To leave a PSEH block from anywhere inside it, use the new _SEH_YIELD(<statement>) macro; examples: _SEH_YIELD(return value), _SEH_YIELD(goto label), _SEH_YIELD(returnvalue = value; goto label); ALWAYS ensure a _SEH_YIELD() leads outside the top-level _SEH_TRY block - do NOT goto into an ancestor _SEH_TRY block!!! Also note that _SEH_YIELD() disables SEH protection for the enclosed statement, so do NOT perform operations that might throw exceptions inside a _SEH_YIELD(); finally, ensure the enclosed statement does NOT allow execution to continue, or _SEH_YIELD() will get in an infinite loop; bear with me, for I have done the impossible, so don't expect miracles
Don't use a fake setjmp/longjmp *ever*, too dangerous; removed _SEHLongJmp & _SEHSetJmp, obsoleted _SEH_NO_NATIVE_NLG
On GCC, use __builtin_setjmp/__builtin_longjmp instead of setjmp/longjmp; they produce efficient code that plays well with optimizations, require no external library and are designed specifically for exception handling; should result in faster code and no hidden bugs
Use inline code to enter/leave trylevels; yields much better binary code
Inline handlers inside _SEH_PortableFrame_t instead of pointing to them; yields better code for the most common usages
Turn all top-level statements generated by macros from bare scopes into for loops, to ensure they are used correctly as stand-alone statements
Removed bitrotten old syntax, because it wasn't being used nor maintained
modified dll/3rdparty/freetype/freetype.rbuild
modified dll/win32/kernel32/kernel32.rbuild
modified drivers/network/tcpip/tcpip.rbuild
modified lib/drivers/ip/ip.rbuild
modified lib/rtl/rtl.rbuild
modified ntoskrnl/ntoskrnl.rbuild
modified subsystems/win32/win32k/win32k.rbuild
Removed obsolete _SEH_NO_NATIVE_NLG define
modified drivers/network/afd/afd/lock.c
modified drivers/network/afd/afd/tdi.c
modified subsystems/csr/csrsrv/api.c
modified subsystems/win32/win32k/ntuser/clipboard.c
modified subsystems/win32/win32k/ntuser/window.c
Use the new _SEH_YIELD macro to return/goto from SEH blocks
modified tools/rbuild/backend/mingw/modulehandler.cpp
modified tools/rbuild/backend/mingw/modulehandler.h
modified tools/rbuild/module.cpp
modified tools/rbuild/project.dtd
modified tools/rbuild/rbuild.h
Don't use the obsolete _SEH_NO_NATIVE_NLG flag anymore
Only add underscores to imported symbols when module is marked underscoresymbols="true"; fixes debugsup and, indirectly, PSEH tracing
modified lib/3rdparty/mingw/mingw.rbuild
Build with underscoresymbols="true"
svn path=/trunk/; revision=26224
modified lib/pseh/framebased.c
- _SEH_ENABLE_TRACE now obsolete; _SEH_ENABLE_TRACE_LIB renamed to _SEH_ENABLE_TRACE now that the name is available again. Yay open source development model and yay me
svn path=/trunk/; revision=25917
- final reformatting/cleanup fixes
- fixed regression introduced in 25908
modified include/reactos/libs/pseh/framebased.h
modified include/reactos/libs/pseh/framebased/internal.h
modified lib/pseh/framebased.c
- per-frame tracing support for PSEH. Prints detailed debugging traces with DbgPrint when enabled. New defines _SEH_ENABLE_TRACE, _SEH_ENABLE_TRACE_LIB and _SEH_DO_DEFAULT_TRACING, new macros _SEH_EnableTracing() and _SEH_DisableTracing(), new constants _SEH_DO_TRACE_XXX. Please test it
See issue #2069 for more details.
svn path=/trunk/; revision=25915
Removed some bad optimization ideas that never worked anyway. If you want optimization, use the uglier _SEHX macros. If you enjoy several huge, non-optimizable nested loops in all of your functions, just keep using the _SEH form
deleted include/reactos/libs/pseh/native.h
deleted include/reactos/libs/pseh/prettybased.h
Deleted some really bad ideas that nobody used or maintained anyway
All and all else
Reformatted. Goodbye one-space indentation, hello tabs
svn path=/trunk/; revision=25908