mescc: Tinycc support: pre/post-inc/dec more.
authorJan Nieuwenhuizen <janneke@gnu.org>
Mon, 17 Jul 2017 05:33:38 +0000 (07:33 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 26 Jul 2017 09:36:08 +0000 (11:36 +0200)
* module/language/c99/compiler.mes (expr-add): New function.
  (expr->pointer): New function.
  (expr->accu): Use it to support broader pre/post-inc/dec..
* scaffold/tests/72-typedef-struct-def.c (test): Test it.

module/language/c99/compiler.mes
scaffold/tests/72-typedef-struct-def.c

index e750e7b31faa1b33865841e85e6a025d9fd39517..97f5fc85c1947976fac152820a8a2bfe5744c95d 100644 (file)
       (if local (wrap-as (i386:local-add (local:id local) n))
           (list (i386:label-mem-add `(#:address ,o) n))))))
 
+(define (expr-add info)
+  (lambda (o n)
+    (let* ((info ((expr->accu* info) o))
+           (info (append-text info (wrap-as (i386:accu-mem-add n)))))
+      info)))
+
+(define (expr->pointer info o)
+  (pmatch o
+    ((p-expr (ident ,name)) (ident->pointer info name))  ;; FIXME
+    (_ 0)))
+
 (define (ident-address-add info)
   (lambda (o n)
     (let ((local (assoc-ref (.locals info) o)))
                                      ((ident-add info) name size)))))
 
         ((post-dec (p-expr (ident ,name)))
-         (or (assoc-ref locals name) (begin (stderr "i-- ~a\n" name) (error "undefined identifier: " name)))
          (append-text info (append ((ident->accu info) name)
                                    ((ident-add info) name -1))))
 
         ((pre-inc (p-expr (ident ,name)))
-         (or (assoc-ref locals name) (begin (stderr "++i ~a\n" name) (error "undefined identifier: " name)))
          (append-text info (append ((ident-add info) name 1)
                                    ((ident->accu info) name))))
 
         ((pre-dec (p-expr (ident ,name)))
-         (or (assoc-ref locals name) (begin (stderr "--i ~a\n" name) (error "undefined identifier: " name)))
          (append-text info (append ((ident-add info) name -1)
                                    ((ident->accu info) name))))
 
+        ((post-inc ,expr)
+         (let* ((info (append ((expr->accu info) expr)))
+                (info (append-text info (wrap-as (i386:push-accu))))
+                (ptr (expr->pointer info expr))
+                (size (if (> ptr 0) 4 1))
+                (info ((expr-add info) expr size))
+                (info (append-text info (wrap-as (i386:pop-accu)))))
+           info))
+
+        ((post-dec ,expr)
+         (let* ((info (append ((expr->accu info) expr)))
+                (info (append-text info (wrap-as (i386:push-accu))))
+                (ptr (expr->pointer info expr))
+                (size (if (> ptr 0) 4 1))
+                (info ((expr-add info) expr (- size)))
+                (info (append-text info (wrap-as (i386:pop-accu)))))
+           info))
+
+        ((pre-inc ,expr)
+         (let* ((ptr (expr->pointer info expr))
+                (size (if (> ptr 0) 4 1))
+                (info ((expr-add info) expr size))
+                (info (append ((expr->accu info) expr))))
+           info))
+
+        ((pre-dec ,expr)
+         (let* ((ptr (expr->pointer info expr))
+                (size (if (> ptr 0) 4 1))
+                (info ((expr-add info) expr (- size)))
+                (info (append ((expr->accu info) expr))))
+           info))
+
         ((add ,a ,b) ((binop->accu info) a b (i386:accu+base)))
         ((sub ,a ,b) ((binop->accu info) a b (i386:accu-base)))
         ((bitwise-or ,a ,b) ((binop->accu info) a b (i386:accu-or-base)))
          ((expr->accu info) o))
 
         ((assn-expr (de-ref (post-inc (p-expr (ident ,name)))) (op ,op) ,b)
-         (let ((info ((expr->accu info) `(assn-expr (de-ref (p-expr (ident ,name))) (op ,op) ,b))))
-           (append-text info ((ident-add info) name 1)))) ;; FIXME: size
+         (let* ((info ((expr->accu info) `(assn-expr (de-ref (p-expr (ident ,name))) (op ,op) ,b)))
+                (type (ident->type info name))
+                (ptr (ident->pointer info name))
+                (size (if (> ptr 1) 4 1)))
+           (append-text info ((ident-add info) name size)))) ;; FIXME: size
 
         ((assn-expr (de-ref (post-dec (p-expr (ident ,name)))) (op ,op) ,b)
-         (let ((info ((expr->accu info) `(assn-expr (de-ref (p-expr (ident ,name))) (op ,op) ,b))))
-           (append-text info ((ident-add info) name -1)))) ;; FIXME: size
+         (let* ((info ((expr->accu info) `(assn-expr (de-ref (p-expr (ident ,name))) (op ,op) ,b)))
+                (type (ident->type info name))
+                (ptr (ident->pointer info name))
+                (size (if (> ptr 1) 4 1)))
+           (append-text info ((ident-add info) name (- size))))) ;; FIXME: size
 
         ((assn-expr ,a (op ,op) ,b)
          (let* ((info (append-text info (ast->comment o)))
index 5aa90e3c2348baa0a89d862189f47d6cf1bc6a90..73ff7356daffc55b70dd5d37ef2d1246a3f12c10 100644 (file)
@@ -43,6 +43,13 @@ test ()
   p->i = 2;
   printf ("p->i=%d\n", b.i);
 
+  p->i++;
+  printf ("p->i=%d\n", b.i);
+
+  p->i--;
+  printf ("p->i=%d\n", b.i);
+
+
   bar** pp = &p;
   (*pp)->i = 3;
   printf ("(*pp)->i=%d\n", b.i);