Again I've no idea of the best patch to apply, but two remarks: * First, 106_pthread.c fails on Windows because of: Test: 106_pthread... --- 106_pthread.expect 2019-10-22 20:47:55.982574300 +0200 +++ 106_pthread.output 2019-10-23 11:40:46.742218000 +0200 @@ -1 +1,2 @@ -ok +In file included from 106_pthread.c:2: +106_pthread.c:2: error: include file 'pthread.h' not found You should run this test only on Linux systems
* Your new patch test TCC_TARGET_X86_64, how do you explain that with or without this patch your test case looks to work on Windows x64 and produces "42 42"? -----Original Message----- From: Tinycc-devel [mailto:tinycc-devel-bounces+eligis=orange...@nongnu.org] On Behalf Of Herman ten Brugge via Tinycc-devel Sent: Wednesday, October 23, 2019 11:23 To: jull...@eligis.com; tinycc-devel@nongnu.org Cc: Herman ten Brugge Subject: Re: [Tinycc-devel] core dump because stack overwritten How about this patch: -------------------------- --- a/tccgen.c 2019-10-22 19:52:48.761977245 +0200 +++ b/tccgen.c 2019-10-23 11:18:14.871290060 +0200 @@ -2627,7 +2627,9 @@ static void gen_cvt_ftoi1(int t) gfunc_call(1); vpushi(0); vtop->r = REG_IRET; +#if !defined(TCC_TARGET_X86_64) /* REG_LRET only for VT_QLONG */ vtop->r2 = REG_LRET; +#endif } else { gen_cvt_ftoi(t); } -------------------------- According to https://en.wikipedia.org/wiki/X86_calling_conventions the x86_64 only uses rax for 64 bits returns. Herman On 2019-10-23 07:20, Christian Jullien wrote: > I confirm your test case fails on Linux x64. It looks your patch pay > attention to PTR_SIZE == 4 (i.e. it now enters if only with 32bit processor). > However, w.o. the patch I can't reproduce the core dump on aarch64 Linux nor > with Windows x64 which are also a 64bit processors. They both correctly > display "42 42" > No core dumps does not mean it works, memory may be corrupted somewhere else. > > Either your patch is only required for Linux x64 or there is something to > investigate more carefully. > > I can only test on different platforms but I'm unable to give you further > advices. > > M2c > > C. > > -----Original Message----- > From: Tinycc-devel [mailto:tinycc-devel-bounces+eligis=orange...@nongnu.org] > On Behalf Of Herman ten Brugge via Tinycc-devel > Sent: Tuesday, October 22, 2019 22:15 > To: tinycc-devel@nongnu.org > Cc: Herman ten Brugge > Subject: [Tinycc-devel] core dump because stack overwritten > > I have a small testcase: > > -------------- > #include <stdio.h> > #include <stdlib.h> > #include <inttypes.h> > > int > main(void) > { > struct tst_struct { uint64_t cnt; } *tst = > (struct tst_struct *) malloc (sizeof (struct tst_struct)); > > tst->cnt = 42; > printf ("%" PRIu64 " %" PRIu64 "\n", tst->cnt, (uint64_t) (tst->cnt / > 1.0)); > return 0; > } > ---------------- > when I compile this with tcc and run it I get a core dump. The problem > is that the stack is overwritten. > I have a fix. > > ------------------------ > --- a/tccgen.c 2019-10-22 19:52:48.761977245 +0200 > +++ b/tccgen.c 2019-10-22 22:08:08.465825842 +0200 > @@ -1203,7 +1203,7 @@ ST_FUNC void save_reg_upstack(int r, int > } > #endif > /* special long long case */ > - if ((p->r2 & VT_VALMASK) < VT_CONST) { > + if (PTR_SIZE == 4 && (p->r2 & VT_VALMASK) < VT_CONST) { > sv.c.i += PTR_SIZE; > store(p->r2, &sv); > } > --------------------- > But am not sure if this is the correct fix. The code generator is quite > complex. > > Herman > > > _______________________________________________ > Tinycc-devel mailing list > Tinycc-devel@nongnu.org > https://lists.nongnu.org/mailman/listinfo/tinycc-devel > _______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel _______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel