Hello,

On Thu, 11 Apr 2019, Michael Matz wrote:

 I wonder why the result worked under wine then, though; strange.

Must be the very old wine version on the machine I initially used for testing (where the program indeed works). With newer wine I can reproduce the non-working.

So, with the hint of grischka I came up with the attached patch which implements the plumbing in the startup files so that Christians example signal.c works. It's not in any way a real implementation of SEH, but that isn't necessary.

I'll wait for feedback on this and not yet commit to git.


Ciao,
Michael.
diff --git a/win32/lib/crt1.c b/win32/lib/crt1.c
index 0e04fc0..e0ec5d5 100644
--- a/win32/lib/crt1.c
+++ b/win32/lib/crt1.c
@@ -4,6 +4,7 @@
 // _UNICODE for tchar.h, UNICODE for API
 #include <tchar.h>
 
+#include <windows.h>
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -37,9 +38,19 @@ extern int _tmain(int argc, _TCHAR * argv[], _TCHAR * env[]);
 /* Allow command-line globbing with "int _dowildcard = 1;" in the user source */
 int _dowildcard;
 
+#ifdef __x86_64__
+static LONG WINAPI catch_sig(EXCEPTION_POINTERS *ex)
+{
+  return _XcptFilter(ex->ExceptionRecord->ExceptionCode, ex);
+}
+#endif
+
 void _tstart(void)
 {
     __TRY__
+#ifdef __x86_64__
+     SetUnhandledExceptionFilter(catch_sig);
+#endif
     _startupinfo start_info = {0};
 
     // Sets the current application type
diff --git a/win32/lib/wincrt1.c b/win32/lib/wincrt1.c
index ce3a63f..bad3d95 100644
--- a/win32/lib/wincrt1.c
+++ b/win32/lib/wincrt1.c
@@ -26,6 +26,13 @@ int APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int);
 typedef struct { int newmode; } _startupinfo;
 int __cdecl __tgetmainargs(int *pargc, _TCHAR ***pargv, _TCHAR ***penv, int globb, _startupinfo*);
 
+#ifdef __x86_64__
+static LONG WINAPI catch_sig(EXCEPTION_POINTERS *ex)
+{
+  return _XcptFilter(ex->ExceptionRecord->ExceptionCode, ex);
+}
+#endif
+
 static int go_winmain(TCHAR *arg1)
 {
     STARTUPINFO si;
@@ -54,6 +61,9 @@ static int go_winmain(TCHAR *arg1)
 int _twinstart(void)
 {
     __TRY__
+#ifdef __x86_64__
+     SetUnhandledExceptionFilter(catch_sig);
+#endif
     _startupinfo start_info_con = {0};
     __set_app_type(__GUI_APP);
     __tgetmainargs(&__argc, &__targv, &_tenviron, 0, &start_info_con);
_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to