mirror of
https://github.com/golang/go
synced 2024-11-22 00:14:42 -07:00
6l, 8l: minor changes & cleanup
R=ken2, ken3 CC=golang-dev https://golang.org/cl/3505041
This commit is contained in:
parent
4d8d6d5cda
commit
8132f1d016
@ -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:
|
|||||||
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:
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
}
|
}
|
||||||
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:
|
|||||||
// 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[])
|
|||||||
else
|
else
|
||||||
doprof2();
|
doprof2();
|
||||||
span();
|
span();
|
||||||
|
textaddress();
|
||||||
pclntab();
|
pclntab();
|
||||||
symtab();
|
symtab();
|
||||||
dodata();
|
dodata();
|
||||||
|
@ -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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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
|
|||||||
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)
|
|||||||
// 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)
|
|||||||
}
|
}
|
||||||
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:
|
|||||||
// 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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;
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user