Exemplo n.º 1
0
Arquivo: gengas.c Projeto: 8l/mc
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");
}
Exemplo n.º 2
0
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;
}