1
0
mirror of https://github.com/golang/go synced 2024-11-21 22:24:40 -07:00

6l/8l: generate dwarf variable names with disambiguating suffix.

R=rsc
CC=golang-dev
https://golang.org/cl/2733042
This commit is contained in:
Luuk van Dijk 2010-11-08 19:48:21 +01:00
parent f1af2ecbab
commit fbd92dba96

View File

@ -783,7 +783,7 @@ decodetype_structfieldcount(Sym *s)
} }
// Type.StructType.fields[]-> name, typ and offset. sizeof(structField) = 5*PtrSize // Type.StructType.fields[]-> name, typ and offset. sizeof(structField) = 5*PtrSize
static uchar* static char*
decodetype_structfieldname(Sym *s, int i) decodetype_structfieldname(Sym *s, int i)
{ {
Sym *p; Sym *p;
@ -793,7 +793,7 @@ decodetype_structfieldname(Sym *s, int i)
p = decode_reloc(p, 0); // string."foo" p = decode_reloc(p, 0); // string."foo"
if (p == nil) // shouldn't happen. if (p == nil) // shouldn't happen.
return nil; return nil;
return p->p; // the c-string return (char*)p->p; // the c-string
} }
static Sym* static Sym*
@ -1328,6 +1328,18 @@ newcfaoffsetattr(DWDie *die, int32 offs)
memmove(die->attr->data, block, i); memmove(die->attr->data, block, i);
} }
static char*
mkvarname(char* name, int da)
{
char buf[1024];
char *n;
snprint(buf, sizeof buf, "%s#%d", name, da);
n = mal(strlen(buf) + 1);
memmove(n, buf, strlen(buf));
return n;
}
/* /*
* Walk prog table, emit line program and build DIE tree. * Walk prog table, emit line program and build DIE tree.
*/ */
@ -1365,9 +1377,11 @@ writelines(void)
vlong unitstart; vlong unitstart;
vlong pc, epc, lc, llc, lline; vlong pc, epc, lc, llc, lline;
int currfile; int currfile;
int i, lang; int i, lang, da, dt;
Linehist *lh; Linehist *lh;
DWDie *dwinfo, *dwfunc, *dwvar; DWDie *dwinfo, *dwfunc, *dwvar;
DWDie *varhash[HASHSIZE];
char *n;
unitstart = -1; unitstart = -1;
epc = pc = 0; epc = pc = 0;
@ -1483,20 +1497,34 @@ writelines(void)
llc = lline; llc = lline;
} }
da = 0;
dwfunc->hash = varhash; // enable indexing of children by name
memset(varhash, 0, sizeof varhash);
for(a = s->autom; a; a = a->link) { for(a = s->autom; a; a = a->link) {
switch (a->type) { switch (a->type) {
case D_AUTO: case D_AUTO:
dwvar = newdie(dwfunc, DW_ABRV_AUTO, a->asym->name); dt = DW_ABRV_AUTO;
break; break;
case D_PARAM: case D_PARAM:
dwvar = newdie(dwfunc, DW_ABRV_PARAM, a->asym->name); dt = DW_ABRV_PARAM;
break; break;
default: default:
continue; continue;
} }
if (strstr(a->asym->name, ".autotmp_"))
continue;
if (find(dwfunc, a->asym->name) != nil)
n = mkvarname(a->asym->name, da);
else
n = a->asym->name;
dwvar = newdie(dwfunc, dt, n);
newcfaoffsetattr(dwvar, a->aoffset); newcfaoffsetattr(dwvar, a->aoffset);
newrefattr(dwvar, DW_AT_type, defgotype(a->gotype)); newrefattr(dwvar, DW_AT_type, defgotype(a->gotype));
da++;
} }
dwfunc->hash = nil;
} }
flushunit(dwinfo, epc, unitstart); flushunit(dwinfo, epc, unitstart);