Blame


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"
8 564ca709 2004-04-19 devnull
9 564ca709 2004-04-19 devnull Type*
10 564ca709 2004-04-19 devnull srch(Type *t, char *s)
11 564ca709 2004-04-19 devnull {
12 564ca709 2004-04-19 devnull Type *f;
13 564ca709 2004-04-19 devnull
14 564ca709 2004-04-19 devnull f = 0;
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)
18 564ca709 2004-04-19 devnull f = t;
19 564ca709 2004-04-19 devnull }
20 564ca709 2004-04-19 devnull t = t->next;
21 564ca709 2004-04-19 devnull }
22 564ca709 2004-04-19 devnull return f;
23 564ca709 2004-04-19 devnull }
24 564ca709 2004-04-19 devnull
25 564ca709 2004-04-19 devnull void
26 564ca709 2004-04-19 devnull odot(Node *n, Node *r)
27 564ca709 2004-04-19 devnull {
28 564ca709 2004-04-19 devnull char *s;
29 564ca709 2004-04-19 devnull Type *t;
30 564ca709 2004-04-19 devnull Node res;
31 564ca709 2004-04-19 devnull ulong addr;
32 564ca709 2004-04-19 devnull
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");
36 564ca709 2004-04-19 devnull
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);
40 564ca709 2004-04-19 devnull
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);
43 564ca709 2004-04-19 devnull
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);
47 564ca709 2004-04-19 devnull
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;
51 564ca709 2004-04-19 devnull
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;
58 564ca709 2004-04-19 devnull }
59 564ca709 2004-04-19 devnull else
60 564ca709 2004-04-19 devnull indir(cormap, addr, t->fmt, r);
61 564ca709 2004-04-19 devnull
62 564ca709 2004-04-19 devnull }
63 564ca709 2004-04-19 devnull
64 564ca709 2004-04-19 devnull static Type **tail;
65 564ca709 2004-04-19 devnull static Lsym *base;
66 564ca709 2004-04-19 devnull
67 564ca709 2004-04-19 devnull void
68 564ca709 2004-04-19 devnull buildtype(Node *m, int d)
69 564ca709 2004-04-19 devnull {
70 564ca709 2004-04-19 devnull Type *t;
71 564ca709 2004-04-19 devnull
72 564ca709 2004-04-19 devnull if(m == ZN)
73 564ca709 2004-04-19 devnull return;
74 564ca709 2004-04-19 devnull
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);
79 564ca709 2004-04-19 devnull break;
80 564ca709 2004-04-19 devnull
81 564ca709 2004-04-19 devnull case OCTRUCT:
82 564ca709 2004-04-19 devnull buildtype(m->left, d+1);
83 564ca709 2004-04-19 devnull break;
84 564ca709 2004-04-19 devnull default:
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';
94 564ca709 2004-04-19 devnull }
95 564ca709 2004-04-19 devnull else {
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;
100 564ca709 2004-04-19 devnull }
101 564ca709 2004-04-19 devnull
102 564ca709 2004-04-19 devnull *tail = t;
103 564ca709 2004-04-19 devnull tail = &t->next;
104 564ca709 2004-04-19 devnull }
105 564ca709 2004-04-19 devnull }
106 564ca709 2004-04-19 devnull
107 564ca709 2004-04-19 devnull void
108 564ca709 2004-04-19 devnull defcomplex(Node *tn, Node *m)
109 564ca709 2004-04-19 devnull {
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);
113 564ca709 2004-04-19 devnull }
114 564ca709 2004-04-19 devnull
115 564ca709 2004-04-19 devnull void
116 564ca709 2004-04-19 devnull decl(Node *n)
117 564ca709 2004-04-19 devnull {
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;
122 564ca709 2004-04-19 devnull
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);
126 564ca709 2004-04-19 devnull
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';
132 564ca709 2004-04-19 devnull return;
133 564ca709 2004-04-19 devnull }
134 564ca709 2004-04-19 devnull
135 564ca709 2004-04-19 devnull /*
136 564ca709 2004-04-19 devnull * Frame declaration
137 564ca709 2004-04-19 devnull */
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;
141 564ca709 2004-04-19 devnull return;
142 564ca709 2004-04-19 devnull }
143 564ca709 2004-04-19 devnull }
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");
147 564ca709 2004-04-19 devnull
148 564ca709 2004-04-19 devnull f->type = type->lt;
149 564ca709 2004-04-19 devnull
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;
153 564ca709 2004-04-19 devnull }