Skip to content

Commit caa5647

Browse files
committed
ld: allow seek within write buffer
Reduces number of write+seek's from 88516 to 2080 when linking godoc with 6l. Thanks to Alex Brainman for pointing out the many small writes. R=golang-dev, r, alex.brainman, robert.hencke CC=golang-dev https://golang.org/cl/4743043
1 parent 870fdd7 commit caa5647

File tree

16 files changed

+149
-196
lines changed

16 files changed

+149
-196
lines changed

src/cmd/5l/asm.c

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -307,25 +307,25 @@ asmb(void)
307307
Bflush(&bso);
308308

309309
sect = segtext.sect;
310-
seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
310+
cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
311311
codeblk(sect->vaddr, sect->len);
312312

313313
/* output read-only data in text segment (rodata, gosymtab and pclntab) */
314314
for(sect = sect->next; sect != nil; sect = sect->next) {
315-
seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
315+
cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
316316
datblk(sect->vaddr, sect->len);
317317
}
318318

319319
if(debug['v'])
320320
Bprint(&bso, "%5.2f datblk\n", cputime());
321321
Bflush(&bso);
322322

323-
seek(cout, segdata.fileoff, 0);
323+
cseek(segdata.fileoff);
324324
datblk(segdata.vaddr, segdata.filelen);
325325

326326
/* output read-only data in text segment */
327327
sect = segtext.sect->next;
328-
seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
328+
cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
329329
datblk(sect->vaddr, sect->len);
330330

331331
if(iself) {
@@ -369,13 +369,13 @@ asmb(void)
369369
symo = rnd(symo, INITRND);
370370
break;
371371
}
372-
seek(cout, symo, 0);
372+
cseek(symo);
373373
if(iself) {
374374
if(debug['v'])
375375
Bprint(&bso, "%5.2f elfsym\n", cputime());
376376
asmelfsym();
377377
cflush();
378-
ewrite(cout, elfstrdat, elfstrsize);
378+
cwrite(elfstrdat, elfstrsize);
379379

380380
// if(debug['v'])
381381
// Bprint(&bso, "%5.2f dwarf\n", cputime());
@@ -389,7 +389,7 @@ asmb(void)
389389
if(debug['v'])
390390
Bprint(&bso, "%5.2f header\n", cputime());
391391
Bflush(&bso);
392-
seek(cout, 0L, 0);
392+
cseek(0L);
393393
switch(HEADTYPE) {
394394
case Hnoheader: /* no header */
395395
break;
@@ -628,7 +628,7 @@ asmb(void)
628628
pph->memsz = pph->filesz;
629629
}
630630

631-
seek(cout, 0, 0);
631+
cseek(0);
632632
a = 0;
633633
a += elfwritehdr();
634634
a += elfwritephdrs();
@@ -649,16 +649,6 @@ asmb(void)
649649
}
650650
}
651651

