Bflush(&bso);
sect = segtext.sect;
- seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
+ cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
codeblk(sect->vaddr, sect->len);
/* output read-only data in text segment (rodata, gosymtab and pclntab) */
for(sect = sect->next; sect != nil; sect = sect->next) {
- seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
+ cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
datblk(sect->vaddr, sect->len);
}
Bprint(&bso, "%5.2f datblk\n", cputime());
Bflush(&bso);
- seek(cout, segdata.fileoff, 0);
+ cseek(segdata.fileoff);
datblk(segdata.vaddr, segdata.filelen);
/* output read-only data in text segment */
sect = segtext.sect->next;
- seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
+ cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
datblk(sect->vaddr, sect->len);
if(iself) {
symo = rnd(symo, INITRND);
break;
}
- seek(cout, symo, 0);
+ cseek(symo);
if(iself) {
if(debug['v'])
Bprint(&bso, "%5.2f elfsym\n", cputime());
asmelfsym();
cflush();
- ewrite(cout, elfstrdat, elfstrsize);
+ cwrite(elfstrdat, elfstrsize);
// if(debug['v'])
// Bprint(&bso, "%5.2f dwarf\n", cputime());
if(debug['v'])
Bprint(&bso, "%5.2f header\n", cputime());
Bflush(&bso);
- seek(cout, 0L, 0);
+ cseek(0L);
switch(HEADTYPE) {
case Hnoheader: /* no header */
break;
pph->memsz = pph->filesz;
}
- seek(cout, 0, 0);
+ cseek(0);
a = 0;
a += elfwritehdr();
a += elfwritephdrs();
}
}
-void
-cput(int c)
-{
- cbp[0] = c;
- cbp++;
- cbc--;
- if(cbc <= 0)
- cflush();
-}
-
/*
void
cput(int32 c)
cflush();
}
-void
-cflush(void)
-{
- int n;
-
- /* no bug if cbc < 0 since obuf(cbuf) followed by ibuf in buf! */
- n = sizeof(buf.cbuf) - cbc;
- if(n)
- ewrite(cout, buf.cbuf, n);
- cbp = buf.cbuf;
- cbc = sizeof(buf.cbuf);
-}
-
void
nopstat(char *f, Count *c)
{
out[5] = o6;
return;
-#ifdef NOTDEF
+#ifdef NOTDEF
v = p->pc;
switch(o->size) {
default:
MINLC = 4,
};
-EXTERN union
-{
- struct
- {
- uchar obuf[MAXIO]; /* output buffer */
- uchar ibuf[MAXIO]; /* input buffer */
- } u;
- char dbuf[1];
-} buf;
-
-#define cbuf u.obuf
-#define xbuf u.ibuf
-
#ifndef COFFCVT
EXTERN int32 HEADR; /* length of header */
EXTERN int32 INITTEXT; /* text location */
EXTERN char* INITENTRY; /* entry point */
EXTERN int32 autosize;
-EXTERN Biobuf bso;
-EXTERN int cbc;
-EXTERN uchar* cbp;
-EXTERN int cout;
EXTERN Auto* curauto;
EXTERN Auto* curhist;
EXTERN Prog* curp;
char *p;
Binit(&bso, 1, OWRITE);
- cout = -1;
listinit();
nerrors = 0;
outfile = "5.out";
Bflush(&bso);
sect = segtext.sect;
- seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
+ cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
codeblk(sect->vaddr, sect->len);
/* output read-only data in text segment (rodata, gosymtab and pclntab) */
for(sect = sect->next; sect != nil; sect = sect->next) {
- seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
+ cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
datblk(sect->vaddr, sect->len);
}
Bprint(&bso, "%5.2f datblk\n", cputime());
Bflush(&bso);
- seek(cout, segdata.fileoff, 0);
+ cseek(segdata.fileoff);
datblk(segdata.vaddr, segdata.filelen);
machlink = 0;
symo = rnd(symo, PEFILEALIGN);
break;
}
- seek(cout, symo, 0);
+ cseek(symo);
switch(HEADTYPE) {
default:
if(iself) {
- seek(cout, symo, 0);
+ cseek(symo);
asmelfsym();
cflush();
- ewrite(cout, elfstrdat, elfstrsize);
+ cwrite(elfstrdat, elfstrsize);
if(debug['v'])
Bprint(&bso, "%5.2f dwarf\n", cputime());
if(debug['v'])
Bprint(&bso, "%5.2f headr\n", cputime());
Bflush(&bso);
- seek(cout, 0L, 0);
+ cseek(0L);
switch(HEADTYPE) {
default:
case Hplan9x32: /* plan9 */
pph->filesz = eh->phnum * eh->phentsize;
pph->memsz = pph->filesz;
- seek(cout, 0, 0);
+ cseek(0);
a = 0;
a += elfwritehdr();
a += elfwritephdrs();
cflush();
}
-void
-cflush(void)
-{
- int n;
-
- n = sizeof(buf.cbuf) - cbc;
- if(n)
- ewrite(cout, buf.cbuf, n);
- cbp = buf.cbuf;
- cbc = sizeof(buf.cbuf);
-}
-
-/* Current position in file */
-vlong
-cpos(void)
-{
- return seek(cout, 0, 1) + sizeof(buf.cbuf) - cbc;
-}
-
vlong
rnd(vlong v, vlong r)
{
#define P ((Prog*)0)
#define S ((Sym*)0)
#define TNAME (cursym?cursym->name:noname)
-#define cput(c)\
- { *cbp++ = c;\
- if(--cbc <= 0)\
- cflush(); }
typedef struct Adr Adr;
typedef struct Prog Prog;
Maxand = 10, /* in -a output width of the byte codes */
};
-EXTERN union
-{
- struct
- {
- char obuf[MAXIO]; /* output buffer */
- uchar ibuf[MAXIO]; /* input buffer */
- } u;
- char dbuf[1];
-} buf;
-
-#define cbuf u.obuf
-#define xbuf u.ibuf
-
#pragma varargck type "A" uint
#pragma varargck type "D" Adr*
#pragma varargck type "I" uchar*
EXTERN vlong INITTEXT;
EXTERN vlong INITDAT;
EXTERN char* INITENTRY; /* entry point */
-EXTERN Biobuf bso;
-EXTERN int cbc;
-EXTERN char* cbp;
EXTERN char* pcstr;
EXTERN Auto* curauto;
EXTERN Auto* curhist;
Prog* brchain(Prog*);
Prog* brloop(Prog*);
void buildop(void);
-void cflush(void);
Prog* copyp(Prog*);
-vlong cpos(void);
double cputime(void);
void datblk(int32, int32);
void deadcode(void);
int c;
Binit(&bso, 1, OWRITE);
- cout = -1;
listinit();
memset(debug, 0, sizeof(debug));
nerrors = 0;
Bflush(&bso);
sect = segtext.sect;
- seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
+ cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
codeblk(sect->vaddr, sect->len);
/* output read-only data in text segment (rodata, gosymtab and pclntab) */
for(sect = sect->next; sect != nil; sect = sect->next) {
- seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
+ cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
datblk(sect->vaddr, sect->len);
}
Bprint(&bso, "%5.2f datblk\n", cputime());
Bflush(&bso);
- seek(cout, segdata.fileoff, 0);
+ cseek(segdata.fileoff);
datblk(segdata.vaddr, segdata.filelen);
machlink = 0;
symo = rnd(symo, PEFILEALIGN);
break;
}
- seek(cout, symo, 0);
+ cseek(symo);
switch(HEADTYPE) {
default:
if(iself) {
Bprint(&bso, "%5.2f elfsym\n", cputime());
asmelfsym();
cflush();
- ewrite(cout, elfstrdat, elfstrsize);
+ cwrite(elfstrdat, elfstrsize);
if(debug['v'])
Bprint(&bso, "%5.2f dwarf\n", cputime());
if(debug['v'])
Bprint(&bso, "%5.2f headr\n", cputime());
Bflush(&bso);
- seek(cout, 0L, 0);
+ cseek(0L);
switch(HEADTYPE) {
default:
if(iself)
pph->memsz = pph->filesz;
}
- seek(cout, 0, 0);
+ cseek(0);
a = 0;
a += elfwritehdr();
a += elfwritephdrs();
cput(name[i]);
}
-void
-cflush(void)
-{
- int n;
-
- n = sizeof(buf.cbuf) - cbc;
- if(n)
- ewrite(cout, buf.cbuf, n);
- cbp = buf.cbuf;
- cbc = sizeof(buf.cbuf);
-}
-
-/* Current position in file */
-vlong
-cpos(void)
-{
- return seek(cout, 0, 1) + sizeof(buf.cbuf) - cbc;
-}
-
int32
rnd(int32 v, int32 r)
{
Pb = 0xfe, /* byte operands */
};
-EXTERN union
-{
- struct
- {
- char obuf[MAXIO]; /* output buffer */
- uchar ibuf[MAXIO]; /* input buffer */
- } u;
- char dbuf[1];
-} buf;
-
-#define cbuf u.obuf
-#define xbuf u.ibuf
-
#pragma varargck type "A" int
#pragma varargck type "D" Adr*
#pragma varargck type "I" uchar*
EXTERN int32 INITTEXT;
EXTERN int32 INITDAT;
EXTERN char* INITENTRY; /* entry point */
-EXTERN Biobuf bso;
EXTERN int32 casepc;
-EXTERN int cbc;
-EXTERN char* cbp;
EXTERN char* pcstr;
EXTERN Auto* curauto;
EXTERN Auto* curhist;
int c;
Binit(&bso, 1, OWRITE);
- cout = -1;
listinit();
memset(debug, 0, sizeof(debug));
nerrors = 0;
uchar *q;
if(debug['a'])
- Bprint(&bso, "codeblk [%#x,%#x) at offset %#llx\n", addr, addr+size, seek(cout, 0, 1));
+ Bprint(&bso, "codeblk [%#x,%#x) at offset %#llx\n", addr, addr+size, cpos());
blk(textp, addr, size);
uchar *p, *ep;
if(debug['a'])
- Bprint(&bso, "datblk [%#x,%#x) at offset %#llx\n", addr, addr+size, seek(cout, 0, 1));
+ Bprint(&bso, "datblk [%#x,%#x) at offset %#llx\n", addr, addr+size, cpos());
blk(datap, addr, size);
cput(0); // start extended opcode
uleb128put(1);
cput(DW_LNE_end_sequence);
- cflush();
here = cpos();
- seek(cout, unitstart, 0);
+ cseek(unitstart);
LPUT(here - unitstart - sizeof(int32)); // unit_length
WPUT(3); // dwarf version
LPUT(header_length); // header length starting here
- cflush();
- seek(cout, here, 0);
+ cseek(here);
}
}
pad = rnd(fdesize, PtrSize) - fdesize;
strnput("", pad);
fdesize += pad;
- cflush();
// Emit the FDE header for real, Section 6.4.1.
- seek(cout, fdeo, 0);
+ cseek(fdeo);
LPUT(fdesize);
LPUT(0);
addrput(p->pc);
addrput(s->size);
-
- cflush();
- seek(cout, fdeo + 4 + fdesize, 0);
+ cseek(fdeo + 4 + fdesize);
}
cflush();
putdie(compunit);
- cflush();
here = cpos();
- seek(cout, unitstart, 0);
+ cseek(unitstart);
LPUT(here - unitstart - 4); // exclude the length field.
- cflush();
- seek(cout, here, 0);
+ cseek(here);
}
-
+ cflush();
}
/*
}
LPUT(0);
- cflush();
here = cpos();
- seek(cout, sectionstart, 0);
+ cseek(sectionstart);
LPUT(here - sectionstart - 4); // exclude the length field.
- cflush();
- seek(cout, here, 0);
+ cseek(here);
}
if (fwdcount > 0) {
if (debug['v'])
Bprint(&bso, "%5.2f dwarf pass 2.\n", cputime());
- seek(cout, infoo, 0);
+ cseek(infoo);
writeinfo();
if (fwdcount > 0) {
diag("dwarf: unresolved references after first dwarf info pass");
return 0;
n = strlen(interp)+1;
- seek(cout, ELFRESERVE-n, 0);
- ewrite(cout, interp, n);
+ cseek(ELFRESERVE-n);
+ cwrite(interp, n);
return n;
}
char pkgname[] = "__.PKGDEF";
char* libdir[16];
int nlibdir = 0;
-int cout = -1;
+static int cout = -1;
char* goroot;
char* goarch;
return sect;
}
-void
-ewrite(int fd, void *buf, int n)
-{
- if(write(fd, buf, n) < 0) {
- diag("write error: %r");
- errorexit();
- }
-}
-
void
pclntab(void)
{
return 0;
}
+
+vlong coutpos;
+
+void
+cflush(void)
+{
+ int n;
+
+ if(cbpmax < cbp)
+ cbpmax = cbp;
+ n = cbpmax - buf.cbuf;
+ if(n) {
+ if(write(cout, buf.cbuf, n) != n) {
+ diag("write error: %r");
+ errorexit();
+ }
+ coutpos += n;
+ }
+ cbp = buf.cbuf;
+ cbc = sizeof(buf.cbuf);
+ cbpmax = cbp;
+}
+
+vlong
+cpos(void)
+{
+ return coutpos + cbp - buf.cbuf;
+}
+
+void
+cseek(vlong p)
+{
+ vlong start;
+ int delta;
+
+ if(cbpmax < cbp)
+ cbpmax = cbp;
+ start = coutpos;
+ if(start <= p && p <= start+(cbpmax - buf.cbuf)) {
+//print("cseek %lld in [%lld,%lld] (%lld)\n", p, start, start+sizeof(buf.cbuf), cpos());
+ delta = p - (start + cbp - buf.cbuf);
+ cbp += delta;
+ cbc -= delta;
+//print("now at %lld\n", cpos());
+ return;
+ }
+
+ cflush();
+ seek(cout, p, 0);
+ coutpos = p;
+}
+
+void
+cwrite(void *buf, int n)
+{
+ cflush();
+ if(write(cout, buf, n) != n) {
+ diag("write error: %r");
+ errorexit();
+ }
+ coutpos += n;
+}
+
+void
+cseekend(void)
+{
+ seek(cout, 0, 2);
+}
extern char symname[];
extern char *libdir[];
extern int nlibdir;
-extern int cout;
EXTERN char* INITENTRY;
EXTERN char* thestring;
void mkfwd(void);
char* expandpkg(char*, char*);
void deadcode(void);
-void ewrite(int, void*, int);
Reloc* addrel(Sym*);
void codeblk(int32, int32);
void datblk(int32, int32);
int Yconv(Fmt*);
#pragma varargck type "Y" Sym*
+
+// buffered output
+
+EXTERN Biobuf bso;
+
+EXTERN struct
+{
+ char cbuf[MAXIO]; /* output buffer */
+} buf;
+
+EXTERN int cbc;
+EXTERN char* cbp;
+EXTERN char* cbpmax;
+
+#define cput(c)\
+ { *cbp++ = c;\
+ if(--cbc <= 0)\
+ cflush(); }
+
+void cflush(void);
+vlong cpos(void);
+void cseek(vlong);
+void cseekend(void);
+void cwrite(void*, int);
if(size > 0) {
linkoff = rnd(HEADR+segtext.len, INITRND) + rnd(segdata.filelen, INITRND);
- seek(cout, linkoff, 0);
+ cseek(linkoff);
- ewrite(cout, s1->p, s1->size);
- ewrite(cout, s2->p, s2->size);
- ewrite(cout, s3->p, s3->size);
- ewrite(cout, s4->p, s4->size);
+ cwrite(s1->p, s1->size);
+ cwrite(s2->p, s2->size);
+ cwrite(s3->p, s3->size);
+ cwrite(s4->p, s4->size);
}
return rnd(size, INITRND);
static void
pewrite(void)
{
- seek(cout, 0, 0);
- ewrite(cout, dosstub, sizeof dosstub);
+ cseek(0);
+ cwrite(dosstub, sizeof dosstub);
strnput("PE", 4);
cflush();
// TODO: This code should not assume that the
// memory representation is little-endian or
// that the structs are packed identically to
// their file representation.
- ewrite(cout, &fh, sizeof fh);
+ cwrite(&fh, sizeof fh);
if(pe64)
- ewrite(cout, &oh64, sizeof oh64);
+ cwrite(&oh64, sizeof oh64);
else
- ewrite(cout, &oh, sizeof oh);
- ewrite(cout, sh, nsect * sizeof sh[0]);
+ cwrite(&oh, sizeof oh);
+ cwrite(sh, nsect * sizeof sh[0]);
}
static void
n = 0;
for(d = dr; d != nil; d = d->next)
n++;
- seek(cout, fileoff + sizeof(IMAGE_IMPORT_DESCRIPTOR) * (n + 1), 0);
+ cseek(fileoff + sizeof(IMAGE_IMPORT_DESCRIPTOR) * (n + 1));
// write dll names
for(d = dr; d != nil; d = d->next) {
// write FirstThunks (allocated in .data section)
ftbase = dynamic->value - datsect->VirtualAddress - PEBASE;
- seek(cout, datsect->PointerToRawData + ftbase, 0);
+ cseek(datsect->PointerToRawData + ftbase);
for(d = dr; d != nil; d = d->next) {
for(m = d->ms; m != nil; m = m->next)
put(m->off);
cflush();
// finally write import descriptor table
- seek(cout, fileoff, 0);
+ cseek(fileoff);
for(d = dr; d != nil; d = d->next) {
lputl(isect->VirtualAddress + oftbase + d->thunkoff);
lputl(0);
dd[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = dynamic->value - PEBASE;
dd[IMAGE_DIRECTORY_ENTRY_IAT].Size = dynamic->size;
- seek(cout, 0, 2);
+ cseekend();
}
static int
dd[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = va;
dd[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = sect->VirtualSize;
- seek(cout, fileoff, 0);
+ cseek(fileoff);
va_name = va + sizeof e + nexport*4;
va_addr = va + sizeof e;
va_na = va + sizeof e + nexport*8;
strnput("", sect->SizeOfRawData - size);
cflush();
- seek(cout, 0, 2);
+ cseekend();
}
void
p[2] = val>>16;
p[3] = val>>24;
}
- ewrite(cout, rsrcsym->p, rsrcsym->size);
+ cwrite(rsrcsym->p, rsrcsym->size);
strnput("", h->SizeOfRawData - rsrcsym->size);
cflush();