mescc: Tinycc support: Numeric constant expressions.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 17:27:33 +0000 (19:27 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 17:27:33 +0000 (19:27 +0200)
module/language/c99/compiler.mes

index 0dcee64ccae14b1a77db00b4470a3963d58fea68..f275fb99689230fdde2b51e013decd5f84b05d28 100644 (file)
           ((string-prefix? "0" s) (string->number s 8))
           (else (string->number s)))))
 
-(define (expr->number info o)
+(define (try-expr->number info o)
   (pmatch o
     ((fixed ,a) (cstring->number a))
     ((p-expr ,expr) (expr->number info expr))
     ((cond-expr ,test ,then ,else)
      (if (p-expr->bool info test) (expr->number info then) (expr->number info else)))
     (,string (guard (string? string)) (cstring->number string))
-    (_  (error (format #f "expr->number: not supported: ~s\n" o)))))
+    ((ident ,name) (assoc-ref (.constants info) name))
+    (_  #f)))
+
+(define (expr->number info o)
+  (or (try-expr->number info  o)
+      (error (format #f "expr->number: not supported: ~s\n" o))))
 
 (define (p-expr->bool info o)
   (pmatch o
      (append (map int->bv32 o)))
     ((initzer ,init) (init->data init info))
     ((cast _ ,expr) (init->data expr info))
-    (_ (error "init->data: not supported: " o))))
+    (_ (let ((number (try-expr->number info o)))
+         (cond (number (int->bv32 number))
+               (else (error "init->data: not supported: " o)))))))
 
 (define (init->strings o info)
   (let ((globals (.globals info)))