5 #define PADDR(a) ((a) & ~0xfffffffff0000000ull)
14 if(*a >= '0' && *a <= '9')
25 return s->value+INITDAT;
27 diag("entry not text: %s", s->name);
37 n = sizeof(buf.cbuf) - cbc;
39 write(cout, buf.cbuf, n);
41 cbc = sizeof(buf.cbuf);
53 Bprint(&bso, "%5.2f asm\n", cputime());
56 seek(cout, OFFSET, 0);
58 for(p = firstp; p != P; p = p->link) {
61 autosize = p->to.offset + PCSZ;
63 if(p->as == ADWORD && (pc & 7) != 0) {
68 diag("phase error %llux sb %llux",
75 o = oplook(p); /* could probably avoid this call */
85 /* output strings in text segment */
86 etext = INITTEXT + textsize;
87 for(t = pc; t < etext; t += sizeof(buf)-100) {
88 if(etext-t > sizeof(buf)-100)
89 datblk(t, sizeof(buf)-100, 1);
91 datblk(t, etext-t, 1);
99 OFFSET = HEADR+textsize;
100 seek(cout, OFFSET, 0);
102 case 6: /* no header, padded segments */
103 OFFSET = rnd(HEADR+textsize, INITRND);
104 seek(cout, OFFSET, 0);
110 write(cout, buf, INITDAT-textsize);
113 for(t = 0; t < datsize; t += sizeof(buf)-100) {
114 if(datsize-t > sizeof(buf)-100)
115 datblk(t, sizeof(buf)-100, 0);
117 datblk(t, datsize-t, 0);
124 Bprint(&bso, "%5.2f sym\n", cputime());
131 OFFSET = HEADR+textsize+datsize;
132 seek(cout, OFFSET, 0);
134 case 6: /* no header, padded segments */
135 OFFSET += rnd(datsize, INITRND);
136 seek(cout, OFFSET, 0);
144 Bprint(&bso, "%5.2f pc\n", cputime());
153 seek(cout, HEADR+textsize+datsize, 0);
159 Bprint(&bso, "%5.2f header\n", cputime());
162 seek(cout, OFFSET, 0);
164 case 0: /* no header */
165 case 6: /* no header, padded segments */
169 magic |= 0x00008000; /* fat header */
171 magic |= 0x80000000; /* dlm */
172 lput(magic); /* magic */
173 lput(textsize); /* sizes */
176 lput(symsize); /* nsyms */
178 lput(PADDR(vl)); /* va of entry */
181 llput(vl); /* va of entry */
271 s = lookup("etext", 0);
273 putsymb(s->name, 'T', s->value, s->version);
275 for(h=0; h<NHASH; h++)
276 for(s=hash[h]; s!=S; s=s->link)
279 putsymb(s->name, 'D', s->value, s->version);
283 putsymb(s->name, 'D', s->value+INITDAT, s->version);
287 putsymb(s->name, 'B', s->value+INITDAT, s->version);
291 putsymb(s->name, 'T', s->value, s->version);
295 putsymb(s->name, 'f', s->value, s->version);
299 for(p=textp; p!=P; p=p->cond) {
301 if(s->type != STEXT && s->type != SLEAF)
304 /* filenames first */
305 for(a=p->to.autom; a; a=a->link)
306 if(a->type == D_FILE)
307 putsymb(a->asym->name, 'z', a->aoffset, 0);
309 if(a->type == D_FILE1)
310 putsymb(a->asym->name, 'Z', a->aoffset, 0);
313 putsymb(s->name, 'T', s->value, s->version);
315 putsymb(s->name, 'L', s->value, s->version);
317 /* frame, auto and param after */
318 putsymb(".frame", 'm', p->to.offset+PCSZ, 0);
319 for(a=p->to.autom; a; a=a->link)
320 if(a->type == D_AUTO)
321 putsymb(a->asym->name, 'a', -a->aoffset, 0);
323 if(a->type == D_PARAM)
324 putsymb(a->asym->name, 'p', a->aoffset, 0);
326 if(debug['v'] || debug['n'])
327 Bprint(&bso, "symsize = %lud\n", symsize);
332 putsymb(char *s, int t, vlong v, int ver)
350 cput(t+0x80); /* 0x80 is variable length */
352 if(t == 'Z' || t == 'z') {
354 for(i=1; s[i] != 0 || s[i+1] != 0; i += 2) {
367 symsize += l + 1 + i + 1;
370 if(t == 'z' || t == 'Z') {
371 Bprint(&bso, "%c %.8llux ", t, v);
372 for(i=1; s[i] != 0 || s[i+1] != 0; i+=2) {
373 f = ((s[i]&0xff) << 8) | (s[i+1]&0xff);
374 Bprint(&bso, "/%x", f);
380 Bprint(&bso, "%c %.8llux %s<%d>\n", t, v, s, ver);
382 Bprint(&bso, "%c %.8llux %s\n", t, v, s);
396 for(p = firstp; p != P; p = p->link) {
397 if(p->line == oldlc || p->as == ATEXT || p->as == ANOP) {
401 Bprint(&bso, "%6llux %P\n",
406 Bprint(&bso, "\t\t%6ld", lcsize);
407 v = (p->pc - oldpc) / MINLC;
412 cput(s+128); /* 129-255 +pc */
414 Bprint(&bso, " pc+%ld*%d(%ld)", s, MINLC, s+128);
420 oldpc = p->pc + MINLC;
421 if(s > 64 || s < -64) {
422 cput(0); /* 0 vv +lc */
429 Bprint(&bso, " lc+%ld(%d,%ld)\n",
432 Bprint(&bso, " lc%ld(%d,%ld)\n",
434 Bprint(&bso, "%6llux %P\n",
441 cput(0+s); /* 1-64 +lc */
443 Bprint(&bso, " lc+%ld(%ld)\n", s, 0+s);
444 Bprint(&bso, "%6llux %P\n",
448 cput(64-s); /* 65-128 -lc */
450 Bprint(&bso, " lc%ld(%ld)\n", s, 64-s);
451 Bprint(&bso, "%6llux %P\n",
462 if(debug['v'] || debug['V'])
463 Bprint(&bso, "lcsize = %ld\n", lcsize);
468 datblk(long s, long n, int str)
477 memset(buf.dbuf, 0, n+100);
478 for(p = datap; p != P; p = p->link) {
479 if(str != (p->from.sym->type == SSTRING))
482 a = p->from.sym->value + p->from.offset;
496 if(p->as != AINIT && p->as != ADYNT) {
497 for(j=l+(c-i)-1; j>=l; j--)
500 diag("multiple initialization");
506 diag("unknown mode in initialization%P", p);
513 fl = ieeedtof(p->to.ieee);
516 buf.dbuf[l] = cast[fnuxi4[i]];
521 cast = (char*)p->to.ieee;
523 buf.dbuf[l] = cast[fnuxi8[i]];
532 buf.dbuf[l] = p->to.sval[i];
547 d += p->to.sym->value;
551 d += p->to.sym->value + INITDAT;
554 dynreloc(v, a+INITDAT, 1);
559 diag("bad nuxi %d %d%P", c, i, curp);
563 buf.dbuf[l] = cast[inuxi1[i]];
569 buf.dbuf[l] = cast[inuxi2[i]];
575 buf.dbuf[l] = cast[inuxi4[i]];
581 buf.dbuf[l] = cast[inuxi8[i]];
589 write(cout, buf.dbuf, n);
592 static Ieee chipfloats[] = {
593 {0x00000000, 0x00000000}, /* 0 */
594 {0x00000000, 0x3ff00000}, /* 1 */
595 {0x00000000, 0x40000000}, /* 2 */
596 {0x00000000, 0x40080000}, /* 3 */
597 {0x00000000, 0x40100000}, /* 4 */
598 {0x00000000, 0x40140000}, /* 5 */
599 {0x00000000, 0x3fe00000}, /* .5 */
600 {0x00000000, 0x40240000}, /* 10 */
609 for(n = sizeof(chipfloats)/sizeof(chipfloats[0]); --n >= 0;){
611 if(p->l == e->l && p->h == e->h && 0)
612 return n; /* TO DO: return imm8 encoding */