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 * assign 'small' variables to data segment
32 * (rational is that data segment is more easily
33 * addressed through offset on REGSB)
36 for(i=0; i<NHASH; i++)
37 for(s = hash[i]; s != S; s = s->link) {
39 if(t != SDATA && t != SBSS)
43 diag("%s: no size", s->name);
62 * assign 'data' variables to data segment
64 for(i=0; i<NHASH; i++)
65 for(s = hash[i]; s != S; s = s->link) {
87 * everything else to bss segment
89 for(i=0; i<NHASH; i++)
90 for(s = hash[i]; s != S; s = s->link) {
102 bsssize = orig-datsize;
106 * add literals to all large values.
108 * small data is allocated DATA
109 * large data is allocated DATA1
110 * large bss is allocated BSS
111 * the new literals are loaded between
112 * small data and large data.
115 for(p = firstp; p != P; p = p->link) {
118 if(p->from.type != D_CONST)
120 if(s = p->from.sym) {
122 if(t != SDATA && t != SDATA1 && t != SBSS)
125 if(t != D_EXTERN && t != D_STATIC)
127 v = s->value + p->from.offset;
128 if(v >= 0 && v <= 0xffff)
130 if(!strcmp(s->name, "setSB"))
132 /* size should be 19 max */
133 if(strlen(s->name) >= 10) /* has loader address */
134 snprint(literal, sizeof literal, "$%p.%lux", s, p->from.offset);
136 snprint(literal, sizeof literal, "$%s.%d.%lux", s->name, s->version, p->from.offset);
138 if(p->from.name != D_NONE)
140 if(p->from.reg != NREG)
143 if(v >= -0x7fff && v <= 0xffff)
147 /* size should be 9 max */
148 snprint(literal, sizeof literal, "$%lux", v);
150 s = lookup(literal, 0);
153 s->value = orig1+orig;
158 p1->from.type = D_OREG;
160 p1->from.name = D_EXTERN;
167 diag("literal not data: %s", s->name);
168 p->from.type = D_OREG;
170 p->from.name = D_EXTERN;
180 for(i=0; i<NHASH; i++)
181 for(s = hash[i]; s != S; s = s->link) {
194 xdefine("setSB", SDATA, 0L+BIG);
195 xdefine("bdata", SDATA, 0L);
196 xdefine("edata", SDATA, datsize);
197 xdefine("end", SBSS, datsize+bsssize);
198 xdefine("etext", STEXT, 0L);
207 for(i=0; i<NHASH; i++)
208 for(s = hash[i]; s != S; s = s->link)
210 diag("%s: not defined", s->name);
218 case ABA: return ABN;
219 case ABN: return ABA;
221 case ABE: return ABNE;
222 case ABNE: return ABE;
224 case ABLE: return ABG;
225 case ABG: return ABLE;
227 case ABL: return ABGE;
228 case ABGE: return ABL;
230 case ABLEU: return ABGU;
231 case ABGU: return ABLEU;
233 case ABCS: return ABCC;
234 case ABCC: return ABCS;
236 case ABNEG: return ABPOS;
237 case ABPOS: return ABNEG;
239 case ABVC: return ABVS;
240 case ABVS: return ABVC;
242 case AFBN: return AFBA;
243 case AFBA: return AFBN;
245 case AFBE: return AFBLG;
246 case AFBLG: return AFBE;
248 case AFBG: return AFBLE;
249 case AFBLE: return AFBG;
251 case AFBGE: return AFBL;
252 case AFBL: return AFBGE;
254 /* unordered fp compares have no inverse
255 that traps in the same way */
265 Bprint(&bso, "%5.2f follow\n", cputime());
273 firstp = firstp->link;
291 if((p->mark&NOSCHED) || q && (q->mark&NOSCHED)){
298 if(p && !(p->mark & FOLL))
305 if(!(p->mark & FOLL))
310 for(i=0,q=p; i<4; i++,q=q->link) {
311 if(q == lastp || (q->mark&NOSCHED))
319 if(a == AJMP || a == ARETURN || a == ARETT)
321 if(!q->cond || (q->cond->mark&FOLL))
331 print("cant happen 1\n");
341 if(a == AJMP || a == ARETURN || a == ARETT)
346 if(!(r->link->mark&FOLL))
348 if(!(r->cond->mark&FOLL))
349 print("cant happen 2\n");
358 q->to.type = D_BRANCH;
359 q->to.offset = p->pc;
366 if(a == AJMP || a == ARETURN || a == ARETT){
367 if(p->mark & NOSCHED){
374 if(a != AJMPL && p->link != P) {
377 if(p == P || (p->mark&FOLL))
394 Bprint(&bso, "%5.2f patch\n", cputime());
397 s = lookup("exit", 0);
399 for(p = firstp; p != P; p = p->link) {
403 if((a == AJMPL || a == ARETURN) && p->to.sym != S) {
405 if(s->type != STEXT) {
406 diag("undefined: %s\n%P", s->name, p);
410 p->to.offset = s->value;
411 p->to.type = D_BRANCH;
413 if(p->to.type != D_BRANCH)
416 for(q = firstp; q != P;) {
418 if(c >= q->forwd->pc) {
427 diag("branch out of range %ld\n%P", c, p);
433 for(p = firstp; p != P; p = p->link) {
437 p->cond = brloop(p->cond);
439 if(p->to.type == D_BRANCH)
440 p->to.offset = p->cond->pc;
450 long dwn[LOG], cnt[LOG], i;
453 for(i=0; i<LOG; i++) {
456 cnt[i] = LOG * cnt[i-1];
461 for(p = firstp; p != P; p = p->link) {
485 if(p->as != AJMP || (p->mark&NOSCHED))
490 if(q == p || c > 5000)
506 while(*s == ' ' || *s == '\t')
508 if(*s == '-' || *s == '+') {
511 while(*s == ' ' || *s == '\t')
514 if(s[0]=='0' && s[1]){
515 if(s[1]=='x' || s[1]=='X'){
518 if(*s >= '0' && *s <= '9')
519 n = n*16 + *s++ - '0';
520 else if(*s >= 'a' && *s <= 'f')
521 n = n*16 + *s++ - 'a' + 10;
522 else if(*s >= 'A' && *s <= 'F')
523 n = n*16 + *s++ - 'A' + 10;
528 while(*s >= '0' && *s <= '7')
529 n = n*8 + *s++ - '0';
531 while(*s >= '0' && *s <= '9')
532 n = n*10 + *s++ - '0';