12 Bprint(&bso, "%5.2f dodata\n", cputime());
14 for(p = datap; p != P; p = p->link) {
16 if(p->as == ADYNT || p->as == AINIT)
21 diag("initialize non-data (%d): %s\n%P",
23 v = p->from.offset + p->reg;
25 diag("initialize bounds (%ld): %s\n%P",
26 s->value, s->name, p);
31 * pull out string constants
33 for(p = datap; p != P; p = p->link) {
35 if(p->to.type == D_SCONST)
42 * assign 'small' variables to data segment
43 * (rational is that data segment is more easily
44 * addressed through offset on R30)
47 for(i=0; i<NHASH; i++)
48 for(s = hash[i]; s != S; s = s->link) {
50 if(t != SDATA && t != SBSS)
54 diag("%s: no size", s->name);
70 * assign 'data' variables to data segment
72 for(i=0; i<NHASH; i++)
73 for(s = hash[i]; s != S; s = s->link) {
92 * everything else to bss segment
94 for(i=0; i<NHASH; i++)
95 for(s = hash[i]; s != S; s = s->link) {
104 bsssize = orig-datsize;
108 * add literals to all large values.
110 * small data is allocated DATA
111 * large data is allocated DATA1
112 * large bss is allocated BSS
113 * the new literals are loaded between
114 * small data and large data.
117 for(p = firstp; p != P; p = p->link) {
120 if(p->from.type != D_CONST)
122 if(s = p->from.sym) {
124 if(t != SDATA && t != SDATA1 && t != SBSS)
127 if(t != D_EXTERN && t != D_STATIC)
129 v = s->value + p->from.offset;
130 if(v >= 0 && v <= 0xffff)
132 if(!strcmp(s->name, "setR30"))
134 /* size should be 19 max */
135 if(strlen(s->name) >= 10) /* has loader address */
136 snprint(literal, sizeof literal, "$%p.%lux", s, p->from.offset);
138 snprint(literal, sizeof literal, "$%s.%d.%lux", s->name, s->version, p->from.offset);
140 if(p->from.name != D_NONE)
142 if(p->from.reg != NREG)
145 if(v >= -0x7fff && v <= 0xffff)
149 /* size should be 9 max */
150 snprint(literal, sizeof literal, "$%lux", v);
152 s = lookup(literal, 0);
155 s->value = orig1+orig;
160 p1->from.type = D_OREG;
162 p1->from.name = D_EXTERN;
169 diag("literal not data: %s", s->name);
170 p->from.type = D_OREG;
172 p->from.name = D_EXTERN;
183 for(i=0; i<NHASH; i++)
184 for(s = hash[i]; s != S; s = s->link) {
197 xdefine("setR30", SDATA, 0L+BIG);
198 xdefine("bdata", SDATA, 0L);
199 xdefine("edata", SDATA, datsize);
200 xdefine("end", SBSS, datsize+bsssize);
201 xdefine("etext", STEXT, 0L);
210 for(i=0; i<NHASH; i++)
211 for(s = hash[i]; s != S; s = s->link)
213 diag("%s: not defined", s->name);
220 Bprint(&bso, "%5.2f follow\n", cputime());
227 firstp = firstp->link;
245 if((p->mark&NOSCHED) || q && (q->mark&NOSCHED)){
252 if(p && !(p->mark & FOLL))
259 if(!(p->mark & FOLL))
264 for(i=0,q=p; i<4; i++,q=q->link) {
265 if(q == lastp || (q->mark&NOSCHED))
272 if(a == AJMP || a == ARET || a == ARFE)
274 if(!q->cond || (q->cond->mark&FOLL))
276 if(a != ABEQ && a != ABNE)
283 print("cant happen 1\n");
293 if(a == AJMP || a == ARET || a == ARFE)
300 if(!(r->link->mark&FOLL))
302 if(!(r->cond->mark&FOLL))
303 print("cant happen 2\n");
311 q->to.type = D_BRANCH;
312 q->to.offset = p->pc;
319 if(a == AJMP || a == ARET || a == ARFE){
320 if(p->mark & NOSCHED){
327 if(a != AJAL && p->link != P) {
330 if(p == P || (p->mark&FOLL))
347 Bprint(&bso, "%5.2f patch\n", cputime());
350 s = lookup("exit", 0);
352 for(p = firstp; p != P; p = p->link) {
356 if((a == AJAL || a == AJMP || a == ARET) &&
357 p->to.type != D_BRANCH && p->to.sym != S) {
359 if(s->type != STEXT) {
360 diag("undefined: %s\n%P", s->name, p);
364 p->to.offset = s->value;
365 p->to.type = D_BRANCH;
367 if(p->to.type != D_BRANCH)
370 for(q = firstp; q != P;) {
372 if(c >= q->forwd->pc) {
381 diag("branch out of range %ld\n%P", c, p);
387 for(p = firstp; p != P; p = p->link) {
391 p->cond = brloop(p->cond);
393 if(p->to.type == D_BRANCH)
394 p->to.offset = p->cond->pc;
404 long dwn[LOG], cnt[LOG], i;
407 for(i=0; i<LOG; i++) {
410 cnt[i] = LOG * cnt[i-1];
415 for(p = firstp; p != P; p = p->link) {
439 if(p->as != AJMP || (p->mark&NOSCHED))
444 if(q == p || c > 5000)
460 while(*s == ' ' || *s == '\t')
462 if(*s == '-' || *s == '+') {
465 while(*s == ' ' || *s == '\t')
468 if(s[0]=='0' && s[1]){
469 if(s[1]=='x' || s[1]=='X'){
472 if(*s >= '0' && *s <= '9')
473 n = n*16 + *s++ - '0';
474 else if(*s >= 'a' && *s <= 'f')
475 n = n*16 + *s++ - 'a' + 10;
476 else if(*s >= 'A' && *s <= 'F')
477 n = n*16 + *s++ - 'A' + 10;
482 while(*s >= '0' && *s <= '7')
483 n = n*8 + *s++ - '0';
485 while(*s >= '0' && *s <= '9')
486 n = n*10 + *s++ - '0';