1
0
mirror of https://github.com/golang/go synced 2024-11-24 21:10:04 -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
static uchar*
static char*
decodetype_structfieldname(Sym *s, int i)
{
Sym *p;
@ -793,7 +793,7 @@ decodetype_structfieldname(Sym *s, int i)
p = decode_reloc(p, 0); // string."foo"
if (p == nil) // shouldn't happen.
return nil;
return p->p; // the c-string
return (char*)p->p; // the c-string
}
static Sym*
@ -1328,6 +1328,18 @@ newcfaoffsetattr(DWDie *die, int32 offs)
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.
*/
@ -1365,9 +1377,11 @@ writelines(void)
vlong unitstart;
vlong pc, epc, lc, llc, lline;
int currfile;
int i, lang;
int i, lang, da, dt;
Linehist *lh;
DWDie *dwinfo, *dwfunc, *dwvar;
DWDie *varhash[HASHSIZE];
char *n;
unitstart = -1;
epc = pc = 0;
@ -1483,20 +1497,34 @@ writelines(void)
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) {
switch (a->type) {
case D_AUTO:
dwvar = newdie(dwfunc, DW_ABRV_AUTO, a->asym->name);
dt = DW_ABRV_AUTO;
break;
case D_PARAM:
dwvar = newdie(dwfunc, DW_ABRV_PARAM, a->asym->name);
dt = DW_ABRV_PARAM;
break;
default:
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);
newrefattr(dwvar, DW_AT_type, defgotype(a->gotype));
da++;
}
dwfunc->hash = nil;
}
flushunit(dwinfo, epc, unitstart);