Skip to content

Commit

Permalink
Jump through some hoops to make the Windows SEH exception stuff happy
Browse files Browse the repository at this point in the history
  • Loading branch information
igfoo committed Aug 24, 2007
1 parent 32f2ee1 commit 49b8105
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 8 deletions.
29 changes: 23 additions & 6 deletions rts/Main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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 */
6 changes: 6 additions & 0 deletions rts/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
File renamed without changes.
3 changes: 1 addition & 2 deletions rts/seh_excn.h → rts/win32/seh_excn.h
Original file line number Diff line number Diff line change
Expand Up @@ -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__ */
Expand Down

0 comments on commit 49b8105

Please sign in to comment.