mescc: Tinycc support: struct assign by value.
[mes.git] / module / language / c99 / compiler.mes
index bd7f914abc4dfbcde056b9745485b4a62ea85440..02e66bfc9b8f0afcc665d6a7576f26694d95ac36 100644 (file)
 
 (define (accu->ident info)
   (lambda (o)
-    (let ((local (assoc-ref (.locals info) o)))
-      (if local (wrap-as (i386:accu->local (local:id local)))
-          (let ((ptr (ident->pointer info o)))
-            (list (i386:accu->label `(#:address ,o))))))))
-
-(define (base->ident info)
-  (lambda (o)
-    (let ((local (assoc-ref (.locals info) o)))
-      (if local (wrap-as (i386:base->local (local:id local)))
-          (list (i386:base->label `(#:address ,o)))))))
+    (let* ((local (assoc-ref (.locals info) o))
+           (ptr (ident->pointer info o))
+           (size (if (= ptr -1) (ident->size info o)
+                     4)))
+      (if local (if (<= size 4) (wrap-as (i386:accu->local (local:id local)))
+                    (wrap-as (i386:accu*n->local (local:id local) size)))
+          (if (<= size 4) (wrap-as (i386:accu->label o))
+              (wrap-as (i386:accu*n->label o size)))))))
 
 (define (base->ident-address info)
   (lambda (o)
                                                     ((equal? op "<<=") (wrap-as (i386:accu<<base)))
                                                     (else (error (format #f "mescc: op ~a not supported: ~a\n" op o)))))))))
            (pmatch a
-             ((p-expr (ident ,name)) (append-text info ((accu->ident info) name)))
+             ((p-expr (ident ,name))
+              (append-text info ((accu->ident info) name)))
              ((d-sel (ident ,field) ,p-expr)
               (let* ((type (p-expr->type info p-expr))
                      (offset (field-offset info type field))