diff options
Diffstat (limited to 'rts/RtsMessages.c')
-rw-r--r-- | rts/RtsMessages.c | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/rts/RtsMessages.c b/rts/RtsMessages.c index 0859e5093b..053805e763 100644 --- a/rts/RtsMessages.c +++ b/rts/RtsMessages.c @@ -8,6 +8,7 @@ #include "PosixSource.h" #include "Rts.h" +#include "RtsUtils.h" #include "eventlog/EventLog.h" @@ -21,6 +22,7 @@ #if defined(HAVE_WINDOWS_H) #include <windows.h> +#include <fcntl.h> #endif /* ----------------------------------------------------------------------------- @@ -131,13 +133,12 @@ isGUIApp(void) } #endif -#define xstr(s) str(s) -#define str(s) #s - void GNU_ATTRIBUTE(__noreturn__) rtsFatalInternalErrorFn(const char *s, va_list ap) { -#if defined (mingw32_HOST_OS) +#if defined(mingw32_HOST_OS) + /* Ensure we're in text mode so newlines get encoded properly. */ + int mode = _setmode (_fileno(stderr), _O_TEXT); if (isGUIApp()) { char title[BUFSIZE], message[BUFSIZE]; @@ -163,7 +164,7 @@ rtsFatalInternalErrorFn(const char *s, va_list ap) vfprintf(stderr, s, ap); #if USE_LIBDW fprintf(stderr, "\n"); - fprintf(stderr, "Stack trace:"); + fprintf(stderr, "Stack trace:\n"); LibdwSession *session = libdwInit(); Backtrace *bt = libdwGetBacktrace(session); libdwPrintBacktrace(session, stderr, bt); @@ -174,6 +175,9 @@ rtsFatalInternalErrorFn(const char *s, va_list ap) fprintf(stderr, " Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug\n"); fflush(stderr); } +#if defined(mingw32_HOST_OS) + _setmode (_fileno(stderr), mode); +#endif #if defined(TRACING) if (RtsFlags.TraceFlags.tracing == TRACE_EVENTLOG) endEventLogging(); @@ -186,7 +190,9 @@ rtsFatalInternalErrorFn(const char *s, va_list ap) void rtsErrorMsgFn(const char *s, va_list ap) { -#if defined (mingw32_HOST_OS) +#if defined(mingw32_HOST_OS) + /* Ensure we're in text mode so newlines get encoded properly. */ + int mode = _setmode (_fileno(stderr), _O_TEXT); if (isGUIApp()) { char buf[BUFSIZE]; @@ -211,6 +217,9 @@ rtsErrorMsgFn(const char *s, va_list ap) vfprintf(stderr, s, ap); fprintf(stderr, "\n"); } +#if defined(mingw32_HOST_OS) + _setmode (_fileno(stderr), mode); +#endif } void @@ -218,7 +227,9 @@ rtsSysErrorMsgFn(const char *s, va_list ap) { char *syserr; -#if defined (mingw32_HOST_OS) +#if defined(mingw32_HOST_OS) + /* Ensure we're in text mode so newlines get encoded properly. */ + int mode = _setmode (_fileno(stderr), _O_TEXT); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | @@ -257,7 +268,7 @@ rtsSysErrorMsgFn(const char *s, va_list ap) } vfprintf(stderr, s, ap); if (syserr) { -#if defined (mingw32_HOST_OS) +#if defined(mingw32_HOST_OS) // Win32 error messages have a terminating \n fprintf(stderr, ": %s", syserr); #else @@ -268,15 +279,18 @@ rtsSysErrorMsgFn(const char *s, va_list ap) } } -#if defined (mingw32_HOST_OS) +#if defined(mingw32_HOST_OS) if (syserr) LocalFree(syserr); + _setmode (_fileno(stderr), mode); #endif } void rtsDebugMsgFn(const char *s, va_list ap) { -#if defined (mingw32_HOST_OS) +#if defined(mingw32_HOST_OS) + /* Ensure we're in text mode so newlines get encoded properly. */ + int mode = _setmode (_fileno(stderr), _O_TEXT); if (isGUIApp()) { char buf[BUFSIZE]; @@ -294,4 +308,17 @@ rtsDebugMsgFn(const char *s, va_list ap) vfprintf(stderr, s, ap); fflush(stderr); } +#if defined(mingw32_HOST_OS) + _setmode (_fileno(stderr), mode); +#endif +} + + +// Used in stg_badAlignment_entry defined in StgStartup.cmm. +void rtsBadAlignmentBarf(void) GNUC3_ATTRIBUTE(__noreturn__); + +void +rtsBadAlignmentBarf() +{ + barf("Encountered incorrectly aligned pointer. This can't be good."); } |