Fix histograms for ticky code
[ghc.git] / rts / RtsMessages.c
index 6e75abc..0440669 100644 (file)
 
 #include "eventlog/EventLog.h"
 
+#if USE_LIBDW
+#include <Libdw.h>
+#endif
+
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
@@ -51,7 +55,7 @@ vbarf(const char*s, va_list ap)
   stg_exit(EXIT_INTERNAL_ERROR); // just in case fatalInternalErrorFn() returns
 }
 
-void 
+void
 _assertFail(const char*filename, unsigned int linenum)
 {
     barf("ASSERTION FAILED: file %s, line %u\n", filename, linenum);
@@ -108,7 +112,7 @@ vdebugBelch(const char*s, va_list ap)
 
 #define BUFSIZE 512
 
-#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
+#if defined (mingw32_HOST_OS)
 static int
 isGUIApp(void)
 {
@@ -133,7 +137,7 @@ isGUIApp(void)
 void GNU_ATTRIBUTE(__noreturn__)
 rtsFatalInternalErrorFn(const char *s, va_list ap)
 {
-#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
+#if defined (mingw32_HOST_OS)
   if (isGUIApp())
   {
      char title[BUFSIZE], message[BUFSIZE];
@@ -142,10 +146,10 @@ rtsFatalInternalErrorFn(const char *s, va_list ap)
      vsnprintf(message, BUFSIZE, s, ap);
 
      MessageBox(NULL /* hWnd */,
-               message,
-               title,
-               MB_OK | MB_ICONERROR | MB_TASKMODAL
-              );
+                message,
+                title,
+                MB_OK | MB_ICONERROR | MB_TASKMODAL
+               );
   }
   else
 #endif
@@ -157,6 +161,14 @@ rtsFatalInternalErrorFn(const char *s, va_list ap)
        fprintf(stderr, "internal error: ");
      }
      vfprintf(stderr, s, ap);
+#if USE_LIBDW
+     fprintf(stderr, "\n");
+     fprintf(stderr, "Stack trace:");
+     LibdwSession *session = libdwInit();
+     Backtrace *bt = libdwGetBacktrace(session);
+     libdwPrintBacktrace(session, stderr, bt);
+     libdwFree(session);
+#endif
      fprintf(stderr, "\n");
      fprintf(stderr, "    (GHC version %s for %s)\n", ProjectVersion, xstr(HostPlatform_TYPE));
      fprintf(stderr, "    Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug\n");
@@ -174,15 +186,15 @@ rtsFatalInternalErrorFn(const char *s, va_list ap)
 void
 rtsErrorMsgFn(const char *s, va_list ap)
 {
-#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
+#if defined (mingw32_HOST_OS)
   if (isGUIApp())
   {
      char buf[BUFSIZE];
      int r;
 
-        r = vsnprintf(buf, BUFSIZE, s, ap);
-        if (r > 0 && r < BUFSIZE) {
-               MessageBox(NULL /* hWnd */,
+         r = vsnprintf(buf, BUFSIZE, s, ap);
+         if (r > 0 && r < BUFSIZE) {
+                MessageBox(NULL /* hWnd */,
               buf,
               prog_name,
               MB_OK | MB_ICONERROR | MB_TASKMODAL
@@ -206,32 +218,32 @@ rtsSysErrorMsgFn(const char *s, va_list ap)
 {
     char *syserr;
 
-#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
-    FormatMessage( 
-       FORMAT_MESSAGE_ALLOCATE_BUFFER | 
-       FORMAT_MESSAGE_FROM_SYSTEM | 
-       FORMAT_MESSAGE_IGNORE_INSERTS,
-       NULL,
-       GetLastError(),
-       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
-       (LPTSTR) &syserr,
-       0,
-       NULL );
+#if defined (mingw32_HOST_OS)
+    FormatMessage(
+        FORMAT_MESSAGE_ALLOCATE_BUFFER |
+        FORMAT_MESSAGE_FROM_SYSTEM |
+        FORMAT_MESSAGE_IGNORE_INSERTS,
+        NULL,
+        GetLastError(),
+        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+        (LPTSTR) &syserr,
+        0,
+        NULL );
 
     if (isGUIApp())
     {
-       char buf[BUFSIZE];
-       int r;
-       
-       r = vsnprintf(buf, BUFSIZE, s, ap);
-       if (r > 0 && r < BUFSIZE) {
-           r = vsnprintf(buf+r, BUFSIZE-r, ": %s", syserr);
-           MessageBox(NULL /* hWnd */,
-                      buf,
-                      prog_name,
-                      MB_OK | MB_ICONERROR | MB_TASKMODAL
-               );
-       }
+        char buf[BUFSIZE];
+        int r;
+
+        r = vsnprintf(buf, BUFSIZE, s, ap);
+        if (r > 0 && r < BUFSIZE) {
+            r = vsnprintf(buf+r, BUFSIZE-r, ": %s", syserr);
+            MessageBox(NULL /* hWnd */,
+                       buf,
+                       prog_name,
+                       MB_OK | MB_ICONERROR | MB_TASKMODAL
+                );
+        }
     }
     else
 #else
@@ -239,24 +251,24 @@ rtsSysErrorMsgFn(const char *s, va_list ap)
     // ToDo: use strerror_r() if available
 #endif
     {
-       /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
-       if (prog_argv != NULL && prog_name != NULL) {
-           fprintf(stderr, "%s: ", prog_name);
-       }
-       vfprintf(stderr, s, ap);
-       if (syserr) {
-#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
+        /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
+        if (prog_argv != NULL && prog_name != NULL) {
+            fprintf(stderr, "%s: ", prog_name);
+        }
+        vfprintf(stderr, s, ap);
+        if (syserr) {
+#if defined (mingw32_HOST_OS)
             // Win32 error messages have a terminating \n
-           fprintf(stderr, ": %s", syserr);
+            fprintf(stderr, ": %s", syserr);
 #else
-           fprintf(stderr, ": %s\n", syserr);
+            fprintf(stderr, ": %s\n", syserr);
 #endif
-       } else {
-           fprintf(stderr, "\n");
-       }
+        } else {
+            fprintf(stderr, "\n");
+        }
     }
 
-#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
+#if defined (mingw32_HOST_OS)
     if (syserr) LocalFree(syserr);
 #endif
 }
@@ -264,14 +276,14 @@ rtsSysErrorMsgFn(const char *s, va_list ap)
 void
 rtsDebugMsgFn(const char *s, va_list ap)
 {
-#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
+#if defined (mingw32_HOST_OS)
   if (isGUIApp())
   {
      char buf[BUFSIZE];
-        int r;
+         int r;
 
-        r = vsnprintf(buf, BUFSIZE, s, ap);
-        if (r > 0 && r < BUFSIZE) {
+         r = vsnprintf(buf, BUFSIZE, s, ap);
+         if (r > 0 && r < BUFSIZE) {
        OutputDebugString(buf);
      }
   }