652-
void
653-
cput(int c)
654-
{
655-
cbp[0] = c;
656-
cbp++;
657-
cbc--;
658-
if(cbc <= 0)
659-
cflush();
660-
}
661-
662652
/*
663653
void
664654
cput(int32 c)
@@ -708,19 +698,6 @@ lput(int32 l)
708698
cflush();
709699
}
710700

711-
void
712-
cflush(void)
713-
{
714-
int n;
715-
716-
/* no bug if cbc < 0 since obuf(cbuf) followed by ibuf in buf! */
717-
n = sizeof(buf.cbuf) - cbc;
718-
if(n)
719-
ewrite(cout, buf.cbuf, n);
720-
cbp = buf.cbuf;
721-
cbc = sizeof(buf.cbuf);
722-
}
723-
724701
void
725702
nopstat(char *f, Count *c)
726703
{
@@ -1442,7 +1419,7 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
14421419
out[5] = o6;
14431420
return;
14441421

1445-
#ifdef NOTDEF
1422+
#ifdef NOTDEF
14461423
v = p->pc;
14471424
switch(o->size) {
14481425
default:

src/cmd/5l/l.h

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -264,19 +264,6 @@ enum
264264
MINLC = 4,
265265
};
266266

267-
EXTERN union
268-
{
269-
struct
270-
{
271-
uchar obuf[MAXIO]; /* output buffer */
272-
uchar ibuf[MAXIO]; /* input buffer */
273-
} u;
274-
char dbuf[1];
275-
} buf;
276-
277-
#define cbuf u.obuf
278-
#define xbuf u.ibuf
279-
280267
#ifndef COFFCVT
281268

282269
EXTERN int32 HEADR; /* length of header */
@@ -286,10 +273,6 @@ EXTERN int32 INITRND; /* data round above text location */
286273
EXTERN int32 INITTEXT; /* text location */
287274
EXTERN char* INITENTRY; /* entry point */
288275
EXTERN int32 autosize;
289-
EXTERN Biobuf bso;
290-
EXTERN int cbc;
291-
EXTERN uchar* cbp;
292-
EXTERN int cout;
293276
EXTERN Auto* curauto;
294277
EXTERN Auto* curhist;
295278
EXTERN Prog* curp;

src/cmd/5l/obj.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ main(int argc, char *argv[])
8484
char *p;
8585

8686
Binit(&bso, 1, OWRITE);
87-
cout = -1;
8887
listinit();
8988
nerrors = 0;
9089
outfile = "5.out";

src/cmd/6l/asm.c

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -712,20 +712,20 @@ asmb(void)
712712
Bflush(&bso);
713713

714714
sect = segtext.sect;
715-
seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
715+
cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
716716
codeblk(sect->vaddr, sect->len);
717717

718718
/* output read-only data in text segment (rodata, gosymtab and pclntab) */
719719
for(sect = sect->next; sect != nil; sect = sect->next) {
720-
seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
720+
cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
721721
datblk(sect->vaddr, sect->len);
722722
}
723723

724724
if(debug['v'])
725725
Bprint(&bso, "%5.2f datblk\n", cputime());
726726
Bflush(&bso);
727727

728-
seek(cout, segdata.fileoff, 0);
728+
cseek(segdata.fileoff);
729729
datblk(segdata.vaddr, segdata.filelen);
730730

731731
machlink = 0;
@@ -785,14 +785,14 @@ asmb(void)
785785
symo = rnd(symo, PEFILEALIGN);
786786
break;
787787
}
788-
seek(cout, symo, 0);
788+
cseek(symo);
789789
switch(HEADTYPE) {
790790
default:
791791
if(iself) {
792-
seek(cout, symo, 0);
792+
cseek(symo);
793793
asmelfsym();
794794
cflush();
795-
ewrite(cout, elfstrdat, elfstrsize);
795+
cwrite(elfstrdat, elfstrsize);
796796

797797
if(debug['v'])
798798
Bprint(&bso, "%5.2f dwarf\n", cputime());
@@ -813,7 +813,7 @@ asmb(void)
813813
if(debug['v'])
814814
Bprint(&bso, "%5.2f headr\n", cputime());
815815
Bflush(&bso);
816-
seek(cout, 0L, 0);
816+
cseek(0L);
817817
switch(HEADTYPE) {
818818
default:
819819
case Hplan9x32: /* plan9 */
@@ -1063,7 +1063,7 @@ asmb(void)
10631063
pph->filesz = eh->phnum * eh->phentsize;
10641064
pph->memsz = pph->filesz;
10651065

1066-
seek(cout, 0, 0);
1066+
cseek(0);
10671067
a = 0;
10681068
a += elfwritehdr();
10691069
a += elfwritephdrs();
@@ -1079,25 +1079,6 @@ asmb(void)
10791079
cflush();
10801080
}
10811081

1082-
void
1083-
cflush(void)
1084-
{
1085-
int n;
1086-
1087-
n = sizeof(buf.cbuf) - cbc;
1088-
if(n)
1089-
ewrite(cout, buf.cbuf, n);
1090-
cbp = buf.cbuf;
1091-
cbc = sizeof(buf.cbuf);
1092-
}
1093-
1094-
/* Current position in file */
1095-
vlong
1096-
cpos(void)
1097-
{
1098-
return seek(cout, 0, 1) + sizeof(buf.cbuf) - cbc;
1099-
}
1100-
11011082
vlong
11021083
rnd(vlong v, vlong r)
11031084
{

src/cmd/6l/l.h

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,6 @@ enum
4646
#define P ((Prog*)0)
4747
#define S ((Sym*)0)
4848
#define TNAME (cursym?cursym->name:noname)
49-
#define cput(c)\
50-
{ *cbp++ = c;\
51-
if(--cbc <= 0)\
52-
cflush(); }
5349

5450
typedef struct Adr Adr;
5551
typedef struct Prog Prog;
@@ -286,19 +282,6 @@ enum
286282
Maxand = 10, /* in -a output width of the byte codes */
287283
};
288284

289-
EXTERN union
290-
{
291-
struct
292-
{
293-
char obuf[MAXIO]; /* output buffer */
294-
uchar ibuf[MAXIO]; /* input buffer */
295-
} u;
296-
char dbuf[1];
297-
} buf;
298-
299-
#define cbuf u.obuf
300-
#define xbuf u.ibuf
301-
302285
#pragma varargck type "A" uint
303286
#pragma varargck type "D" Adr*
304287
#pragma varargck type "I" uchar*
@@ -313,9 +296,6 @@ EXTERN int32 INITRND;
313296
EXTERN vlong INITTEXT;
314297
EXTERN vlong INITDAT;
315298
EXTERN char* INITENTRY; /* entry point */
316-
EXTERN Biobuf bso;
317-
EXTERN int cbc;
318-
EXTERN char* cbp;
319299
EXTERN char* pcstr;
320300
EXTERN Auto* curauto;
321301
EXTERN Auto* curhist;
@@ -376,9 +356,7 @@ vlong atolwhex(char*);
376356
Prog* brchain(Prog*);
377357
Prog* brloop(Prog*);
378358
void buildop(void);
379-
void cflush(void);
380359
Prog* copyp(Prog*);
381-
vlong cpos(void);
382360
double cputime(void);
383361
void datblk(int32, int32);
384362
void deadcode(void);

src/cmd/6l/obj.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ main(int argc, char *argv[])
8080
int c;
8181

8282
Binit(&bso, 1, OWRITE);
83-
cout = -1;
8483
listinit();
8584
memset(debug, 0, sizeof(debug));
8685
nerrors = 0;

src/cmd/8l/asm.c

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -673,20 +673,20 @@ asmb(void)
673673
Bflush(&bso);
674674

675675
sect = segtext.sect;
676-
seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
676+
cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
677677
codeblk(sect->vaddr, sect->len);
678678

679679
/* output read-only data in text segment (rodata, gosymtab and pclntab) */
680680
for(sect = sect->next; sect != nil; sect = sect->next) {
681-
seek(cout, sect->vaddr - segtext.vaddr + segtext.fileoff, 0);
681+
cseek(sect->vaddr - segtext.vaddr + segtext.fileoff);
682682
datblk(sect->vaddr, sect->len);
683683
}
684684

685685
if(debug['v'])
686686
Bprint(&bso, "%5.2f datblk\n", cputime());
687687
Bflush(&bso);
688688

689-
seek(cout, segdata.fileoff, 0);
689+
cseek(segdata.fileoff);
690690
datblk(segdata.vaddr, segdata.filelen);
691691

692692
machlink = 0;
@@ -743,15 +743,15 @@ asmb(void)
743743
symo = rnd(symo, PEFILEALIGN);
744744
break;
745745
}
746-
seek(cout, symo, 0);
746+
cseek(symo);
747747
switch(HEADTYPE) {
748748
default:
749749
if(iself) {
750750
if(debug['v'])
751751
Bprint(&bso, "%5.2f elfsym\n", cputime());
752752
asmelfsym();
753753
cflush();
754-
ewrite(cout, elfstrdat, elfstrsize);
754+
cwrite(elfstrdat, elfstrsize);
755755

756756
if(debug['v'])
757757
Bprint(&bso, "%5.2f dwarf\n", cputime());
@@ -782,7 +782,7 @@ asmb(void)
782782
if(debug['v'])
783783
Bprint(&bso, "%5.2f headr\n", cputime());
784784
Bflush(&bso);
785-
seek(cout, 0L, 0);
785+
cseek(0L);
786786
switch(HEADTYPE) {
787787
default:
788788
if(iself)
@@ -1138,7 +1138,7 @@ asmb(void)
11381138
pph->memsz = pph->filesz;
11391139
}
11401140

1141-
seek(cout, 0, 0);
1141+
cseek(0);
11421142
a = 0;
11431143
a += elfwritehdr();
11441144
a += elfwritephdrs();
@@ -1166,25 +1166,6 @@ s8put(char *n)
11661166
cput(name[i]);
11671167
}
11681168

1169-
void
1170-
cflush(void)
1171-
{
1172-
int n;
1173-
1174-
n = sizeof(buf.cbuf) - cbc;
1175-
if(n)
1176-
ewrite(cout, buf.cbuf, n);
1177-
cbp = buf.cbuf;
1178-
cbc = sizeof(buf.cbuf);
1179-
}
1180-
1181-
/* Current position in file */
1182-
vlong
1183-
cpos(void)
1184-
{
1185-
return seek(cout, 0, 1) + sizeof(buf.cbuf) - cbc;
1186-
}
1187-
11881169
int32
11891170
rnd(int32 v, int32 r)
11901171
{

0 commit comments

Comments
 (0)