mescc: Tinycc support: assign pointer to struct field.
* module/language/c99/compiler.mes (expr->accu, expr->accu*): Support pointer field selection. * scaffold/tests/72-typedef-struct-def.c (test): Test it.
This commit is contained in:
parent
9b66421ce8
commit
3cdfdd7407
|
@ -567,6 +567,15 @@
|
||||||
(wrap-as (i386:mem->accu))
|
(wrap-as (i386:mem->accu))
|
||||||
(wrap-as (i386:mem+n->accu offset))))))
|
(wrap-as (i386:mem+n->accu offset))))))
|
||||||
|
|
||||||
|
((i-sel (ident ,field) (de-ref (p-expr (ident ,array))))
|
||||||
|
(let* ((type (ident->type info array))
|
||||||
|
(offset (field-offset info type field))
|
||||||
|
(text (.text info)))
|
||||||
|
(append-text info (append ((ident-address->accu info) array)
|
||||||
|
(wrap-as (i386:mem->accu))
|
||||||
|
(wrap-as (i386:mem->accu))
|
||||||
|
(wrap-as (i386:mem+n->accu offset))))))
|
||||||
|
|
||||||
((de-ref (p-expr (ident ,name)))
|
((de-ref (p-expr (ident ,name)))
|
||||||
(let* ((type (ident->type info name))
|
(let* ((type (ident->type info name))
|
||||||
(ptr (ident->pointer info name))
|
(ptr (ident->pointer info name))
|
||||||
|
@ -781,6 +790,13 @@
|
||||||
(wrap-as (append (i386:accu+n 4)
|
(wrap-as (append (i386:accu+n 4)
|
||||||
(i386:base+n 4)
|
(i386:base+n 4)
|
||||||
(i386:base-address->accu-address)))))))))))
|
(i386:base-address->accu-address)))))))))))
|
||||||
|
|
||||||
|
((i-sel (ident ,field) ,array)
|
||||||
|
(let* ((info (append-text info (wrap-as (i386:push-accu))))
|
||||||
|
(info ((expr->accu* info) a))
|
||||||
|
(info (append-text info (wrap-as (i386:pop-base)))))
|
||||||
|
(append-text info (wrap-as (i386:base->accu-address)))))
|
||||||
|
|
||||||
(_ (error "expr->accu: unsupported assign: " a)))))
|
(_ (error "expr->accu: unsupported assign: " a)))))
|
||||||
|
|
||||||
(_ (error "expr->accu: unsupported: " o))))))
|
(_ (error "expr->accu: unsupported: " o))))))
|
||||||
|
@ -881,6 +897,23 @@
|
||||||
(info ((expr->base info) array)))
|
(info ((expr->base info) array)))
|
||||||
(append-text info (wrap-as (i386:accu+base)))))
|
(append-text info (wrap-as (i386:accu+base)))))
|
||||||
|
|
||||||
|
((i-sel (ident ,field) (p-expr (ident ,array)))
|
||||||
|
(let* ((type (ident->type info array))
|
||||||
|
(offset (field-offset info type field))
|
||||||
|
(text (.text info)))
|
||||||
|
(append-text info (append ((ident-address->accu info) array)
|
||||||
|
(wrap-as (i386:mem->accu))
|
||||||
|
(wrap-as (i386:accu+value offset))))))
|
||||||
|
|
||||||
|
((i-sel (ident ,field) (de-ref (p-expr (ident ,array))))
|
||||||
|
(let* ((type (ident->type info array))
|
||||||
|
(offset (field-offset info type field))
|
||||||
|
(text (.text info)))
|
||||||
|
(append-text info (append ((ident-address->accu info) array)
|
||||||
|
(wrap-as (i386:mem->accu))
|
||||||
|
(wrap-as (i386:mem->accu))
|
||||||
|
(wrap-as (i386:accu+value offset))))))
|
||||||
|
|
||||||
(_ (error "expr->accu*: unsupported: " o)))))
|
(_ (error "expr->accu*: unsupported: " o)))))
|
||||||
|
|
||||||
(define (ident->constant name value)
|
(define (ident->constant name value)
|
||||||
|
|
|
@ -34,11 +34,18 @@ typedef struct
|
||||||
int
|
int
|
||||||
test ()
|
test ()
|
||||||
{
|
{
|
||||||
foo b = {1};
|
foo f = {1};
|
||||||
printf ("b.i=%d\n", b.i);
|
printf ("f.i=%d\n", f.i);
|
||||||
|
|
||||||
bar b = {2};
|
bar b = {1};
|
||||||
printf ("b.i=%d\n", b.i);
|
printf ("b.i=%d\n", b.i);
|
||||||
|
bar* p = &b;
|
||||||
|
p->i = 2;
|
||||||
|
printf ("p->i=%d\n", b.i);
|
||||||
|
|
||||||
|
bar** pp = &p;
|
||||||
|
(*pp)->i = 3;
|
||||||
|
printf ("(*pp)->i=%d\n", b.i);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue