summaryrefslogtreecommitdiff
path: root/rts/RtsMessages.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/RtsMessages.c')
-rw-r--r--rts/RtsMessages.c47
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.");
}