Commit Graph
73 Commits
Author SHA1 Message Date
Amine Khaldi 818418643e * Rbuild, our build system, has served us well so far, but its usefulness has since been vastly overshadowed by its awfulness. It's time to fix it.
svn path=/trunk/; revision=55855
2012-02-25 17:23:37 +00:00
Dmitry Gorbachev 426717cc3c [WIN32K]
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
2012-02-16 07:37:27 +00:00
Dmitry Gorbachev a60242cfe7 Fix more unused-but-set warnings.
svn path=/trunk/; revision=53759
2011-09-19 14:41:04 +00:00
Amine Khaldi 6b9d48d482 * Comment out some unused but set variables, remove some others.
* Allow warnings for some 3rd party code.

svn path=/trunk/; revision=53691
2011-09-11 15:39:19 +00:00
Timo Kreuzer 116862c485 [PSEH]
Fix amd64 build of pseh

svn path=/trunk/; revision=52120
2011-06-06 19:03:53 +00:00
Amine Khaldi 377dc192bb [CMAKE]
* 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
2011-06-06 11:44:58 +00:00
Timo Kreuzer fae2044a23 [CMAKE]
Integrate cmake stuff into trunk
Only files added.

svn path=/trunk/; revision=51783
2011-05-16 13:12:07 +00:00
Timo Kreuzer 88499392ee [PSEH]
Stub amd64 functions and remove leading underscores from symbols

svn path=/trunk/; revision=48207
2010-07-23 02:18:30 +00:00
Timo Kreuzer 66365c895c [PSEH]
Add (non working) 64bit code

svn path=/trunk/; revision=48206
2010-07-23 01:36:44 +00:00
KJK::Hyperion 9aacc392d5 modified include/reactos/libs/pseh/pseh2.h
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
2009-08-16 16:40:52 +00:00
KJK::Hyperion 488bf13922 modified lib/pseh/i386/framebased-gcchack.c
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
2009-07-08 20:32:50 +00:00
KJK::Hyperion d53c35b02b No reason to compile PSEH2 with other compilers than GCC
svn path=/trunk/; revision=41607
2009-06-25 10:27:57 +00:00
KJK::Hyperion d62fc8535e deleted lib/pseh/framebased-gcchack.c
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
2009-01-14 14:51:23 +00:00
KJK::Hyperion d728ecb2ca modified include/reactos/libs/pseh/pseh2.h
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
2009-01-09 16:36:21 +00:00
KJK::Hyperion 85084975fe modified include/reactos/libs/pseh/pseh2.h
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
2008-12-30 21:05:36 +00:00
KJK::Hyperion 26d5b48792 modified lib/pseh/framebased-gcchack.c
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
2008-12-30 04:00:45 +00:00
KJK::Hyperion f72b85bdf7 modified include/reactos/libs/pseh/pseh2.h
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
2008-12-23 02:45:25 +00:00
KJK::Hyperion e5a9f1615f modified lib/pseh/framebased-gcchack.c
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
2008-12-20 23:27:17 +00:00
KJK::Hyperion e6f465bb78 Supersedes r38084. Take three
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
2008-12-20 13:05:57 +00:00
KJK::Hyperion 41dd7167ea Revert r38084
Sigh.

svn path=/trunk/; revision=38085
2008-12-14 22:44:33 +00:00
KJK::Hyperion 41467cc1ad Supersedes r38081
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
2008-12-14 21:50:31 +00:00
KJK::Hyperion 966a02f90b Revert r38081
svn path=/trunk/; revision=38082
2008-12-14 19:54:52 +00:00
KJK::Hyperion 0d1b89e5c2 modified include/reactos/libs/pseh/pseh2.h
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
2008-12-14 19:49:05 +00:00
KJK::Hyperion 0cb750adfa modified lib/pseh/framebased-gcchack.c
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
2008-12-14 02:55:50 +00:00
KJK::Hyperion bd76ae91c0 modified lib/pseh/i386/framebased-gcchack.S
Typo

svn path=/trunk/; revision=37664
2008-11-26 16:15:29 +00:00
KJK::Hyperion 58c81ba194 modified include/reactos/libs/pseh/pseh2.h
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
2008-11-26 16:03:12 +00:00
KJK::Hyperion 0022cb57c0 Missing from previous commit
svn path=/trunk/; revision=37604
2008-11-24 01:38:43 +00:00
KJK::Hyperion 7d4a8b9e1c modified include/reactos/libs/pseh/pseh2.h
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
2008-11-23 00:20:37 +00:00
KJK::Hyperion e7584f9a3e modified include/reactos/libs/pseh/pseh2.h
modified   lib/pseh/framebased-gcchack.c
modified   lib/pseh/i386/framebased-gcchack.S
   Implemented _SEH2_YIELD and _SEH2_LEAVE - 2.0 equivalents of _SEH_YIELD and _SEH_LEAVE, naturally

