Kill a %n format specifier used in report_summary().
Reminder to also handle the vdebugBelch() case by gnezdo@
This commit is contained in:
parent
20726732be
commit
d77c07d6bd
@ -1,4 +1,4 @@
|
||||
# $OpenBSD: Makefile,v 1.188 2021/08/16 21:23:18 gnezdo Exp $
|
||||
# $OpenBSD: Makefile,v 1.189 2021/09/14 17:53:11 kili Exp $
|
||||
|
||||
# Not yet ported to other architectures
|
||||
ONLY_FOR_ARCHS = i386 amd64
|
||||
@ -19,6 +19,8 @@ DISTNAME = ghc-${GHC_VERSION}
|
||||
CATEGORIES = lang devel
|
||||
HOMEPAGE = https://www.haskell.org/ghc/
|
||||
|
||||
REVISION = 0
|
||||
|
||||
# Version of the precompiled binaries
|
||||
BIN_VER = 8.10.3.20210429
|
||||
|
||||
|
34
lang/ghc/patches/patch-includes_rts_Messages_h
Normal file
34
lang/ghc/patches/patch-includes_rts_Messages_h
Normal file
@ -0,0 +1,34 @@
|
||||
$OpenBSD: patch-includes_rts_Messages_h,v 1.1 2021/09/14 17:53:11 kili Exp $
|
||||
|
||||
The debug message function has to return the number of bytes written
|
||||
(like printf(3)), to allow killing a %n format specifier in one in
|
||||
one invocation of statsPrintf() in report_summary() (rts/Stats.c).
|
||||
|
||||
Index: includes/rts/Messages.h
|
||||
--- includes/rts/Messages.h.orig
|
||||
+++ includes/rts/Messages.h
|
||||
@@ -85,20 +85,21 @@ void vsysErrorBelch(const char *s, va_list ap);
|
||||
void debugBelch(const char *s, ...)
|
||||
GNUC3_ATTRIBUTE(format (PRINTF, 1, 2));
|
||||
|
||||
-void vdebugBelch(const char *s, va_list ap);
|
||||
+int vdebugBelch(const char *s, va_list ap);
|
||||
|
||||
|
||||
/* Hooks for redirecting message generation: */
|
||||
|
||||
typedef void RtsMsgFunction(const char *, va_list);
|
||||
+typedef int RtsMsgFunctionRetLen(const char *, va_list);
|
||||
|
||||
extern RtsMsgFunction *fatalInternalErrorFn;
|
||||
-extern RtsMsgFunction *debugMsgFn;
|
||||
+extern RtsMsgFunctionRetLen *debugMsgFn;
|
||||
extern RtsMsgFunction *errorMsgFn;
|
||||
|
||||
/* Default stdio implementation of the message hooks: */
|
||||
|
||||
extern RtsMsgFunction rtsFatalInternalErrorFn;
|
||||
-extern RtsMsgFunction rtsDebugMsgFn;
|
||||
+extern RtsMsgFunctionRetLen rtsDebugMsgFn;
|
||||
extern RtsMsgFunction rtsErrorMsgFn;
|
||||
extern RtsMsgFunction rtsSysErrorMsgFn;
|
65
lang/ghc/patches/patch-rts_RtsMessages_c
Normal file
65
lang/ghc/patches/patch-rts_RtsMessages_c
Normal file
@ -0,0 +1,65 @@
|
||||
$OpenBSD: patch-rts_RtsMessages_c,v 1.1 2021/09/14 17:53:11 kili Exp $
|
||||
|
||||
The debug message function has to return the number of bytes written
|
||||
(like printf(3)), to allow killing a %n format specifier in one in
|
||||
one invocation of statsPrintf() in report_summary() (rts/Stats.c).
|
||||
|
||||
Index: rts/RtsMessages.c
|
||||
--- rts/RtsMessages.c.orig
|
||||
+++ rts/RtsMessages.c
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
// Default to the stdio implementation of these hooks.
|
||||
RtsMsgFunction *fatalInternalErrorFn = rtsFatalInternalErrorFn;
|
||||
-RtsMsgFunction *debugMsgFn = rtsDebugMsgFn;
|
||||
+RtsMsgFunctionRetLen *debugMsgFn = rtsDebugMsgFn;
|
||||
RtsMsgFunction *errorMsgFn = rtsErrorMsgFn;
|
||||
RtsMsgFunction *sysErrorMsgFn = rtsSysErrorMsgFn;
|
||||
|
||||
@@ -102,10 +102,10 @@ debugBelch(const char*s, ...)
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
-void
|
||||
+int
|
||||
vdebugBelch(const char*s, va_list ap)
|
||||
{
|
||||
- (*debugMsgFn)(s,ap);
|
||||
+ return (*debugMsgFn)(s,ap);
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
@@ -285,16 +285,16 @@ rtsSysErrorMsgFn(const char *s, va_list ap)
|
||||
#endif
|
||||
}
|
||||
|
||||
-void
|
||||
+int
|
||||
rtsDebugMsgFn(const char *s, va_list ap)
|
||||
{
|
||||
+ int r;
|
||||
#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];
|
||||
- int r;
|
||||
|
||||
r = vsnprintf(buf, BUFSIZE, s, ap);
|
||||
if (r > 0 && r < BUFSIZE) {
|
||||
@@ -305,12 +305,13 @@ rtsDebugMsgFn(const char *s, va_list ap)
|
||||
#endif
|
||||
{
|
||||
/* don't fflush(stdout); WORKAROUND bug in Linux glibc */
|
||||
- vfprintf(stderr, s, ap);
|
||||
+ r = vfprintf(stderr, s, ap);
|
||||
fflush(stderr);
|
||||
}
|
||||
#if defined(mingw32_HOST_OS)
|
||||
_setmode (_fileno(stderr), mode);
|
||||
#endif
|
||||
+ return r;
|
||||
}
|
||||
|
||||
|
54
lang/ghc/patches/patch-rts_Stats_c
Normal file
54
lang/ghc/patches/patch-rts_Stats_c
Normal file
@ -0,0 +1,54 @@
|
||||
$OpenBSD: patch-rts_Stats_c,v 1.1 2021/09/14 17:53:11 kili Exp $
|
||||
|
||||
Kill a use of %n format specifier.
|
||||
|
||||
Index: rts/Stats.c
|
||||
--- rts/Stats.c.orig
|
||||
+++ rts/Stats.c
|
||||
@@ -69,7 +69,7 @@ static Time *GC_coll_cpu = NULL;
|
||||
static Time *GC_coll_elapsed = NULL;
|
||||
static Time *GC_coll_max_pause = NULL;
|
||||
|
||||
-static void statsPrintf( char *s, ... ) GNUC3_ATTRIBUTE(format (PRINTF, 1, 2));
|
||||
+static int statsPrintf( char *s, ... ) GNUC3_ATTRIBUTE(format (PRINTF, 1, 2));
|
||||
static void statsFlush( void );
|
||||
static void statsClose( void );
|
||||
|
||||
@@ -1024,8 +1024,10 @@ static void report_summary(const RTSSummaryStats* sum)
|
||||
|
||||
for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
|
||||
int prefix_length = 0;
|
||||
- statsPrintf("%*s" "gen[%" FMT_Word32 "%n",
|
||||
- col_width[0], "", g, &prefix_length);
|
||||
+ prefix_length = statsPrintf("%*s" "gen[%" FMT_Word32,
|
||||
+ col_width[0], "", g);
|
||||
+ if (prefix_length < 0)
|
||||
+ prefix_length = 0;
|
||||
prefix_length -= col_width[0];
|
||||
int suffix_length = col_width[1] + prefix_length;
|
||||
suffix_length =
|
||||
@@ -1735,19 +1737,21 @@ void getRTSStats( RTSStats *s )
|
||||
Dumping stuff in the stats file, or via the debug message interface
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
-void
|
||||
+int
|
||||
statsPrintf( char *s, ... )
|
||||
{
|
||||
+ int ret = 0;
|
||||
FILE *sf = RtsFlags.GcFlags.statsFile;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap,s);
|
||||
if (sf == NULL) {
|
||||
- vdebugBelch(s,ap);
|
||||
+ ret = vdebugBelch(s,ap);
|
||||
} else {
|
||||
- vfprintf(sf, s, ap);
|
||||
+ ret = vfprintf(sf, s, ap);
|
||||
}
|
||||
va_end(ap);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static void
|
Loading…
x
Reference in New Issue
Block a user