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

Reply via email to