svn path=/trunk/; revision=37318
2008-11-12 20:39:18 +00:00
KJK::Hyperion bcf160f2b8 added include/reactos/libs/pseh/pseh2.h
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
2008-11-12 19:52:16 +00:00
Art Yerkes 66aabe3049 Do this properly now that I understand exception chaining a bit better.
The exception chain on x86 is at fs:0.  We use r13 to simulate the same, so
we chain exceptions at 0(13)

svn path=/trunk/; revision=30105
2007-11-04 11:57:37 +00:00
Hervé Poussineau aabdae9d56 No need to define __USE_W32API
svn path=/trunk/; revision=29815
2007-10-23 08:12:28 +00:00
Art Yerkes 0abf169695 All remaining changes from the PPC branch. Not well tested yet. Many things
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
2007-10-06 07:53:20 +00:00
Hervé Poussineau 4b912ebbbc Clean up .rbuild files and make them xml compliant
Inspired by bug 2627

svn path=/trunk/; revision=29036
2007-09-14 17:07:53 +00:00
Hervé Poussineau b2454a486f Make some i386 code conditional
Add missing svn:eol-style=native property

svn path=/trunk/; revision=28778
2007-09-02 18:05:16 +00:00
Aleksey Bragin 735dbb12c6 - Add RtlUnwind to headers, and make list.h MSVC-compatible.
- Rename framebased.asm to framebased.S and write in GAS compatible assembly, instead of using nasmw.
- Fix WDK compatibility.

svn path=/trunk/; revision=28221
2007-08-07 20:11:21 +00:00
KJK::Hyperion 643b171651 !!! ATTENTION EVERYONE - do a make clean after getting this revision !!!
!!! 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
2007-04-01 00:07:25 +00:00
KJK::Hyperion f007c58ba9 modified include/reactos/libs/pseh/framebased.h
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
2007-02-28 00:22:08 +00:00
KJK::Hyperion 53d575c73e modified include/reactos/libs/pseh/framebased.h
- 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
2007-02-28 00:04:36 +00:00
KJK::Hyperion 35f897c768 Reformatted, for real
svn path=/trunk/; revision=25909
2007-02-26 15:55:43 +00:00
KJK::Hyperion 97f61ad508 modified include/reactos/libs/pseh/framebased.h
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
2007-02-26 15:32:19 +00:00
Hervé Poussineau f9b6e910f9 Better support for non X86 systems
svn path=/trunk/; revision=25264
2007-01-01 14:50:16 +00:00
Art Yerkes a93d77a47f Change remaining .xml build files to .rbuild and fixup links.
svn path=/trunk/; revision=21147
2006-02-18 19:21:01 +00:00
Thomas Bluemel 5bd4220e33 fixed warnings when compiled with -Wmissing-declarations
svn path=/trunk/; revision=18302
2005-10-06 21:39:18 +00:00
Thomas Bluemel 209e4c128e silence debug messages when calling the SEH handler
svn path=/trunk/; revision=16877
2005-07-29 17:35:22 +00:00
Alex Ionescu ad3464c9a6 - Some more PSDK compatibility fixes
- Misc cleanup...

svn path=/trunk/; revision=16792
2005-07-27 06:18:52 +00:00
Martin Fuchs 66fd6f0880 set eol-style for most xml files
svn path=/trunk/; revision=16720
2005-07-24 21:42:00 +00:00
Hervé Poussineau d3bf39b1f2 Delete unused makefiles
svn path=/trunk/; revision=16400
2005-07-03 21:35:41 +00:00
Alex Ionescu 2125679164 Move some internal headers to /reactos, set it as a default include path, move pseh and elf headers to their respective directories
svn path=/trunk/; revision=16358
2005-06-30 22:40:36 +00:00
KJK::Hyperion f5b60bc69e longjmp should restore the stack pointer as it would be *after* setjmp returns. Since the PSEH implementation of setjmp is __stdcall, this value differs from the usual esp+4, because *after* return *two* doublewords are popped (return IP and parameter). Thanks to blight_ for reporting
svn path=/trunk/; revision=15894
2005-06-13 20:31:55 +00:00