]> Cypherpunks repositories - gostls13.git/commitdiff
6l, 8l: minor changes & cleanup
authorRuss Cox <rsc@golang.org>
Wed, 8 Dec 2010 18:53:07 +0000 (13:53 -0500)
committerRuss Cox <rsc@golang.org>
Wed, 8 Dec 2010 18:53:07 +0000 (13:53 -0500)
R=ken2, ken3
CC=golang-dev
https://golang.org/cl/3505041

src/cmd/6l/obj.c
src/cmd/6l/pass.c
src/cmd/6l/span.c
src/cmd/8l/obj.c
src/cmd/8l/pass.c
src/cmd/8l/span.c
src/cmd/ld/dwarf.c
src/cmd/ld/elf.h

index fb2d35cd6c39e3e7f214703cc145fa19402b0224..41c0f93cc646aa06d71328df6c42459b3a4cfeb2 100644 (file)
@@ -245,6 +245,7 @@ main(int argc, char *argv[])
                else
                        doprof2();
        span();
+       textaddress();
        pclntab();
        symtab();
        dodata();
@@ -627,7 +628,7 @@ loop:
                        if(s->type == 0) {
                                s->type = SDATA;
                                adduint32(s, ieeedtof(&p->from.ieee));
-                               s->reachable = 1;
+                               s->reachable = 0;
                        }
                        p->from.type = D_EXTERN;
                        p->from.sym = s;
@@ -662,7 +663,7 @@ loop:
                                s->type = SDATA;
                                adduint32(s, p->from.ieee.l);
                                adduint32(s, p->from.ieee.h);
-                               s->reachable = 1;
+                               s->reachable = 0;
                        }
                        p->from.type = D_EXTERN;
                        p->from.sym = s;
index 8dc0ed551b674a3e1afa388e90dcacef7a297a0f..5c4ed00a69c7ca341ca934e595949646c57dcb5a 100644 (file)
@@ -289,24 +289,25 @@ patch(void)
                        if(s) {
                                if(debug['c'])
                                        Bprint(&bso, "%s calls %s\n", TNAME, s->name);
-                               switch(s->type) {
-                               default:
+                               if((s->type&~SSUB) != STEXT) {
                                        /* diag prints TNAME first */
                                        diag("undefined: %s", s->name);
                                        s->type = STEXT;
                                        s->value = vexit;
                                        continue;       // avoid more error messages
-                               case STEXT:
-                                       p->to.offset = s->value;
-                                       break;
                                }
+                               if(s->text == nil)
+                                       continue;
                                p->to.type = D_BRANCH;
+                               p->to.offset = s->text->pc;
+                               p->pcond = s->text;
+                               continue;
                        }
                }
                if(p->to.type != D_BRANCH)
                        continue;
                c = p->to.offset;
-               for(q = textp->text; q != P;) {
+               for(q = cursym->text; q != P;) {
                        if(c == q->pc)
                                break;
                        if(q->forwd != P && c >= q->forwd->pc)
@@ -315,8 +316,8 @@ patch(void)
                                q = q->link;
                }
                if(q == P) {
-                       diag("branch out of range in %s\n%P [%s]",
-                               TNAME, p, p->to.sym ? p->to.sym->name : "<nil>");
+                       diag("branch out of range in %s (%#ux)\n%P [%s]",
+                               TNAME, c, p, p->to.sym ? p->to.sym->name : "<nil>");
                        p->to.type = D_NONE;
                }
                p->pcond = q;
@@ -387,6 +388,9 @@ dostkoff(void)
        autoffset = 0;
        deltasp = 0;
        for(cursym = textp; cursym != nil; cursym = cursym->next) {
+               if(cursym->text == nil || cursym->text->link == nil)
+                       continue;
+
                p = cursym->text;
                parsetextconst(p->to.offset);
                autoffset = textstksiz;
index 6cb3586f5d7391a16cd66a27398476be91181da7..5251f19bbaca1008e1c62720fecc9a39bdc6702f 100644 (file)
@@ -138,9 +138,7 @@ span(void)
 {
        Prog *p, *q;
        int32 v;
-       vlong c;
        int n;
-       Section *sect;
 
        if(debug['v'])
                Bprint(&bso, "%5.2f span\n", cputime());
@@ -176,20 +174,6 @@ span(void)
                }
                span1(cursym);
        }
-       
-       // Next, loop over symbols to assign actual PCs.
-       // Could parallelize here too, by assigning to text 
-       // and then letting threads copy down, but probably not worth it.
-       c = INITTEXT;
-       sect = addsection(&segtext, ".text", 05);
-       sect->vaddr = c;
-       for(cursym = textp; cursym != nil; cursym = cursym->next) {
-               cursym->value = c;
-               for(p = cursym->text; p != P; p = p->link)
-                       p->pc += c;
-               c += cursym->size;
-       }
-       sect->len = c - sect->vaddr;
 }
 
 void
