]> Cypherpunks repositories - gostls13.git/commitdiff
Change 5l to use Biobufs for IO.
authorKai Backman <kaib@golang.org>
Thu, 28 May 2009 14:41:23 +0000 (07:41 -0700)
committerKai Backman <kaib@golang.org>
Thu, 28 May 2009 14:41:23 +0000 (07:41 -0700)
R=rsc
APPROVED=rsc
DELTA=132  (16 added, 45 deleted, 71 changed)
OCL=29468
CL=29497

src/cmd/5l/l.h
src/cmd/5l/obj.c

index 8cd9d2010b81d1b40acbb02277269e82da38fcbb..b864744e16d995932704856b2f067943594905c9 100644 (file)
@@ -414,7 +414,7 @@ double      ieeedtod(Ieee*);
 int32  ieeedtof(Ieee*);
 void   import(void);
 int    isnop(Prog*);
-void   ldobj(int, int32, char*);
+void   ldobj(Biobuf*, int32, char*);
 void   loadlib(void);
 void   listinit(void);
 Sym*   lookup(char*, int);
index b3cf056a3e36fde2becb213631ff6e50790e33e5..d939ea9777089a3740f0eb54b80580617ce199df 100644 (file)
@@ -371,7 +371,8 @@ void
 objfile(char *file)
 {
        int32 off, esym, cnt, l;
-       int f, work;
+       int work;
+       Biobuf *f;
        Sym *s;
        char magbuf[SARMAG];
        char name[100], pname[150];
@@ -390,24 +391,24 @@ objfile(char *file)
        if(debug['v'])
                Bprint(&bso, "%5.2f ldobj: %s\n", cputime(), file);
        Bflush(&bso);
-       f = open(file, 0);
-       if(f < 0) {
+       f = Bopen(file, 0);
+       if(f == nil) {
                diag("cannot open file: %s", file);
                errorexit();
        }
-       l = read(f, magbuf, SARMAG);
+       l = Bread(f, magbuf, SARMAG);
        if(l != SARMAG || strncmp(magbuf, ARMAG, SARMAG)){
                /* load it as a regular file */
-               l = seek(f, 0L, 2);
-               seek(f, 0L, 0);
+               l = Bseek(f, 0L, 2);
+               Bseek(f, 0L, 0);
                ldobj(f, l, file);
-               close(f);
+               Bterm(f);
                return;
        }
 
        if(debug['v'])
                Bprint(&bso, "%5.2f ldlib: %s\n", cputime(), file);
-       l = read(f, &arhdr, SAR_HDR);
+       l = Bread(f, &arhdr, SAR_HDR);
        if(l != SAR_HDR) {
                diag("%s: short read on archive file symbol header", file);
                goto out;
@@ -423,12 +424,12 @@ objfile(char *file)
        /*
         * just bang the whole symbol file into memory
         */
-       seek(f, off, 0);
+       Bseek(f, off, 0);
        cnt = esym - off;
        start = malloc(cnt + 10);
-       cnt = read(f, start, cnt);
+       cnt = Bread(f, start, cnt);
        if(cnt <= 0){
-               close(f);
+               Bterm(f);
                return;
        }
        stop = &start[cnt];
@@ -452,8 +453,8 @@ objfile(char *file)
                        l |= (e[2] & 0xff) << 8;
                        l |= (e[3] & 0xff) << 16;
                        l |= (e[4] & 0xff) << 24;
-                       seek(f, l, 0);
-                       l = read(f, &arhdr, SAR_HDR);
+                       Bseek(f, l, 0);
+                       l = Bread(f, &arhdr, SAR_HDR);
                        if(l != SAR_HDR)
                                goto bad;
                        if(strncmp(arhdr.fmag, ARFMAG, sizeof(arhdr.fmag)))
@@ -473,33 +474,42 @@ objfile(char *file)
 bad:
        diag("%s: bad or out of date archive", file);
 out:
-       close(f);
+       Bterm(f);
 }
 
-int
-zaddr(uchar *p, Adr *a, Sym *h[])
+int32
+Bget4(Biobuf *f)
+{
+       uchar p[4];
+
+       if(Bread(f, p, 4) != 4)
+               return 0;
+       return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
+}
+
+void
+zaddr(Biobuf *f, Adr *a, Sym *h[])
 {
        int i, c;
        int32 l;
        Sym *s;
        Auto *u;
 
-       c = p[2];
+       a->type = Bgetc(f);
+       a->reg = Bgetc(f);
+       c = Bgetc(f);
        if(c < 0 || c > NSYM){
                print("sym out of range: %d\n", c);
-               p[0] = ALAST+1;
-               return 0;
+               Bputc(f, ALAST+1);
+               return;
        }
-       a->type = p[0];
-       a->reg = p[1];
        a->sym = h[c];
-       a->name = p[3];
-       c = 4;
+       a->name = Bgetc(f);
 
        if(a->reg < 0 || a->reg > NREG) {
                print("register out of range %d\n", a->reg);
-               p[0] = ALAST+1;
-               return 0;       /*  force real diagnostic */
+               Bputc(f, ALAST+1);
+               return; /*  force real diagnostic */
        }
 
        if(a->type == D_CONST || a->type == D_OCONST) {
@@ -516,8 +526,8 @@ zaddr(uchar *p, Adr *a, Sym *h[])
        switch(a->type) {
        default:
                print("unknown type %d\n", a->type);
-               p[0] = ALAST+1;
-               return 0;       /*  force real diagnostic */
+               Bputc(f, ALAST+1);
+               return; /*  force real diagnostic */
 
        case D_NONE:
        case D_REG:
@@ -527,7 +537,7 @@ zaddr(uchar *p, Adr *a, Sym *h[])
                break;
 
        case D_REGREG:
-               a->offset = p[4];
+               a->offset = Bgetc(f);
                c++;
                break;
 
@@ -536,9 +546,7 @@ zaddr(uchar *p, Adr *a, Sym *h[])
        case D_CONST:
        case D_OCONST:
        case D_SHIFT:
-               a->offset = p[4] | (p[5]<<8) |
-                       (p[6]<<16) | (p[7]<<24);
-               c += 4;
+               a->offset = Bget4(f);
                break;
 
        case D_SCONST:
@@ -548,7 +556,7 @@ zaddr(uchar *p, Adr *a, Sym *h[])
                nhunk -= NSNAME;
                hunk += NSNAME;
 
-               memmove(a->sval, p+4, NSNAME);
+               Bread(f, a->sval, NSNAME);
                c += NSNAME;
                break;
 
@@ -559,19 +567,16 @@ zaddr(uchar *p, Adr *a, Sym *h[])
                nhunk -= NSNAME;
                hunk += NSNAME;
 
-               a->ieee->l = p[4] | (p[5]<<8) |
-                       (p[6]<<16) | (p[7]<<24);
-               a->ieee->h = p[8] | (p[9]<<8) |
-                       (p[10]<<16) | (p[11]<<24);
-               c += 8;
+               a->ieee->l = Bget4(f);
+               a->ieee->h = Bget4(f);
                break;
        }
        s = a->sym;
        if(s == S)
-               return c;
+               return;
        i = a->name;
        if(i != D_AUTO && i != D_PARAM)
-               return c;
+               return;
 
        l = a->offset;
        for(u=curauto; u; u=u->link)
@@ -579,7 +584,7 @@ zaddr(uchar *p, Adr *a, Sym *h[])
                if(u->type == i) {
                        if(u->aoffset > l)
                                u->aoffset = l;
-                       return c;
+                       return;
                }
 
        while(nhunk < sizeof(Auto))
@@ -593,7 +598,6 @@ zaddr(uchar *p, Adr *a, Sym *h[])
        u->asym = s;
        u->aoffset = l;
        u->type = i;
-       return c;
 }
 
 void
@@ -748,37 +752,22 @@ nopout(Prog *p)
        p->to.type = D_NONE;
 }
 
-uchar*
-readsome(int f, uchar *buf, uchar *good, uchar *stop, int max)
-{
-       int n;
-
-       n = stop - good;
-       memmove(buf, good, stop - good);
-       stop = buf + n;
-       n = MAXIO - n;
-       if(n > max)
-               n = max;
-       n = read(f, stop, n);
-       if(n <= 0)
-               return 0;
-       return stop + n;
-}
-
 static void puntfp(Prog *);
 
 void
-ldobj(int f, int32 c, char *pn)
+ldobj(Biobuf *f, int32 len, char *pn)
 {
        int32 ipc;
        Prog *p, *t;
-       uchar *bloc, *bsize, *stop;
        Sym *h[NSYM], *s, *di;
        int v, o, r, skip;
        uint32 sig;
        static int files;
        static char **filen;
-       char **nfilen;
+       char **nfilen,*name;
+       vlong eof;
+
+       eof = Boffset(f) + len;
 
        if((files&15) == 0){
                nfilen = malloc((files+16)*sizeof(char*));
@@ -788,8 +777,6 @@ ldobj(int f, int32 c, char *pn)
        }
        filen[files++] = strdup(pn);
 
-       bsize = buf.xbuf;
-       bloc = buf.xbuf;
        di = S;
 
 newloop:
@@ -800,52 +787,38 @@ newloop:
        skip = 0;
 
 loop:
-       if(c <= 0)
+       if(f->state == Bracteof || Boffset(f) >= eof)
                goto eof;
-       r = bsize - bloc;
-       if(r < 100 && r < c) {          /* enough for largest prog */
-               bsize = readsome(f, buf.xbuf, bloc, bsize, c);
-               if(bsize == 0)
-                       goto eof;
-               bloc = buf.xbuf;
-               goto loop;
-       }
-       o = bloc[0];            /* as */
+       o = Bgetc(f);
+       if(o == Beof)
+               goto eof;
+       // TODO(kaib): I wonder if this is an issue.
+//     o |= Bgetc(f) << 8; 6l does this, 5l doesn't. I think 5g outputs 2 byte
+//     AXXX's
+
        if(o <= AXXX || o >= ALAST) {
-               diag("%s: line %ld: opcode out of range %d", pn, pc-ipc, o);
+               diag("%s:#%lld: opcode out of range: %#ux", pn, Boffset(f), o);
                print(" probably not a .5 file\n");
                errorexit();
        }
        if(o == ANAME || o == ASIGNAME) {
                sig = 0;
-               if(o == ASIGNAME){
-                       sig = bloc[1] | (bloc[2]<<8) | (bloc[3]<<16) | (bloc[4]<<24);
-                       bloc += 4;
-                       c -= 4;
-               }
-               stop = memchr(&bloc[3], 0, bsize-&bloc[3]);
-               if(stop == 0){
-                       bsize = readsome(f, buf.xbuf, bloc, bsize, c);
-                       if(bsize == 0)
-                               goto eof;
-                       bloc = buf.xbuf;
-                       stop = memchr(&bloc[3], 0, bsize-&bloc[3]);
-                       if(stop == 0){
+               if(o == ASIGNAME)
+                       sig = Bget4(f);
+               v = Bgetc(f); /* type */
+               o = Bgetc(f); /* sym */
+               r = 0;
+               if(v == D_STATIC)
+                       r = version;
+               name = Brdline(f, '\0');
+               if(name == nil) {
+                       if(Blinelen(f) > 0) {
                                fprint(2, "%s: name too long\n", pn);
                                errorexit();
                        }
+                       goto eof;
                }
-               v = bloc[1];    /* type */
-               o = bloc[2];    /* sym */
-               bloc += 3;
-               c -= 3;
-
-               r = 0;
-               if(v == D_STATIC)
-                       r = version;
-               s = lookup((char*)bloc, r);
-               c -= &stop[1] - bloc;
-               bloc = stop + 1;
+               s = lookup(name, r);
 
                if(sig != 0){
                        if(s->sig != 0 && s->sig != sig)
@@ -881,16 +854,14 @@ loop:
        hunk += sizeof(Prog);
 
        p->as = o;
-       p->scond = bloc[1];
-       p->reg = bloc[2];
-       p->line = bloc[3] | (bloc[4]<<8) | (bloc[5]<<16) | (bloc[6]<<24);
+       p->scond = Bgetc(f);
+       p->reg = Bgetc(f);
+       p->line = Bget4(f);
 
-       r = zaddr(bloc+7, &p->from, h) + 7;
-       r += zaddr(bloc+r, &p->to, h);
-       bloc += r;
-       c -= r;
+       zaddr(f, &p->from, h);
+       zaddr(f, &p->to, h);
 
-       if(p->reg < 0 || p->reg > NREG)
+       if(p->reg > NREG)
                diag("register out of range %d", p->reg);
 
        p->link = P;
@@ -918,9 +889,9 @@ loop:
                        curtext->to.autom = curauto;
                curauto = 0;
                curtext = P;
-               if(c)
-                       goto newloop;
-               return;
+               if(Boffset(f) == eof)
+                       return;
+               goto newloop;
 
        case AGLOBL:
                s = p->from.sym;