mescc: Tinycc support: assign pointer to struct field.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 16 Jul 2017 21:39:59 +0000 (23:39 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 26 Jul 2017 09:36:08 +0000 (11:36 +0200)
* module/language/c99/compiler.mes (expr->accu, expr->accu*): Support
  pointer field selection.
* scaffold/tests/72-typedef-struct-def.c (test): Test it.

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

index c9874eb751e705471fee0f50007f0e3d9b42b0e0..e779d200b03494ce3875122f3629d7a9ae528495 100644 (file)
                                      (wrap-as (i386:mem->accu))
                                      (wrap-as (i386:mem+n->accu offset))))))
 
+        ((i-sel (ident ,field) (de-ref (p-expr (ident ,array))))
+         (let* ((type (ident->type info array))
+                (offset (field-offset info type field))
+                (text (.text info)))
+           (append-text info (append ((ident-address->accu info) array)
+                                     (wrap-as (i386:mem->accu))
+                                     (wrap-as (i386:mem->accu))
+                                     (wrap-as (i386:mem+n->accu offset))))))
+
         ((de-ref (p-expr (ident ,name)))
          (let* ((type (ident->type info name))
                 (ptr (ident->pointer info name))
                                                (wrap-as (append (i386:accu+n 4)
                                                                 (i386:base+n 4)
                                                                 (i386:base-address->accu-address)))))))))))
+
+             ((i-sel (ident ,field) ,array)
+              (let* ((info (append-text info (wrap-as (i386:push-accu))))
+                     (info ((expr->accu* info) a))
+                     (info (append-text info (wrap-as (i386:pop-base)))))
+                (append-text info (wrap-as (i386:base->accu-address)))))
+
              (_ (error "expr->accu: unsupported assign: " a)))))
 
         (_ (error "expr->accu: unsupported: " o))))))
               (info ((expr->base info) array)))
           (append-text info (wrap-as (i386:accu+base)))))
 
+      ((i-sel (ident ,field) (p-expr (ident ,array)))
+       (let* ((type (ident->type info array))
+              (offset (field-offset info type field))
+              (text (.text info)))
+         (append-text info (append ((ident-address->accu info) array)
+                                   (wrap-as (i386:mem->accu))
+                                   (wrap-as (i386:accu+value offset))))))
+
+      ((i-sel (ident ,field) (de-ref (p-expr (ident ,array))))
+       (let* ((type (ident->type info array))
+              (offset (field-offset info type field))
+              (text (.text info)))
+         (append-text info (append ((ident-address->accu info) array)
+                                   (wrap-as (i386:mem->accu))
+                                   (wrap-as (i386:mem->accu))
+                                   (wrap-as (i386:accu+value offset))))))
+
       (_ (error "expr->accu*: unsupported: " o)))))
 
 (define (ident->constant name value)
index 4d4fa7e518e295b0663d98dc773fe1c8ff1ff351..5aa90e3c2348baa0a89d862189f47d6cf1bc6a90 100644 (file)
@@ -34,11 +34,18 @@ typedef struct
 int
 test ()
 {
-  foo b = {1};
-  printf ("b.i=%d\n", b.i);
+  foo f = {1};
+  printf ("f.i=%d\n", f.i);
 
-  bar b = {2};
+  bar b = {1};
   printf ("b.i=%d\n", b.i);
+  bar* p = &b;
+  p->i = 2;
+  printf ("p->i=%d\n", b.i);
+
+  bar** pp = &p;
+  (*pp)->i = 3;
+  printf ("(*pp)->i=%d\n", b.i);
 
   return 0;
 }