@@ -1435,7 +1419,7 @@ found:
                        // Could handle this case by making D_PCREL
                        // record the Prog* instead of the Sym*, but let's
                        // wait until the need arises.
-                       diag("call of non-TEXT");
+                       diag("call of non-TEXT %P", q);
                        errorexit();
                }
                *andptr++ = op;
index b6ebc1a9bff2619508bd224d2fffd229dd441374..222d7c734cfef74b4af188c128532f7446b9c256 100644 (file)
@@ -329,6 +329,7 @@ main(int argc, char *argv[])
                else
                        doprof2();
        span();
+       textaddress();
        pclntab();
        symtab();
        dodata();
index 264771f5702730d57c72b77d42ccf94dfb2fd219..6e387b0b5e4d6c9cfb0fdf8979c45b4785276559 100644 (file)
@@ -306,24 +306,25 @@ patch(void)
                                if(s) {
                                        if(debug['c'])
                                                Bprint(&bso, "%s calls %s\n", TNAME, s->name);
-                                       switch(s->type) {
-                                       default:
+                                       if((s->type&~SSUB) != STEXT) {
                                                /* diag prints TNAME first */
                                                diag("undefined: %s", s->name);
                                                s->type = STEXT;
                                                s->value = vexit;
                                                continue;       // avoid more error messages
-                                       case STEXT:
-                                               p->to.offset = s->value;
-                                               break;
                                        }
+                                       if(s->text == nil)
+                                               continue;
                                        p->to.type = D_BRANCH;
+                                       p->to.offset = s->text->pc;
+                                       p->pcond = s->text;
+                                       continue;
                                }
                        }
                        if(p->to.type != D_BRANCH)
                                continue;
                        c = p->to.offset;
