From e31579b0769e1f9c0947d12e83316d1149307b1a Mon Sep 17 00:00:00 2001 From: James Lyon Date: Wed, 17 Apr 2013 20:32:07 +0100 Subject: [PATCH] Fixed tests on Windows (including out-of-tree problems) Modified tcctest.c so that it uses 'double' in place of 'long double' with MinGW since this is what TCC does, and what Visual C++ does. Added an option -norunsrc to tcc to allow argv[0] to be set independently of the compiled source when using tcc -run, which allows tests that rely on the value of argv[0] to work in out-of-tree builds. Also added Makefile rules to automatically update out-of-tree build Makefiles when in-tree Makefiles have changed. --- Makefile | 2 ++ lib/Makefile | 3 +++ libtcc.c | 9 ++++++++- tcc.c | 1 + tests/Makefile | 21 ++++++++++++--------- tests/tcctest.c | 47 +++++++++++++++++++++++++++++++---------------- tests/tests2/Makefile | 9 ++++++--- 7 files changed, 63 insertions(+), 29 deletions(-) diff --git a/Makefile b/Makefile index 3dffaa80..fb94845c 100644 --- a/Makefile +++ b/Makefile @@ -343,6 +343,8 @@ tar: tcc-doc.html rm -rf $(TCC-VERSION) git reset +Makefile: $(top_srcdir)/Makefile + cp $< $@ .PHONY: all clean tar distclean install uninstall FORCE diff --git a/lib/Makefile b/lib/Makefile index dfac0f84..300fa46f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -100,3 +100,6 @@ $(DIR)/exists : clean : rm -rfv i386-win32 x86_64-win32 i386 x86_64 + +Makefile: $(top_srcdir)/lib/Makefile + cp $< $@ diff --git a/libtcc.c b/libtcc.c index 3ef16824..9ee4ea69 100644 --- a/libtcc.c +++ b/libtcc.c @@ -1638,6 +1638,7 @@ enum { TCC_OPTION_pedantic, TCC_OPTION_pthread, TCC_OPTION_run, + TCC_OPTION_norunsrc, TCC_OPTION_v, TCC_OPTION_w, TCC_OPTION_pipe, @@ -1677,6 +1678,7 @@ static const TCCOption tcc_options[] = { { "pedantic", TCC_OPTION_pedantic, 0}, { "pthread", TCC_OPTION_pthread, 0}, { "run", TCC_OPTION_run, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, + { "norunsrc", TCC_OPTION_norunsrc, 0 }, { "rdynamic", TCC_OPTION_rdynamic, 0 }, { "r", TCC_OPTION_r, 0 }, { "s", TCC_OPTION_s, 0 }, @@ -1715,6 +1717,7 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv) const TCCOption *popt; const char *optarg, *r; int run = 0; + int norunsrc = 0; int pthread = 0; int optind = 0; @@ -1727,7 +1730,8 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv) r = argv[optind++]; if (r[0] != '-' || r[1] == '\0') { /* add a new file */ - dynarray_add((void ***)&s->files, &s->nb_files, tcc_strdup(r)); + if (!run || !norunsrc) + dynarray_add((void ***)&s->files, &s->nb_files, tcc_strdup(r)); if (run) { optind--; /* argv[0] will be this file */ @@ -1841,6 +1845,9 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv) tcc_set_options(s, optarg); run = 1; break; + case TCC_OPTION_norunsrc: + norunsrc = 1; + break; case TCC_OPTION_v: do ++s->verbose; while (*optarg++ == 'v'); break; diff --git a/tcc.c b/tcc.c index 52638efc..25330a12 100644 --- a/tcc.c +++ b/tcc.c @@ -69,6 +69,7 @@ static void help(void) " -Bdir use 'dir' as tcc internal library and include path\n" " -MD generate target dependencies for make\n" " -MF depfile put generated dependencies here\n" + " -norunsrc Do not compile the file which is the first argument after -run." ); } diff --git a/tests/Makefile b/tests/Makefile index 6e0f7289..5e4a6c9f 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -4,7 +4,8 @@ TOP = .. include $(TOP)/Makefile -VPATH = $(top_srcdir)/tests +SRCDIR = $(top_srcdir)/tests +VPATH = $(SRCDIR) # what tests to run TESTS = \ @@ -41,13 +42,13 @@ ifeq ($(TARGETOS),Darwin) endif # run local version of tcc with local libraries and includes -TCCFLAGS = -B$(TOP) +TCCFLAGS = -B$(TOP) -I$(TOP) ifdef CONFIG_WIN32 - TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -L$(TOP) + TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -I$(TOP) -L$(TOP) endif TCC = $(TOP)/tcc $(TCCFLAGS) -RUN_TCC = $(NATIVE_DEFINES) -DONE_SOURCE -run $(TOP)/tcc.c $(TCCFLAGS) +RUN_TCC = $(NATIVE_DEFINES) -DONE_SOURCE -run $(top_srcdir)/tcc.c $(TCCFLAGS) DISAS = objdump -d @@ -71,7 +72,7 @@ libtest: libtcc_test$(EXESUF) $(LIBTCC1) ./libtcc_test$(EXESUF) lib_path=.. libtcc_test$(EXESUF): libtcc_test.c $(top_builddir)/$(LIBTCC) - $(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS) $(NATIVE_DEFINES) $(LIBS) $(LINK_LIBTCC) $(LDFLAGS) + $(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS) $(NATIVE_DEFINES) $(LIBS) $(LINK_LIBTCC) $(LDFLAGS) -I$(top_srcdir) moretests: @echo ------------ $@ ------------ @@ -80,26 +81,26 @@ moretests: # test.ref - generate using gcc # copy only tcclib.h so GCC's stddef and stdarg will be used test.ref: tcctest.c - cp ../include/tcclib.h . + cp $(top_srcdir)/include/tcclib.h . gcc -o tcctest.gcc $< -I. $(CPPFLAGS) -w $(CFLAGS) $(NATIVE_DEFINES) -std=gnu99 -O0 -fno-omit-frame-pointer $(LDFLAGS) ./tcctest.gcc > $@ # auto test test1: test.ref @echo ------------ $@ ------------ - $(TCC) -run tcctest.c > test.out1 + $(TCC) -run $(SRCDIR)/tcctest.c > test.out1 @if diff -u test.ref test.out1 ; then echo "Auto Test OK"; fi # iterated test2 (compile tcc then compile tcctest.c !) test2: test.ref @echo ------------ $@ ------------ - $(TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out2 + $(TCC) $(RUN_TCC) $(RUN_TCC) -run $(SRCDIR)/tcctest.c > test.out2 @if diff -u test.ref test.out2 ; then echo "Auto Test2 OK"; fi # iterated test3 (compile tcc then compile tcc then compile tcctest.c !) test3: test.ref @echo ------------ $@ ------------ - $(TCC) $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out3 + $(TCC) $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run $(SRCDIR)/tcctest.c > test.out3 @if diff -u test.ref test.out3 ; then echo "Auto Test3 OK"; fi # binary output test @@ -197,3 +198,5 @@ clean: rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.gcc *.exe \ hello libtcc_test tcctest[1234] ex? tcc_g tcclib.h +Makefile: $(SRCDIR)/Makefile + cp $< $@ diff --git a/tests/tcctest.c b/tests/tcctest.c index 8e295fd7..930f3680 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -1,7 +1,7 @@ /* * TCC auto test program */ -#include "../config.h" +#include "config.h" #if GCC_MAJOR >= 3 @@ -16,6 +16,15 @@ #endif +// MinGW has 80-bit rather than 64-bit long double which isn't compatible with TCC or MSVC +#if defined(_WIN32) && defined(__GNUC__) +#define LONG_DOUBLE double +#define LONG_DOUBLE_LITERAL(x) x +#else +#define LONG_DOUBLE long double +#define LONG_DOUBLE_LITERAL(x) x ## L +#endif + /* deprecated and no longer supported in gcc 3.3 */ //#define ACCEPT_CR_IN_STRINGS @@ -1547,10 +1556,16 @@ void bitfield_test(void) /* declare strto* functions as they are C99 */ double strtod(const char *nptr, char **endptr); + +#if defined(_WIN32) +float strtof(const char *nptr, char **endptr) {return (float)strtod(nptr, endptr);} +LONG_DOUBLE strtold(const char *nptr, char **endptr) {return (LONG_DOUBLE)strtod(nptr, endptr);} +#else float strtof(const char *nptr, char **endptr); -long double strtold(const char *nptr, char **endptr); +LONG_DOUBLE strtold(const char *nptr, char **endptr); +#endif -#define FTEST(prefix, type, fmt)\ +#define FTEST(prefix, typename, type, fmt)\ void prefix ## cmp(type a, type b)\ {\ printf("%d %d %d %d %d %d\n",\ @@ -1578,7 +1593,7 @@ void prefix ## fcast(type a)\ {\ float fa;\ double da;\ - long double la;\ + LONG_DOUBLE la;\ int ia;\ unsigned int ua;\ type b;\ @@ -1599,7 +1614,7 @@ void prefix ## fcast(type a)\ \ float prefix ## retf(type a) { return a; }\ double prefix ## retd(type a) { return a; }\ -long double prefix ## retld(type a) { return a; }\ +LONG_DOUBLE prefix ## retld(type a) { return a; }\ \ void prefix ## call(void)\ {\ @@ -1611,7 +1626,7 @@ void prefix ## call(void)\ \ void prefix ## test(void)\ {\ - printf("testing '%s'\n", #type);\ + printf("testing '%s'\n", #typename);\ prefix ## cmp(1, 2.5);\ prefix ## cmp(2, 1.5);\ prefix ## cmp(1, 1);\ @@ -1620,9 +1635,9 @@ void prefix ## test(void)\ prefix ## call();\ } -FTEST(f, float, "%f") -FTEST(d, double, "%f") -FTEST(ld, long double, "%Lf") +FTEST(f, float, float, "%f") +FTEST(d, double, double, "%f") +FTEST(ld, long double, LONG_DOUBLE, "%Lf") double ftab1[3] = { 1.2, 3.4, -5.6 }; @@ -1637,7 +1652,7 @@ void float_test(void) printf("float_test:\n"); printf("sizeof(float) = %d\n", sizeof(float)); printf("sizeof(double) = %d\n", sizeof(double)); - printf("sizeof(long double) = %d\n", sizeof(long double)); + printf("sizeof(long double) = %d\n", sizeof(LONG_DOUBLE)); ftest(); dtest(); ldtest(); @@ -1761,7 +1776,7 @@ void llfloat(void) { float fa; double da; - long double lda; + LONG_DOUBLE lda; long long la, lb, lc; unsigned long long ula, ulb, ulc; la = 0x12345678; @@ -1870,7 +1885,7 @@ void longlong_test(void) void manyarg_test(void) { - long double ld = 1234567891234LL; + LONG_DOUBLE ld = 1234567891234LL; printf("manyarg_test:\n"); printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f\n", 1, 2, 3, 4, 5, 6, 7, 8, @@ -1913,7 +1928,7 @@ void vprintf1(const char *fmt, ...) int c, i; double d; long long ll; - long double ld; + LONG_DOUBLE ld; va_start(aq, fmt); va_copy(ap, aq); @@ -1942,7 +1957,7 @@ void vprintf1(const char *fmt, ...) printf("%Ld", ll); break; case 'F': - ld = va_arg(ap, long double); + ld = va_arg(ap, LONG_DOUBLE); printf("%Lf", ld); break; } @@ -1977,13 +1992,13 @@ void stdarg_for_struct(struct myspace bob, ...) void stdarg_test(void) { - long double ld = 1234567891234LL; + LONG_DOUBLE ld = 1234567891234LL; struct myspace bob; vprintf1("%d %d %d\n", 1, 2, 3); vprintf1("%f %d %f\n", 1.0, 2, 3.0); vprintf1("%l %l %d %f\n", 1234567891234LL, 987654321986LL, 3, 1234.0); - vprintf1("%F %F %F\n", 1.2L, 2.3L, 3.4L); + vprintf1("%F %F %F\n", LONG_DOUBLE_LITERAL(1.2), LONG_DOUBLE_LITERAL(2.3), LONG_DOUBLE_LITERAL(3.4)); #ifdef __x86_64__ /* a bug of x86's TCC */ vprintf1("%d %f %l %F %d %f %l %F\n", diff --git a/tests/tests2/Makefile b/tests/tests2/Makefile index bf7511ff..9c2e70f4 100644 --- a/tests/tests2/Makefile +++ b/tests/tests2/Makefile @@ -13,7 +13,7 @@ ifeq ($(TARGETOS),Darwin) export MACOSX_DEPLOYMENT_TARGET:=10.2 endif -TCC_RUN = $(TOP)/tcc $(TCCFLAGS) -run +TCC = $(TOP)/tcc $(TCCFLAGS) TESTS = \ 00_assignment.test \ @@ -84,8 +84,8 @@ endif %.test: %.c %.expect @echo Test: $*... @if [ "x`echo $* | grep args`" != "x" ]; \ - then $(TCC_RUN) $< - arg1 arg2 arg3 arg4 >$*.output; \ - else $(TCC_RUN) $< >$*.output; \ + then $(TCC) $< -norunsrc -run $(notdir $<) - arg1 arg2 arg3 arg4 >$*.output; \ + else $(TCC) -run $< >$*.output; \ fi @if diff -bu $(<:.c=.expect) $*.output ; \ then rm -f $*.output; \ @@ -96,3 +96,6 @@ all test: $(TESTS) clean: rm -vf fred.txt *.output + +Makefile: $(top_srcdir)/tests/tests2/Makefile + cp $< $@ -- 2.11.4.GIT