mescc: Tinycc support: more list initializers.
authorJan Nieuwenhuizen <janneke@gnu.org>
Tue, 18 Jul 2017 06:04:50 +0000 (08:04 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 26 Jul 2017 09:36:08 +0000 (11:36 +0200)
* module/language/c99/compiler.mes (init-declr->name): Handle array,
  pointer array.
  (init-declr->pointer): Likewise.
  (decl->info): Generalize list initializers, add pointer variant.
  FIXME: AST-rewriting?

module/language/c99/compiler.mes
scaffold/tests/71-struct-array.c

index b74be83a43d736acfe04d89a8f1aa49e6595221c..6c9fa6ffb0e32675059ecf203ebf21ebafb97981 100644 (file)
   (pmatch o
     ((ident ,name) name)
     ((ptr-declr ,pointer (ident ,name)) name)
+    ((array-of (ident ,name)) name)
     ((array-of (ident ,name) ,index) name)
+    ((ptr-declr (pointer) (array-of (ident ,name) (p-expr ,size))) name)
     (_ (error "init-declr->name unsupported: " o))))
 
 (define (init-declr->pointer o)
     ((ident ,name) 0)
     ((ptr-declr ,pointer (ident ,name)) (ptr-declr->pointer pointer))
     ((array-of (ident ,name) ,index) 1)
+    ((array-of (ident ,name)) 1)
+    ((ptr-declr (pointer) (array-of (ident ,name) (p-expr ,size))) -2)
     (_ (error "init-declr->pointer unsupported: " o))))
 
 (define (statements->clauses statements)
 
         ;; DECL
         ;; char *bla[] = {"a", "b"};
-        ((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ptr-declr (pointer) (array-of (ident ,name))) (initzer (initzer-list . ,initzers)))))
+        ((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (ptr-declr (pointer) (array-of (ident ,name))) (initzer (initzer-list . ,initzers)))))
          (let* ((type (decl->ast-type type))
                 (entries (filter identity (append-map (initzer->globals globals) initzers)))
                 (entry-size 4)
                  (clone info #:globals globals)))))
 
         ;; int i = 0, j = 0;
-        ((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ident ,name) . ,initzer) . ,rest))
+        ((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (ident ,name) . ,initzer) . ,rest))
          (let loop ((inits `((init-declr (ident ,name) ,@initzer) ,@rest)) (info info))
            (if (null? inits) info
                (loop (cdr inits)
                      ((decl->info info)
-                      `(decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list ,(car inits))))))))
+                      `(decl (decl-spec-list (type-spec ,type)) (init-declr-list ,(car inits))))))))
+
+        ;; int *i = 0, j ..;
+        ((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (ptr-declr ,pointer (ident ,name)) . ,initzer) . ,rest))
+         (let loop ((inits `((init-declr (ptr-declr ,pointer (ident ,name)) ,@initzer) ,@rest)) (info info))
+           (if (null? inits) info
+               (loop (cdr inits)
+                     ((decl->info info)
+                      `(decl (decl-spec-list (type-spec ,type)) (init-declr-list ,(car inits))))))))
 
         ((decl (decl-spec-list (stor-spec (typedef)) ,type) ,name)
          (format (current-error-port) "SKIP: typedef=~s\n" o)
        (let ((value (assoc-ref (.constants info) name)))
          (int->bv32 (or value 0))))
       ((initzer (p-expr (fixed ,value))) (int->bv32 (cstring->number value)))
+      ((initzer (p-expr (char ,char)))  (int->bv32 (char->integer (string-ref char 0))))
       ((initzer (neg (p-expr (fixed ,value)))) (int->bv32 (- (cstring->number value))))
       ((initzer (ref-to (p-expr (ident ,name)))) `(,name #f #f #f))
       ((initzer (p-expr (string ,string))) `((#:string ,string) #f #f #f))
index 5f0667103212878aa9a38830dcb4309cb55790b1..3d1dbc3b49eafcd708725eb5dc8a94cc3207efb6 100644 (file)
@@ -23,6 +23,8 @@
 
 struct foo;
 
+struct foo* krak;
+
 typedef struct foo foo_struct;
 
 struct foo
@@ -30,6 +32,18 @@ struct foo
   int bar[2];
 };
   
+int a, b;
+int i, *j;
+int *k = 0, l;
+
+typedef struct baz
+{
+  int bar;
+  //struct baz *f, *g;
+  struct baz *f;
+  struct baz *g;
+} baz;
+
 int
 test ()
 {