diff --git a/module/language/c99/compiler.mes b/module/language/c99/compiler.mes index 13f26869..c8697842 100644 --- a/module/language/c99/compiler.mes +++ b/module/language/c99/compiler.mes @@ -1399,6 +1399,8 @@ (- (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) @@ -1408,6 +1410,10 @@ ((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) @@ -2215,26 +2221,19 @@ (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)