(- (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)