static void writeblob(FILE *fd, Blob *b) { size_t i; if (!b) return; if (b->lbl) { if (b->iscomdat) emitonce(fd, b); if (b->isglobl) fprintf(fd, ".globl %s%s\n", Symprefix, b->lbl); fprintf(fd, "%s%s:\n", Symprefix, b->lbl); } switch (b->type) { case Btimin: encodemin(fd, b->ival); break; case Bti8: fprintf(fd, "\t.byte %zd\n", b->ival); break; case Bti16: fprintf(fd, "\t.short %zd\n", b->ival); break; case Bti32: fprintf(fd, "\t.long %zd\n", b->ival); break; case Bti64: fprintf(fd, "\t.quad %zd\n", b->ival); break; case Btbytes: writebytes(fd, b->bytes.buf, b->bytes.len); break; case Btpad: fprintf(fd, "\t.fill %zd,1,0\n", b->npad); break; case Btref: fprintf(fd, "\t.quad %s + %zd\n", b->ref.str, b->ref.off); break; case Btseq: for (i = 0; i < b->seq.nsub; i++) writeblob(fd, b->seq.sub[i]); break; } if (b->lbl && b->iscomdat) fprintf(fd, ".text\n"); }
static size_t writeblob(FILE *fd, Blob *b, size_t off, char *lbl) { size_t i, n; n = 0; if (!b) return 0; switch (b->type) { case Bti8: fprintf(fd, "DATA %s+%zd(SB)/1,$%zd\n", lbl, off+n, b->ival); n += 1; break; case Bti16: fprintf(fd, "DATA %s+%zd(SB)/2,$%zd\n", lbl, off+n, b->ival); n += 2; break; case Bti32: fprintf(fd, "DATA %s+%zd(SB)/4,$%zd\n", lbl, off+n, b->ival); n += 4; break; case Bti64: fprintf(fd, "DATA %s+%zd(SB)/8,$%lld\n", lbl, off+n, (vlong)b->ival); n += 8; break; case Btimin: n += encodemin(fd, b->ival, off+n, lbl); break; case Btref: if (b->ref.isextern || b->ref.str[0] == '.') fprintf(fd, "DATA %s+%zd(SB)/8,$%s+%zd(SB)\n", lbl, off+n, b->ref.str, b->ref.off); else fprintf(fd, "DATA %s+%zd(SB)/8,$%s<>+%zd(SB)\n", lbl, off+n, b->ref.str, b->ref.off); n += 8; break; case Btbytes: n += writebytes(fd, lbl, off+n, b->bytes.buf, b->bytes.len); break; case Btseq: for (i = 0; i < b->seq.nsub; i++) n += writeblob(fd, b->seq.sub[i], off+n, lbl); break; case Btpad: for (i = 0; i < b->npad; i++) fprintf(fd, "DATA %s+%zd(SB)/1,$0\n", lbl, off+n+i); n += b->npad; break; } return n; }