summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rts/Main.c29
-rw-r--r--rts/Makefile6
-rw-r--r--rts/win32/seh_excn.c (renamed from rts/seh_excn.c)0
-rw-r--r--rts/win32/seh_excn.h (renamed from rts/seh_excn.h)3
4 files changed, 30 insertions, 8 deletions
diff --git a/rts/Main.c b/rts/Main.c
index 5f16fa344a..434f79156b 100644
--- a/rts/Main.c
+++ b/rts/Main.c
@@ -16,7 +16,9 @@
#include "RtsUtils.h"
#include "Prelude.h"
#include "Task.h"
-#include "seh_excn.h"
+#if defined(mingw32_HOST_OS)
+#include "win32/seh_excn.h"
+#endif
#include <stdlib.h>
#ifdef DEBUG
@@ -39,18 +41,20 @@
extern void __stginit_ZCMain(void);
+static int progargc;
+static char **progargv;
+
/* Hack: we assume that we're building a batch-mode system unless
* INTERPRETER is set
*/
#ifndef INTERPRETER /* Hack */
-int main(int argc, char *argv[])
+static void real_main(void)
{
int exit_status;
SchedulerStatus status;
/* all GranSim/GUM init is done in startupHaskell; sets IAmMainThread! */
- BEGIN_CATCH
- startupHaskell(argc,argv,__stginit_ZCMain);
+ startupHaskell(progargc,progargv,__stginit_ZCMain);
/* kick off the computation by creating the main thread with a pointer
to mainIO_closure representing the computation of the overall program;
@@ -135,8 +139,21 @@ int main(int argc, char *argv[])
barf("main thread completed with invalid status");
}
shutdownHaskellAndExit(exit_status);
+}
+int main(int argc, char *argv[])
+{
+ /* We do this dance with argc and argv as otherwise the SEH exception
+ stuff (the BEGIN/END CATCH below) on Windows gets confused */
+ progargc = argc;
+ progargv = argv;
+
+#if defined(mingw32_HOST_OS)
+ BEGIN_CATCH
+#endif
+ real_main();
+#if defined(mingw32_HOST_OS)
END_CATCH
- return 0; /* not reached unless a Windows exception happens,
- also keeps gcc -Wall happy */
+#endif
+ return 0; /* not reached, but keeps gcc -Wall happy */
}
# endif /* BATCH_MODE */
diff --git a/rts/Makefile b/rts/Makefile
index 9af9671a0e..7fab5fa068 100644
--- a/rts/Makefile
+++ b/rts/Makefile
@@ -156,6 +156,12 @@ else
DQ = \"
endif
+# If Main.c is built with optimisation then the SEH exception stuff on
+# Windows gets confused.
+# This has to be in HC rather than CC opts, as otherwise there's a
+# -optc-O2 that comes after it.
+Main_HC_OPTS += -optc-O0
+
RtsMessages_CC_OPTS += -DProjectVersion=$(DQ)$(ProjectVersion)$(DQ)
RtsUtils_CC_OPTS += -DProjectVersion=$(DQ)$(ProjectVersion)$(DQ)
RtsUtils_CC_OPTS += -DRtsWay=$(DQ)rts$(_way)$(DQ)
diff --git a/rts/seh_excn.c b/rts/win32/seh_excn.c
index 5da7579b10..5da7579b10 100644
--- a/rts/seh_excn.c
+++ b/rts/win32/seh_excn.c
diff --git a/rts/seh_excn.h b/rts/win32/seh_excn.h
index 311675d663..410d430871 100644
--- a/rts/seh_excn.h
+++ b/rts/win32/seh_excn.h
@@ -84,8 +84,7 @@ catchDivZero(struct _EXCEPTION_RECORD*,
} \
}
#else
-#define BEGIN_CATCH /* nothing */
-#define END_CATCH /* nothing */
+#error Don't know what sort of Windows system this is
#endif
#endif /* __SEH_EXCN_H__ */