1 564ca709 2004-04-19 devnull #include <u.h>
2 564ca709 2004-04-19 devnull #include <libc.h>
3 564ca709 2004-04-19 devnull #include <bio.h>
4 564ca709 2004-04-19 devnull #include <ctype.h>
5 564ca709 2004-04-19 devnull #include <mach.h>
6 564ca709 2004-04-19 devnull #define Extern extern
7 564ca709 2004-04-19 devnull #include "acid.h"
10 564ca709 2004-04-19 devnull srch(Type *t, char *s)
15 564ca709 2004-04-19 devnull while(t) {
16 564ca709 2004-04-19 devnull if(strcmp(t->tag->name, s) == 0) {
17 564ca709 2004-04-19 devnull if(f == 0 || t->depth < f->depth)
20 564ca709 2004-04-19 devnull t = t->next;
22 564ca709 2004-04-19 devnull return f;
26 564ca709 2004-04-19 devnull odot(Node *n, Node *r)
30 564ca709 2004-04-19 devnull Node res;
31 564ca709 2004-04-19 devnull ulong addr;
33 564ca709 2004-04-19 devnull s = n->sym->name;
34 564ca709 2004-04-19 devnull if(s == 0)
35 564ca709 2004-04-19 devnull fatal("dodot: no tag");
37 564ca709 2004-04-19 devnull expr(n->left, &res);
38 564ca709 2004-04-19 devnull if(res.store.comt == 0)
39 564ca709 2004-04-19 devnull error("no type specified for (expr).%s", s);
41 564ca709 2004-04-19 devnull if(res.type != TINT)
42 564ca709 2004-04-19 devnull error("pointer must be integer for (expr).%s", s);
44 564ca709 2004-04-19 devnull t = srch(res.store.comt, s);
45 564ca709 2004-04-19 devnull if(t == 0)
46 564ca709 2004-04-19 devnull error("no tag for (expr).%s", s);
48 564ca709 2004-04-19 devnull /* Propagate types */
49 564ca709 2004-04-19 devnull if(t->type)
50 564ca709 2004-04-19 devnull r->store.comt = t->type->lt;
52 564ca709 2004-04-19 devnull addr = res.store.u.ival+t->offset;
53 564ca709 2004-04-19 devnull if(t->fmt == 'a') {
54 564ca709 2004-04-19 devnull r->op = OCONST;
55 564ca709 2004-04-19 devnull r->store.fmt = 'a';
56 564ca709 2004-04-19 devnull r->type = TINT;
57 564ca709 2004-04-19 devnull r->store.u.ival = addr;
60 564ca709 2004-04-19 devnull indir(cormap, addr, t->fmt, r);
64 564ca709 2004-04-19 devnull static Type **tail;
65 564ca709 2004-04-19 devnull static Lsym *base;
68 564ca709 2004-04-19 devnull buildtype(Node *m, int d)
72 564ca709 2004-04-19 devnull if(m == ZN)
75 564ca709 2004-04-19 devnull switch(m->op) {
76 564ca709 2004-04-19 devnull case OLIST:
77 564ca709 2004-04-19 devnull buildtype(m->left, d);
78 564ca709 2004-04-19 devnull buildtype(m->right, d);
81 564ca709 2004-04-19 devnull case OCTRUCT:
82 564ca709 2004-04-19 devnull buildtype(m->left, d+1);
85 564ca709 2004-04-19 devnull t = malloc(sizeof(Type));
86 564ca709 2004-04-19 devnull t->next = 0;
87 564ca709 2004-04-19 devnull t->depth = d;
88 564ca709 2004-04-19 devnull t->tag = m->sym;
89 564ca709 2004-04-19 devnull t->base = base;
90 564ca709 2004-04-19 devnull t->offset = m->store.u.ival;
91 564ca709 2004-04-19 devnull if(m->left) {
92 564ca709 2004-04-19 devnull t->type = m->left->sym;
93 564ca709 2004-04-19 devnull t->fmt = 'a';
96 564ca709 2004-04-19 devnull t->type = 0;
97 564ca709 2004-04-19 devnull if(m->right)
98 564ca709 2004-04-19 devnull t->type = m->right->sym;
99 564ca709 2004-04-19 devnull t->fmt = m->store.fmt;
102 564ca709 2004-04-19 devnull *tail = t;
103 564ca709 2004-04-19 devnull tail = &t->next;
108 564ca709 2004-04-19 devnull defcomplex(Node *tn, Node *m)
110 564ca709 2004-04-19 devnull tail = &tn->sym->lt;
111 564ca709 2004-04-19 devnull base = tn->sym;
112 564ca709 2004-04-19 devnull buildtype(m, 0);
116 564ca709 2004-04-19 devnull decl(Node *n)
118 564ca709 2004-04-19 devnull Node *l;
119 564ca709 2004-04-19 devnull Value *v;
120 564ca709 2004-04-19 devnull Frtype *f;
121 564ca709 2004-04-19 devnull Lsym *type;
123 564ca709 2004-04-19 devnull type = n->sym;
124 564ca709 2004-04-19 devnull if(type->lt == 0)
125 564ca709 2004-04-19 devnull error("%s is not a complex type", type->name);
127 564ca709 2004-04-19 devnull l = n->left;
128 564ca709 2004-04-19 devnull if(l->op == ONAME) {
129 564ca709 2004-04-19 devnull v = l->sym->v;
130 564ca709 2004-04-19 devnull v->store.comt = type->lt;
131 564ca709 2004-04-19 devnull v->store.fmt = 'a';
136 564ca709 2004-04-19 devnull * Frame declaration
138 564ca709 2004-04-19 devnull for(f = l->sym->local; f; f = f->next) {
139 564ca709 2004-04-19 devnull if(f->var == l->left->sym) {
140 564ca709 2004-04-19 devnull f->type = n->sym->lt;
144 564ca709 2004-04-19 devnull f = malloc(sizeof(Frtype));
145 564ca709 2004-04-19 devnull if(f == 0)
146 564ca709 2004-04-19 devnull fatal("out of memory");
148 564ca709 2004-04-19 devnull f->type = type->lt;
150 564ca709 2004-04-19 devnull f->var = l->left->sym;
151 564ca709 2004-04-19 devnull f->next = l->sym->local;
152 564ca709 2004-04-19 devnull l->sym->local = f;