-                       for(q = textp->text; q != P;) {
+                       for(q = cursym->text; q != P;) {
                                if(c == q->pc)
                                        break;
                                if(q->forwd != P && c >= q->forwd->pc)
@@ -332,7 +333,8 @@ patch(void)
                                        q = q->link;
                        }
                        if(q == P) {
-                               diag("branch out of range in %s\n%P", TNAME, p);
+                               diag("branch out of range in %s (%#ux)\n%P [%s]",
+                                       TNAME, c, p, p->to.sym ? p->to.sym->name : "<nil>");
                                p->to.type = D_NONE;
                        }
                        p->pcond = q;
@@ -340,6 +342,9 @@ patch(void)
        }
 
        for(cursym = textp; cursym != nil; cursym = cursym->next) {
+               if(cursym->text == nil || cursym->p != nil)
+                       continue;
+
                for(p = cursym->text; p != P; p = p->link) {
                        p->mark = 0;    /* initialization for follow */
                        if(p->pcond != P) {
@@ -389,8 +394,10 @@ dostkoff(void)
        }
 
        for(cursym = textp; cursym != nil; cursym = cursym->next) {
-               p = cursym->text;
+               if(cursym->text == nil || cursym->text->link == nil)
+                       continue;
 
+               p = cursym->text;
                autoffset = p->to.offset;
                if(autoffset < 0)
                        autoffset = 0;
@@ -639,5 +646,5 @@ undef(void)
        for(i=0; i<NHASH; i++)
        for(s = hash[i]; s != S; s = s->hash)
                if(s->type == SXREF)
-                       diag("%s: not defined", s->name);
+                       diag("%s(%d): not defined", s->name, s->version);
 }
index 7f083eebde91f8644f4c66485d8d454473825c24..b0479081045169e67ec9fb221141a7c1edf8163a 100644 (file)
@@ -132,9 +132,8 @@ void
 span(void)
 {
        Prog *p, *q;
-       int32 v, c;
+       int32 v;
        int n;
-       Section *sect;
 
        if(debug['v'])
                Bprint(&bso, "%5.2f span\n", cputime());
@@ -142,6 +141,9 @@ span(void)
        // NOTE(rsc): If we get rid of the globals we should
        // be able to parallelize these iterations.
        for(cursym = textp; cursym != nil; cursym = cursym->next) {
+               if(cursym->text == nil || cursym->text->link == nil)
+                       continue;
+
                // TODO: move into span1
                for(p = cursym->text; p != P; p = p->link) {
                        n = 0;
@@ -168,20 +170,6 @@ span(void)
                }
                span1(cursym);
        }
-       
-       // Next, loop over symbols to assign actual PCs.
-       // Could parallelize here too, by assigning to text 
-       // and then letting threads copy down, but probably not worth it.
-       c = INITTEXT;
-       sect = addsection(&segtext, ".text", 05);
-       sect->vaddr = c;
-       for(cursym = textp; cursym != nil; cursym = cursym->next) {
-               cursym->value = c;
-               for(p = cursym->text; p != P; p = p->link)
-                       p->pc += c;
-               c += cursym->size;
-       }
-       sect->len = c - sect->vaddr;
 }
 
 void
@@ -1118,7 +1106,7 @@ found:
                        // Could handle this case by making D_PCREL
                        // record the Prog* instead of the Sym*, but let's
                        // wait until the need arises.
-                       diag("call of non-TEXT");
+                       diag("call of non-TEXT %P", q);
                        errorexit();
                }
                *andptr++ = op;
index 4c9be955ba5b9fca3d9ea0908013aa9d3fbdc480..adffb890a7e6e6a37a27410c4e9009e7098e5950 100644 (file)
@@ -1895,7 +1895,7 @@ writelines(void)
                        cput(DW_LNE_set_address);
                        addrput(pc);
                }
-               if (!s->reachable)
+               if(s->text == nil)
                        continue;
 
                if (unitstart < 0) {
@@ -1910,6 +1910,9 @@ writelines(void)
                if (s->version == 0)
                        newattr(dwfunc, DW_AT_external, DW_CLS_FLAG, 1, 0);
 
+               if(s->text->link == nil)
+                       continue;
+
                for(q = s->text; q != P; q = q->link) {
                        lh = searchhist(q->line);
                        if (lh == nil) {
@@ -2054,7 +2057,7 @@ writeframes(void)
 
        for(cursym = textp; cursym != nil; cursym = cursym->next) {
                s = cursym;
-               if (!s->reachable)
+               if(s->text == nil)
                        continue;
 
                fdeo = cpos();
index 2ba6e53e61d0faf0c003ef1d95c32e43d5e630c2..df15cb11583bbd5639c1e70f67a204a0dc61d11c 100644 (file)
@@ -964,7 +964,7 @@ extern      int     numelfshdr;
 extern int     iself;
 int    elfwriteinterp(void);
 void   elfinterp(ElfShdr*, uint64, char*);
-void   elfdynhash(int);
+void   elfdynhash(void);
 ElfPhdr* elfphload(Segment*);
 ElfShdr* elfshbits(Section*);
 void   elfsetstring(char*, int);