mescc: Tinycc support: foo *bar[baz].
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 28 Jul 2017 16:04:39 +0000 (18:04 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 28 Jul 2017 16:04:39 +0000 (18:04 +0200)
* module/language/c99/compiler.mes (decl->info): Support foo *bar[baz].
* module/language/c99/compiler.mes (push-global): Support push of -2,
  -1.  Change signature to take info.  Update callers.
  (push-global-address): Change signature to take info.  Update callers.

module/language/c99/compiler.mes
scaffold/tests/77-pointer-assign.c

index 677b333ce99c2752bdf304b78a6d458deef3c99c..89ed87c65061fdb185db52da01da6e931d180e21 100644 (file)
 (define (append-text info text)
   (clone info #:text (append (.text info) text)))
 
-(define (push-global globals)
+(define (push-global info)
   (lambda (o)
-    (list (i386:push-label-mem `(#:address ,o)))))
+    (let ((ptr (ident->pointer info o)))
+      (case ptr
+        ((-2) (list (i386:push-label `(#:address ,o))))
+        ((-1) (list (i386:push-label `(#:address ,o))))
+        (else (list (i386:push-label-mem `(#:address ,o))))))))
 
 (define (push-local locals)
   (lambda (o)
     (wrap-as (i386:push-local (local:id o)))))
 
-(define (push-global-address globals)
+(define (push-global-address info)
   (lambda (o)
     (list (i386:push-label o))))
 
                  ((push-local (.locals info)) local))))
           (let ((global (assoc-ref (.globals info) o)))
             (if global
-                ((push-global (.globals info)) o) ;; FIXME: char*/int
+                ((push-global info) o) ;; FIXME: char*/int
                 (let ((constant (assoc-ref (.constants info) o)))
                   (if constant
                       (wrap-as (append (i386:value->accu constant)
       (if local ((push-local-address (.locals info)) local)
           (let ((global (assoc-ref (.globals info) o)))
           (if global
-              ((push-global-address (.globals info)) o)
+              ((push-global-address info) o)
               ((push-global-address #f) `(#:address ,o))))))))
 
 (define (push-ident-de-ref info)
   (lambda (o)
     (let ((local (assoc-ref (.locals info) o)))
       (if local ((push-local-de-ref info) local)
-          ((push-global-de-ref (.globals info)) o)))))
+          ((push-global-de-ref info) o)))))
 
 (define (push-ident-de-de-ref info)
   (lambda (o)
                  (type (ident->type info o))
                  (size (if (= ptr 1) (ast-type->size info type)
                            4)))
-            (wrap-as (append (i386:local->accu (local:id local))
+            -            (wrap-as (append (i386:local->accu (local:id local))
                              (if (= size 1) (i386:byte-base->accu-address)
                                  (i386:base->accu-address)))))
-          (let ((size 4)) ;; FIXME
-            (wrap-as (append (i386:label-mem->accu `(#:address ,o))
-                             (if (= size 1) (i386:byte-base->accu-address)
-                                 (i386:base->accu-address)))))))))
+          (let ((ptr (ident->pointer info o))
+                (size 4)) ;; FIXME size
+            (case ptr
+              ((-2) (wrap-as (append (i386:label->accu `(#:address ,o))
+                                     (if (= size 1) (i386:byte-base->accu-address)
+                                         (i386:base->accu-address)))))
+              ((-1) (wrap-as (append (i386:label->accu `(#:address ,o))
+                                     (if (= size 1) (i386:byte-base->accu-address)
+                                         (i386:base->accu-address)))))
+              (else (wrap-as (append (i386:label-mem->accu `(#:address ,o))
+                                     (if (= size 1) (i386:byte-base->accu-address)
+                                         (i386:base->accu-address)))))))))))
 
 (define (value->ident info)
   (lambda (o value)
               (let* ((type (ident->type info name))
                      (ptr (ident->pointer info name))
                      (size (if (= ptr 1) (ast-type->size info type)
-                          4)))
+                               4)))
                 (append-text info (append (wrap-as (i386:accu->base))
                                           ((base->ident-address info) name)))))  ; FIXME: size
              ((de-ref ,expr)
                       (globals (append globals (list array))))
                  (clone info #:globals globals)))))
 
+        ;; struct foo *bar[2];
+        ((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (ptr-declr (pointer) (array-of (ident ,name) ,count)))))
+         (let ((type (ast->type type)))
+           (if (.function info)
+               (let* ((local (car (add-local locals name type -1)))
+                      (count (p-expr->number info count))
+                      (size 4)
+                      (local (make-local-entry name type -2 (+ (local:id (cdr local)) -1 (quotient (+ (* count size) 3) 4))))                      
+                      (locals (cons local locals))
+                      (info (clone info #:locals locals)))
+                 info)
+               (let* ((globals (.globals info))
+                      (count (p-expr->number info count))
+                      (size 4)
+                      (global (make-global-entry name type -2 (string->list (make-string (* count size) #\nul))))
+                      (globals (append globals (list global))))
+                 (clone info #:globals globals)))))
+
         ((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (array-of (ident ,array) (p-expr (fixed ,size))) (initzer (p-expr (string ,string))))))
          (if (.function info)
              (error  "TODO: " o)
index a9a16e86a3fff5f98f1b1dd1eb62b301e53ee5d8..c54ed88600e1ca96021c4a86bcf6b8601cf557c4 100644 (file)
@@ -20,7 +20,6 @@
 
 #include "30-test.i"
 
-
 struct baz {
   int i;
 };
@@ -53,6 +52,16 @@ add2 (void *ptab)
   *x = 0x33445566;
 }
 
+struct foo *hash_ident[10];
+
+void *
+memset (void *s, int c, int n)
+{
+  char *p = s;
+  while (n--) *p++ = c;
+  return s;
+}
+
 int
 test ()
 {
@@ -74,5 +83,9 @@ test ()
   eputs ("f.bar:"); eputs (itoa (f.bar)); eputs ("\n");
   if (f.bar != 0x33445566) return 3;
 
+  hash_ident[0] = 10;
+  *hash_ident = 0;
+  memset (hash_ident, 0, 10);
+
   return 0;
 }