followup for cid 1004EE408E1382C1752 and 1004EE40DDD498FBB0D:
do a mirtoconf run-time check (ugh) to see whether the CPU designers smoked/were brain-dead or if we don’t actually need the manual check
This commit is contained in:
parent
25f413bf7d
commit
7ec1ae3771
64
Build.sh
64
Build.sh
@ -1,5 +1,5 @@
|
||||
#!/bin/sh
|
||||
srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.500 2011/12/31 00:31:25 tg Exp $'
|
||||
srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.501 2011/12/31 02:04:16 tg Exp $'
|
||||
#-
|
||||
# Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
||||
# Thorsten Glaser <tg@mirbsd.org>
|
||||
@ -147,7 +147,7 @@ ac_testinit() {
|
||||
}
|
||||
|
||||
# pipe .c | ac_test[n] [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
|
||||
ac_testn() {
|
||||
ac_testnnd() {
|
||||
if test x"$1" = x"!"; then
|
||||
fr=1
|
||||
shift
|
||||
@ -173,6 +173,9 @@ ac_testn() {
|
||||
test $ct = sunpro && vscan='-e ignored -e turned.off'
|
||||
fi
|
||||
test -n "$vscan" && grep $vscan vv.out >/dev/null 2>&1 && fv=$fr
|
||||
}
|
||||
ac_testn() {
|
||||
ac_testnnd "$@"
|
||||
rmf conftest.c conftest.o ${tcfn}* vv.out
|
||||
ac_testdone
|
||||
}
|
||||
@ -1171,7 +1174,7 @@ else
|
||||
#define EXTERN
|
||||
#define MKSH_INCLUDES_ONLY
|
||||
#include "sh.h"
|
||||
__RCSID("$MirOS: src/bin/mksh/Build.sh,v 1.500 2011/12/31 00:31:25 tg Exp $");
|
||||
__RCSID("$MirOS: src/bin/mksh/Build.sh,v 1.501 2011/12/31 02:04:16 tg Exp $");
|
||||
int main(void) { printf("Hello, World!\n"); return (0); }
|
||||
EOF
|
||||
case $cm in
|
||||
@ -1535,6 +1538,61 @@ EOF
|
||||
CFLAGS=$save_CFLAGS
|
||||
eval test 1 = \$HAVE_COMPILE_TIME_ASSERTS_$$ || exit 1
|
||||
|
||||
#
|
||||
# runtime checks
|
||||
# once this is more than one, check if we can do runtime
|
||||
# checks (not cross-compiling) first to save on warnings
|
||||
#
|
||||
$e "${bi}run-time checks follow$ao, please ignore any weird errors"
|
||||
|
||||
ac_testnnd silent_idivwrapv '' '(run-time) whether signed integer division overflows wrap silently' <<-'EOF'
|
||||
#define MKSH_INCLUDES_ONLY
|
||||
#include "sh.h"
|
||||
#ifdef SIGFPE
|
||||
static void fpe_catcher(int) MKSH_A_NORETURN;
|
||||
#endif
|
||||
int main(int ac, char **av) {
|
||||
mksh_ari_t o1, o2, r1, r2;
|
||||
|
||||
#ifdef SIGFPE
|
||||
signal(SIGFPE, fpe_catcher);
|
||||
#endif
|
||||
o1 = ((mksh_ari_t)1 << 31);
|
||||
o2 = -ac;
|
||||
r1 = o1 / o2;
|
||||
r2 = o1 % o2;
|
||||
if (r1 == o1 && r2 == 0) {
|
||||
printf("si");
|
||||
return (0);
|
||||
}
|
||||
printf("no %d %d %d %d %s", o1, o2, r1, r2, av[0]);
|
||||
return (1);
|
||||
}
|
||||
#ifdef SIGFPE
|
||||
static const char fpe_msg[] = "no, got SIGFPE, what were they smoking?";
|
||||
static void fpe_catcher(int sig MKSH_A_UNUSED) {
|
||||
write(1, fpe_msg, sizeof(fpe_msg) - 1);
|
||||
_exit(2);
|
||||
}
|
||||
#endif
|
||||
EOF
|
||||
if test $fv = 0; then
|
||||
echo "| hrm, compiling this failed, but we will just failback"
|
||||
else
|
||||
echo "| running test programme; this will fail if cross-compiling"
|
||||
echo "| in which case we will gracefully degrade to the default"
|
||||
./$tcfn >vv.out 2>&1
|
||||
rv=$?
|
||||
echo "| result: `cat vv.out`"
|
||||
fv=0
|
||||
test $rv = 0 && test x"`cat vv.out`" = x"si" && fv=1
|
||||
fi
|
||||
rmf conftest.c conftest.o ${tcfn}* vv.out
|
||||
ac_testdone
|
||||
ac_cppflags
|
||||
|
||||
$e "${bi}end of run-time checks$ao"
|
||||
|
||||
#
|
||||
# Compiler: Praeprocessor (only if needed)
|
||||
#
|
||||
|
4
Makefile
4
Makefile
@ -1,4 +1,4 @@
|
||||
# $MirOS: src/bin/mksh/Makefile,v 1.91 2011/12/08 22:19:16 tg Exp $
|
||||
# $MirOS: src/bin/mksh/Makefile,v 1.92 2011/12/31 02:04:17 tg Exp $
|
||||
#-
|
||||
# Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
||||
# Thorsten Glaser <tg@mirbsd.org>
|
||||
@ -46,6 +46,8 @@ CPPFLAGS+= -DMKSH_ASSUME_UTF8 -DMKSH_DISABLE_DEPRECATED \
|
||||
-DHAVE_STRCASESTR=1 -DHAVE_STRLCPY=1 -DHAVE_FLOCK_DECL=1 \
|
||||
-DHAVE_REVOKE_DECL=1 -DHAVE_SYS_SIGLIST_DECL=1 \
|
||||
-DHAVE_PERSISTENT_HISTORY=1
|
||||
# probably differs between i386 and sparc
|
||||
CPPFLAGS+= -DHAVE_SILENT_IDIVWRAPV=0
|
||||
COPTS+= -std=gnu99 -Wall
|
||||
.endif
|
||||
|
||||
|
6
expr.c
6
expr.c
@ -22,7 +22,7 @@
|
||||
|
||||
#include "sh.h"
|
||||
|
||||
__RCSID("$MirOS: src/bin/mksh/expr.c,v 1.52 2011/12/16 20:03:02 tg Exp $");
|
||||
__RCSID("$MirOS: src/bin/mksh/expr.c,v 1.53 2011/12/31 02:04:18 tg Exp $");
|
||||
|
||||
/* The order of these enums is constrained by the order of opinfo[] */
|
||||
enum token {
|
||||
@ -366,21 +366,25 @@ evalexpr(Expr_state *es, int prec)
|
||||
break;
|
||||
case O_DIV:
|
||||
case O_DIVASN:
|
||||
#if !HAVE_SILENT_IDIVWRAPV
|
||||
if (!es->natural && vr->val.i == -1 &&
|
||||
vl->val.i == ((mksh_ari_t)1 << 31)) {
|
||||
/* -2147483648 / -1 = 2147483648 */
|
||||
/* 80000000 / FFFFFFFF = 80000000 */
|
||||
res = ((mksh_ari_t)1 << 31);
|
||||
} else
|
||||
#endif
|
||||
res = bivui(vl, /, vr);
|
||||
break;
|
||||
case O_MOD:
|
||||
case O_MODASN:
|
||||
#if !HAVE_SILENT_IDIVWRAPV
|
||||
if (!es->natural && vr->val.i == -1 &&
|
||||
vl->val.i == ((mksh_ari_t)1 << 31)) {
|
||||
/* -2147483648 % -1 = 0 */
|
||||
res = 0;
|
||||
} else
|
||||
#endif
|
||||
res = bivui(vl, %, vr);
|
||||
break;
|
||||
case O_PLUS:
|
||||
|
Loading…
x
Reference in New Issue
Block a user