mescc: Tinycc support: arithmetic in initializes.
authorJan Nieuwenhuizen <janneke@gnu.org>
Mon, 24 Jul 2017 13:22:51 +0000 (15:22 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 26 Jul 2017 09:36:44 +0000 (11:36 +0200)
* module/language/c99/compiler.mes (p-expr->number): Handle
  bitwise-or, constants.
  (initzer-data): Refactor, use p-expr->number.

module/language/c99/compiler.mes

index 13f2686971efb08cd6933a79c28a783a32413f97..c86978425d7544747564c272f7e2fd0f693b65fd 100644 (file)
      (- (p-expr->number info a)))
     ((add ,a ,b)
      (+ (p-expr->number info a) (p-expr->number info b)))
+    ((bitwise-or ,a ,b)
+     (logior (p-expr->number info a) (p-expr->number info b)))
     ((div ,a ,b)
      (quotient (p-expr->number info a) (p-expr->number info b)))
     ((mul ,a ,b)
     ((sizeof-expr (i-sel (ident ,field) (p-expr (ident ,struct))))
      (let ((type (ident->type info struct)))
        (field-size info type field)))
+    ((p-expr (ident ,name))
+     (let ((value (assoc-ref (.constants info) name)))
+       (or value
+           (error (format #f "p-expr->number: undeclared identifier: ~s\n" o)))))
     (_  (error (format #f "p-expr->number: not supported: ~s\n" o)))))
 
 (define (struct-field info)
 (define (initzer->data info)
   (lambda (o)
     (pmatch o
-      ((initzer (p-expr (ident ,name)))
-       (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))
       ((initzer (p-expr (string . ,strings))) `((#:string ,(string-join strings "")) #f #f #f))
       ((initzer (initzer-list . ,initzers)) (append-map (initzer->data info) initzers))
-      ((initzer (bitwise-or . ,values))
-       (let loop ((values (map (initzer->value info) values)) (value 0))
-         (if (null? values) (int->bv32 value)
-             (loop (cdr values) (logior value (car values))))))
+      ((initzer (ref-to (p-expr (ident ,name)))) `(,name #f #f #f))
       ((initzer (ref-to (i-sel (ident ,field) (cast (type-name (decl-spec-list ,struct) (abs-declr (pointer))) (p-expr (fixed ,base))))))
        (let* ((type (decl->ast-type struct))
               (offset (field-offset info type field))
               (base (cstring->number base)))
          (int->bv32 (+ base offset))))
       (() (int->bv32 0))
+      ((initzer ,p-expr)
+       (int->bv32 (p-expr->number info p-expr)))
       (_ (error "initzer->data: unsupported: " o)))))
 
 (define (initzer->accu info)