13 Bprint(&bso, "%5.2f dodata\n", cputime());
15 for(p = datap; p != P; p = p->link) {
17 if(p->as == ADYNT || p->as == AINIT)
22 diag("initialize non-data (%d): %s\n%P",
24 v = p->from.offset + p->reg;
26 diag("initialize bounds (%ld): %s\n%P",
27 s->value, s->name, p);
32 * assign 'small' variables to data segment
33 * (rational is that data segment is more easily
34 * addressed through offset on REGSB)
37 for(i=0; i<NHASH; i++)
38 for(s = hash[i]; s != S; s = s->link) {
40 if(t != SDATA && t != SBSS)
44 diag("%s: no size", s->name);
64 * assign 'data' variables to data segment
66 for(i=0; i<NHASH; i++)
67 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) {
100 bsssize = orig-datsize;
104 * add literals to all large values.
106 * small data is allocated DATA
107 * large data is allocated DATA1
108 * large bss is allocated BSS
109 * the new literals are loaded between
110 * small data and large data.
113 for(p = firstp; p != P; p = p->link) {
116 if(p->from.type != D_CONST)
118 if(s = p->from.sym) {
120 if(t != SDATA && t != SDATA1 && t != SBSS)
123 if(t != D_EXTERN && t != D_STATIC)
125 v = s->value + p->from.offset;
127 if(v >= 0 && v <= 0xffff)
129 if(!strcmp(s->name, "setSB"))
131 /* size should be 19 max */
132 if(strlen(s->name) >= 10) /* has loader address */
133 sprint(literal, "$%p.%llux", s, p->from.offset);
135 sprint(literal, "$%s.%d.%llux", s->name, s->version, p->from.offset);
137 if(p->from.name != D_NONE)
139 if(p->from.reg != NREG)
142 if(vv >= -0x8000LL && vv <= 0x7fff)
147 if (vv <= 0x7FFFFFFFLL && vv >= -0x80000000LL)
149 /* size should be 17 max */
150 sprint(literal, "$%llux", vv);
152 s = lookup(literal, 0);
155 orig = rnd(orig, size);
156 s->value = orig1+orig;
161 p1->from.type = D_OREG;
163 p1->from.name = D_EXTERN;
169 Bprint(&bso, "literal %P for %P\n", p1, p);
172 diag("literal not data: %s", s->name);
175 p->from.type = D_OREG;
177 p->from.name = D_EXTERN;
187 for(i=0; i<NHASH; i++)
188 for(s = hash[i]; s != S; s = s->link) {
201 if (debug['v'] || debug['z'])
202 Bprint(&bso, "datsize = %lux, bsssize = %lux\n", datsize, bsssize);
203 xdefine("setSB", SDATA, 0L+BIG);
204 xdefine("bdata", SDATA, 0L);
205 xdefine("edata", SDATA, datsize);
206 xdefine("end", SBSS, datsize+bsssize);
207 xdefine("etext", STEXT, 0L);
216 for(i=0; i<NHASH; i++)
217 for(s = hash[i]; s != S; s = s->link)
219 diag("%s: not defined", s->name);
226 Bprint(&bso, "%5.2f follow\n", cputime());
233 firstp = firstp->link;
254 if(!(p->mark & FOLL))
259 for(i=0,q=p; i<4; i++,q=q->link) {
267 if(a == AJMP || a == ARET || a == AREI)
269 if(!q->cond || (q->cond->mark&FOLL))
271 if(a != ABEQ && a != ABNE)
278 print("cant happen 1\n");
288 if(a == AJMP || a == ARET || a == AREI)
295 if(!(r->link->mark&FOLL))
297 if(!(r->cond->mark&FOLL))
298 print("cant happen 2\n");
306 q->to.type = D_BRANCH;
307 q->to.offset = p->pc;
314 if(a == AJMP || a == ARET || a == AREI)
317 if(a != AJSR && p->link != P) {
320 if(p == P || (p->mark&FOLL))
337 Bprint(&bso, "%5.2f patch\n", cputime());
340 s = lookup("exit", 0);
342 for(p = firstp; p != P; p = p->link) {
346 if((a == AJSR || a == AJMP || a == ARET) &&
347 p->to.type != D_BRANCH && p->to.sym != S) {
349 if(s->type != STEXT) {
350 diag("undefined: %s\n%P", s->name, p);
354 p->to.offset = s->value;
355 p->to.type = D_BRANCH;
357 if(p->to.type != D_BRANCH)
360 for(q = firstp; q != P;) {
362 if(c >= q->forwd->pc) {
371 diag("branch out of range %ld\n%P", c, p);
377 for(p = firstp; p != P; p = p->link) {
381 p->cond = brloop(p->cond);
383 if(p->to.type == D_BRANCH)
384 p->to.offset = p->cond->pc;
394 long dwn[LOG], cnt[LOG], i;
397 for(i=0; i<LOG; i++) {
400 cnt[i] = LOG * cnt[i-1];
405 for(p = firstp; p != P; p = p->link) {
450 while(*s == ' ' || *s == '\t')
452 if(*s == '-' || *s == '+') {
455 while(*s == ' ' || *s == '\t')
458 if(s[0]=='0' && s[1]){
459 if(s[1]=='x' || s[1]=='X'){
462 if(*s >= '0' && *s <= '9')
463 n = n*16 + *s++ - '0';
464 else if(*s >= 'a' && *s <= 'f')
465 n = n*16 + *s++ - 'a' + 10;
466 else if(*s >= 'A' && *s <= 'F')
467 n = n*16 + *s++ - 'A' + 10;
472 while(*s >= '0' && *s <= '7')
473 n = n*8 + *s++ - '0';
475 while(*s >= '0' && *s <= '9')
476 n = n*10 + *s++ - '0';