Commit 8132f1d0 authored by Russ Cox's avatar Russ Cox

6l, 8l: minor changes & cleanup

R=ken2, ken3
CC=golang-dev
https://golang.org/cl/3505041
parent 4d8d6d5c
...@@ -245,6 +245,7 @@ main(int argc, char *argv[]) ...@@ -245,6 +245,7 @@ main(int argc, char *argv[])
else else
doprof2(); doprof2();
span(); span();
textaddress();
pclntab(); pclntab();
symtab(); symtab();
dodata(); dodata();
...@@ -627,7 +628,7 @@ loop: ...@@ -627,7 +628,7 @@ loop:
if(s->type == 0) { if(s->type == 0) {
s->type = SDATA; s->type = SDATA;
adduint32(s, ieeedtof(&p->from.ieee)); adduint32(s, ieeedtof(&p->from.ieee));
s->reachable = 1; s->reachable = 0;
} }
p->from.type = D_EXTERN; p->from.type = D_EXTERN;
p->from.sym = s; p->from.sym = s;
...@@ -662,7 +663,7 @@ loop: ...@@ -662,7 +663,7 @@ loop:
s->type = SDATA; s->type = SDATA;
adduint32(s, p->from.ieee.l); adduint32(s, p->from.ieee.l);
adduint32(s, p->from.ieee.h); adduint32(s, p->from.ieee.h);
s->reachable = 1; s->reachable = 0;
} }
p->from.type = D_EXTERN; p->from.type = D_EXTERN;
p->from.sym = s; p->from.sym = s;
......
...@@ -289,24 +289,25 @@ patch(void) ...@@ -289,24 +289,25 @@ patch(void)
if(s) { if(s) {
if(debug['c']) if(debug['c'])
Bprint(&bso, "%s calls %s\n", TNAME, s->name); Bprint(&bso, "%s calls %s\n", TNAME, s->name);
switch(s->type) { if((s->type&~SSUB) != STEXT) {
default:
/* diag prints TNAME first */ /* diag prints TNAME first */
diag("undefined: %s", s->name); diag("undefined: %s", s->name);
s->type = STEXT; s->type = STEXT;
s->value = vexit; s->value = vexit;
continue; // avoid more error messages 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.type = D_BRANCH;
p->to.offset = s->text->pc;
p->pcond = s->text;
continue;
} }
} }
if(p->to.type != D_BRANCH) if(p->to.type != D_BRANCH)
continue; continue;
c = p->to.offset; c = p->to.offset;
for(q = textp->text; q != P;) { for(q = cursym->text; q != P;) {
if(c == q->pc) if(c == q->pc)
break; break;
if(q->forwd != P && c >= q->forwd->pc) if(q->forwd != P && c >= q->forwd->pc)
...@@ -315,8 +316,8 @@ patch(void) ...@@ -315,8 +316,8 @@ patch(void)
q = q->link; q = q->link;
} }
if(q == P) { if(q == P) {
diag("branch out of range in %s\n%P [%s]", diag("branch out of range in %s (%#ux)\n%P [%s]",
TNAME, p, p->to.sym ? p->to.sym->name : "<nil>"); TNAME, c, p, p->to.sym ? p->to.sym->name : "<nil>");
p->to.type = D_NONE; p->to.type = D_NONE;
} }
p->pcond = q; p->pcond = q;
...@@ -387,6 +388,9 @@ dostkoff(void) ...@@ -387,6 +388,9 @@ dostkoff(void)
autoffset = 0; autoffset = 0;
deltasp = 0; deltasp = 0;
for(cursym = textp; cursym != nil; cursym = cursym->next) { for(cursym = textp; cursym != nil; cursym = cursym->next) {
if(cursym->text == nil || cursym->text->link == nil)
continue;
p = cursym->text; p = cursym->text;
parsetextconst(p->to.offset); parsetextconst(p->to.offset);
autoffset = textstksiz; autoffset = textstksiz;
......
...@@ -138,9 +138,7 @@ span(void) ...@@ -138,9 +138,7 @@ span(void)
{ {
Prog *p, *q; Prog *p, *q;
int32 v; int32 v;
vlong c;
int n; int n;
Section *sect;
if(debug['v']) if(debug['v'])
Bprint(&bso, "%5.2f span\n", cputime()); Bprint(&bso, "%5.2f span\n", cputime());
...@@ -176,20 +174,6 @@ span(void) ...@@ -176,20 +174,6 @@ span(void)
} }
span1(cursym); 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 void
...@@ -1435,7 +1419,7 @@ found: ...@@ -1435,7 +1419,7 @@ found:
// Could handle this case by making D_PCREL // Could handle this case by making D_PCREL
// record the Prog* instead of the Sym*, but let's // record the Prog* instead of the Sym*, but let's
// wait until the need arises. // wait until the need arises.
diag("call of non-TEXT"); diag("call of non-TEXT %P", q);
errorexit(); errorexit();
} }
*andptr++ = op; *andptr++ = op;
......
...@@ -329,6 +329,7 @@ main(int argc, char *argv[]) ...@@ -329,6 +329,7 @@ main(int argc, char *argv[])
else else
doprof2(); doprof2();
span(); span();
textaddress();
pclntab(); pclntab();
symtab(); symtab();
dodata(); dodata();
......
...@@ -306,24 +306,25 @@ patch(void) ...@@ -306,24 +306,25 @@ patch(void)
if(s) { if(s) {
if(debug['c']) if(debug['c'])
Bprint(&bso, "%s calls %s\n", TNAME, s->name); Bprint(&bso, "%s calls %s\n", TNAME, s->name);
switch(s->type) { if((s->type&~SSUB) != STEXT) {
default:
/* diag prints TNAME first */ /* diag prints TNAME first */
diag("undefined: %s", s->name); diag("undefined: %s", s->name);
s->type = STEXT; s->type = STEXT;
s->value = vexit; s->value = vexit;
continue; // avoid more error messages 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.type = D_BRANCH;
p->to.offset = s->text->pc;
p->pcond = s->text;
continue;
} }
} }
if(p->to.type != D_BRANCH) if(p->to.type != D_BRANCH)
continue; continue;
c = p->to.offset; c = p->to.offset;
for(q = textp->text; q != P;) { for(q = cursym->text; q != P;) {
if(c == q->pc) if(c == q->pc)
break; break;
if(q->forwd != P && c >= q->forwd->pc) if(q->forwd != P && c >= q->forwd->pc)
...@@ -332,7 +333,8 @@ patch(void) ...@@ -332,7 +333,8 @@ patch(void)
q = q->link; q = q->link;
} }
if(q == P) { 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->to.type = D_NONE;
} }
p->pcond = q; p->pcond = q;
...@@ -340,6 +342,9 @@ patch(void) ...@@ -340,6 +342,9 @@ patch(void)
} }
for(cursym = textp; cursym != nil; cursym = cursym->next) { 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) { for(p = cursym->text; p != P; p = p->link) {
p->mark = 0; /* initialization for follow */ p->mark = 0; /* initialization for follow */
if(p->pcond != P) { if(p->pcond != P) {
...@@ -389,8 +394,10 @@ dostkoff(void) ...@@ -389,8 +394,10 @@ dostkoff(void)
} }
for(cursym = textp; cursym != nil; cursym = cursym->next) { 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; autoffset = p->to.offset;
if(autoffset < 0) if(autoffset < 0)
autoffset = 0; autoffset = 0;
...@@ -639,5 +646,5 @@ undef(void) ...@@ -639,5 +646,5 @@ undef(void)
for(i=0; i<NHASH; i++) for(i=0; i<NHASH; i++)
for(s = hash[i]; s != S; s = s->hash) for(s = hash[i]; s != S; s = s->hash)
if(s->type == SXREF) if(s->type == SXREF)
diag("%s: not defined", s->name); diag("%s(%d): not defined", s->name, s->version);
} }
...@@ -132,9 +132,8 @@ void ...@@ -132,9 +132,8 @@ void
span(void) span(void)
{ {
Prog *p, *q; Prog *p, *q;
int32 v, c; int32 v;
int n; int n;
Section *sect;
if(debug['v']) if(debug['v'])
Bprint(&bso, "%5.2f span\n", cputime()); Bprint(&bso, "%5.2f span\n", cputime());
...@@ -142,6 +141,9 @@ span(void) ...@@ -142,6 +141,9 @@ span(void)
// NOTE(rsc): If we get rid of the globals we should // NOTE(rsc): If we get rid of the globals we should
// be able to parallelize these iterations. // be able to parallelize these iterations.
for(cursym = textp; cursym != nil; cursym = cursym->next) { for(cursym = textp; cursym != nil; cursym = cursym->next) {
if(cursym->text == nil || cursym->text->link == nil)
continue;
// TODO: move into span1 // TODO: move into span1
for(p = cursym->text; p != P; p = p->link) { for(p = cursym->text; p != P; p = p->link) {
n = 0; n = 0;
...@@ -168,20 +170,6 @@ span(void) ...@@ -168,20 +170,6 @@ span(void)
} }
span1(cursym); 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 void
...@@ -1118,7 +1106,7 @@ found: ...@@ -1118,7 +1106,7 @@ found:
// Could handle this case by making D_PCREL // Could handle this case by making D_PCREL
// record the Prog* instead of the Sym*, but let's // record the Prog* instead of the Sym*, but let's
// wait until the need arises. // wait until the need arises.
diag("call of non-TEXT"); diag("call of non-TEXT %P", q);
errorexit(); errorexit();
} }
*andptr++ = op; *andptr++ = op;
......
...@@ -1895,7 +1895,7 @@ writelines(void) ...@@ -1895,7 +1895,7 @@ writelines(void)
cput(DW_LNE_set_address); cput(DW_LNE_set_address);
addrput(pc); addrput(pc);
} }
if (!s->reachable) if(s->text == nil)
continue; continue;
if (unitstart < 0) { if (unitstart < 0) {
...@@ -1910,6 +1910,9 @@ writelines(void) ...@@ -1910,6 +1910,9 @@ writelines(void)
if (s->version == 0) if (s->version == 0)
newattr(dwfunc, DW_AT_external, DW_CLS_FLAG, 1, 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) { for(q = s->text; q != P; q = q->link) {
lh = searchhist(q->line); lh = searchhist(q->line);
if (lh == nil) { if (lh == nil) {
...@@ -2054,7 +2057,7 @@ writeframes(void) ...@@ -2054,7 +2057,7 @@ writeframes(void)
for(cursym = textp; cursym != nil; cursym = cursym->next) { for(cursym = textp; cursym != nil; cursym = cursym->next) {
s = cursym; s = cursym;
if (!s->reachable) if(s->text == nil)
continue; continue;
fdeo = cpos(); fdeo = cpos();
......
...@@ -964,7 +964,7 @@ extern int numelfshdr; ...@@ -964,7 +964,7 @@ extern int numelfshdr;
extern int iself; extern int iself;
int elfwriteinterp(void); int elfwriteinterp(void);
void elfinterp(ElfShdr*, uint64, char*); void elfinterp(ElfShdr*, uint64, char*);
void elfdynhash(int); void elfdynhash(void);
ElfPhdr* elfphload(Segment*); ElfPhdr* elfphload(Segment*);
ElfShdr* elfshbits(Section*); ElfShdr* elfshbits(Section*);
void elfsetstring(char*, int); void elfsetstring(char*, int);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment