This commit is contained in:
rsc 2005-11-28 01:37:16 +00:00
parent 4b01610937
commit d58b36f9d3
5 changed files with 118 additions and 23 deletions

View file

@ -79,10 +79,12 @@ char *nameof(Type*, int);
void freetypes(void); void freetypes(void);
extern char *prefix; extern char *prefix;
extern int verbose;
char *fixname(char*); char *fixname(char*);
char *cleanstl(char*);
void addsymx(char*, char*, Type*); void addsymx(char*, char*, Type*);
void dumpsyms(Biobuf*); void dumpsyms(Biobuf*);

View file

@ -4,17 +4,19 @@
#include <mach.h> #include <mach.h>
#include "dat.h" #include "dat.h"
int verbose;
void void
usage(void) usage(void)
{ {
fprint(2, "usage: acidtypes [-p prefix] executable...\n"); fprint(2, "usage: acidtypes [-v] [-p prefix] executable...\n");
exits("usage"); exits("usage");
} }
void void
main(int argc, char **argv) main(int argc, char **argv)
{ {
int i; int i, have;
Fhdr *fp; Fhdr *fp;
Biobuf b; Biobuf b;
char err[ERRMAX]; char err[ERRMAX];
@ -22,6 +24,9 @@ main(int argc, char **argv)
quotefmtinstall(); quotefmtinstall();
ARGBEGIN{ ARGBEGIN{
case 'v':
verbose = 1;
break;
case 'p': case 'p':
prefix = EARGF(usage()); prefix = EARGF(usage());
break; break;
@ -41,19 +46,25 @@ main(int argc, char **argv)
fprint(2, "open %s: %s\n", argv[i], err); fprint(2, "open %s: %s\n", argv[i], err);
continue; continue;
} }
have = 0;
if(fp->dwarf){ if(fp->dwarf){
if(dwarf2acid(fp->dwarf, &b) < 0){ if(dwarf2acid(fp->dwarf, &b) < 0){
rerrstr(err, sizeof err); rerrstr(err, sizeof err);
Bprint(&b, "// dwarf2acid %s: %s\n\n", argv[i], err); Bprint(&b, "// dwarf2acid %s: %s\n\n", argv[i], err);
fprint(2, "dwarf2acid %s: %s\n", argv[i], err); fprint(2, "dwarf2acid %s: %s\n", argv[i], err);
} }
}else if(fp->stabs.stabbase){ have = 1;
}
if(fp->stabs.stabbase){
if(stabs2acid(&fp->stabs, &b) < 0){ if(stabs2acid(&fp->stabs, &b) < 0){
rerrstr(err, sizeof err); rerrstr(err, sizeof err);
Bprint(&b, "// dwarf2acid %s: %s\n\n", argv[i], err); Bprint(&b, "// dwarf2acid %s: %s\n\n", argv[i], err);
fprint(2, "dwarf2acid %s: %s\n", argv[i], err); fprint(2, "dwarf2acid %s: %s\n", argv[i], err);
} }
}else{ have = 1;
}
if(!have){
Bprint(&b, "// no debugging symbols in %s\n\n", argv[i]); Bprint(&b, "// no debugging symbols in %s\n\n", argv[i]);
// fprint(2, "no debugging symbols in %s\n", argv[i]); // fprint(2, "no debugging symbols in %s\n", argv[i]);
} }

View file

@ -43,7 +43,7 @@ static char*
mkpath(char *dir, char *name) mkpath(char *dir, char *name)
{ {
char *s; char *s;
if(name[0] == '/') if(name[0] == '/' || dir == nil)
return estrdup(name); return estrdup(name);
else{ else{
s = emalloc(strlen(dir)+strlen(name)+1); s = emalloc(strlen(dir)+strlen(name)+1);
@ -384,6 +384,7 @@ parsedefn(char *p, Type *t, char **pp)
break; break;
case '*': /* pointer */ case '*': /* pointer */
case 'A': /* open array */ case 'A': /* open array */
case '&': /* reference */ /* guess - C++? (rob) */
t->ty = Pointer; t->ty = Pointer;
t->sub = parseinfo(p+1, &p); t->sub = parseinfo(p+1, &p);
break; break;
@ -613,6 +614,8 @@ stabs2acid(Stab *stabs, Biobuf *b)
fno = 0; fno = 0;
fn = nil; fn = nil;
for(i=0; stabsym(stabs, i, &sym)>=0; i++){ for(i=0; stabsym(stabs, i, &sym)>=0; i++){
if(verbose)
print("%d %s\n", sym.type, sym.name);
switch(sym.type){ switch(sym.type){
case N_SO: case N_SO:
if(sym.name){ if(sym.name){
@ -638,6 +641,9 @@ stabs2acid(Stab *stabs, Biobuf *b)
case N_EXCL: case N_EXCL:
fno++; fno++;
if((f = findftypes(dir, sym.name)) == nil){ if((f = findftypes(dir, sym.name)) == nil){
static int cannotprint;
if(cannotprint++ == 0)
fprint(2, "cannot find remembered %s\n", sym.name); fprint(2, "cannot find remembered %s\n", sym.name);
continue; continue;
} }
@ -656,7 +662,7 @@ stabs2acid(Stab *stabs, Biobuf *b)
fn = nil; fn = nil;
continue; continue;
} }
if((p = strchr(name, ':')) == nil) if((p = findcolon(name)) == nil)
continue; continue;
name = estrndup(name, p-name); name = estrndup(name, p-name);
desc = ++p; desc = ++p;
@ -666,14 +672,21 @@ stabs2acid(Stab *stabs, Biobuf *b)
continue; continue;
} }
if(setjmp(kaboom)){ if(setjmp(kaboom)){
static int cannotparse;
if(cannotparse++ == 0)
fprint(2, "cannot parse %s\n", name); fprint(2, "cannot parse %s\n", name);
continue; continue;
} }
t = parsename(desc, &p); t = parsename(desc, &p);
if(t == nil) if(t == nil)
continue; continue;
if(*p != 0) if(*p != 0){
static int extradesc;
if(extradesc++ == 0)
fprint(2, "extra desc '%s' in '%s'\n", p, desc); fprint(2, "extra desc '%s' in '%s'\n", p, desc);
}
/* void is defined as itself */ /* void is defined as itself */
if(t->ty==Defer && t->sub==t && strcmp(name, "void")==0){ if(t->ty==Defer && t->sub==t && strcmp(name, "void")==0){
t->ty = Base; t->ty = Base;
@ -729,6 +742,7 @@ stabs2acid(Stab *stabs, Biobuf *b)
} }
break; break;
} }
if(1) print("");
} }
printtypes(b); printtypes(b);

View file

@ -41,7 +41,7 @@ dumpsyms(Biobuf *b)
} }
if(t == nil || t->ty != Aggr) if(t == nil || t->ty != Aggr)
continue; continue;
Bprint(b, "complex %s %s%s%s;\n", nameof(t, 1), Bprint(b, "complex %s %s%s%s;\n", cleanstl(nameof(t, 1)),
s->fn ? fixname(s->fn) : "", s->fn ? ":" : "", fixname(s->name)); s->fn ? fixname(s->fn) : "", s->fn ? ":" : "", fixname(s->name));
} }

View file

@ -238,17 +238,75 @@ struct {
"FPSCR", "$FPSCR", "FPSCR", "$FPSCR",
}; };
char*
nonempty(char *name)
{
if(name[0] == '\0')
return "__empty__name__";
return name;
}
char*
cleanstl(char *name)
{
char *b, *p;
static char buf[65536]; /* These can be huge. */
if(strchr(name, '<') == nil)
return nonempty(name);
b = buf;
for(p = name; *p != 0; p++){
switch(*p){
case '<':
strcpy(b, "_L_");
b += 3;
break;
case '>':
strcpy(b, "_R_");
b += 3;
break;
case '*':
strcpy(b, "_A_");
b += 3;
break;
case ',':
strcpy(b, "_C_");
b += 3;
break;
case '.':
strcpy(b, "_D_");
b += 3;
break;
default:
*b++ = *p;
break;
}
}
*b = 0;
return buf;
}
char* char*
fixname(char *name) fixname(char *name)
{ {
int i; int i;
char *s;
static int nbuf;
static char buf[8][65536];
if(name == nil) if(name == nil)
return nil; return nil;
s = demangle(name, buf[nbuf], 1);
if(s != name){
if(++nbuf == nelem(buf))
nbuf = 0;
name = s;
}
for(i=0; i<nelem(fixes); i++) for(i=0; i<nelem(fixes); i++)
if(name[0]==fixes[i].old[0] && strcmp(name, fixes[i].old)==0) if(name[0]==fixes[i].old[0] && strcmp(name, fixes[i].old)==0)
return fixes[i].new; return nonempty(fixes[i].new);
return name; return nonempty(name);
} }
void void
@ -261,12 +319,14 @@ denumber(void)
void void
renumber(TypeList *tl, uint n1) renumber(TypeList *tl, uint n1)
{ {
Type *t; Type *t, *tt;
for(; tl; tl=tl->tl){ for(; tl; tl=tl->tl){
t = tl->hd; t = tl->hd;
t->n1 = n1; tt = typebynum(n1, t->n2);
addhash(t); *tt = *t;
tt->n1 = n1;
addhash(tt);
} }
} }
@ -276,6 +336,10 @@ defer(Type *t)
Type *u, *oldt; Type *u, *oldt;
int n; int n;
if(t == nil)
return nil;
/* XXX rob has return t; here */
u = t; u = t;
n = 0; n = 0;
oldt = t; oldt = t;
@ -286,6 +350,8 @@ defer(Type *t)
if(t == u) /* cycle */ if(t == u) /* cycle */
goto cycle; goto cycle;
} }
if(oldt != t)
oldt->sub = t;
return t; return t;
cycle: cycle:
@ -361,7 +427,7 @@ dorange(Type *t)
char* char*
nameof(Type *t, int doanon) nameof(Type *t, int doanon)
{ {
static char buf[1024]; static char buf[65536];
char *p; char *p;
if(t->name) if(t->name)
@ -499,7 +565,7 @@ printtype(Biobuf *b, Type *t)
t->printed = 1; t->printed = 1;
switch(t->ty){ switch(t->ty){
case Aggr: case Aggr:
name = nameof(t, 1); name = cleanstl(nameof(t, 1));
Bprint(b, "sizeof%s = %lud;\n", name, t->xsizeof); Bprint(b, "sizeof%s = %lud;\n", name, t->xsizeof);
Bprint(b, "aggr %s {\n", name); Bprint(b, "aggr %s {\n", name);
nprint = 0; nprint = 0;
@ -516,10 +582,12 @@ printtype(Biobuf *b, Type *t)
Bprint(b, "// oops: unknown type %d for %p/%s (%d,%d; %c,%s; %p)\n", Bprint(b, "// oops: unknown type %d for %p/%s (%d,%d; %c,%s; %p)\n",
tt->ty, tt, fixname(t->tname[j]), tt->ty, tt, fixname(t->tname[j]),
tt->n1, tt->n2, tt->sue ? tt->sue : '.', tt->suename, tt->sub); tt->n1, tt->n2, tt->sue ? tt->sue : '.', tt->suename, tt->sub);
if(0){
Bprint(b, "// t->t[j] = %p\n", ttt=t->t[j]); Bprint(b, "// t->t[j] = %p\n", ttt=t->t[j]);
while(ttt){ while(ttt){
Bprint(b, "// %s %d (%d,%d) sub %p\n", ttt->name, ttt->ty, ttt->n1, ttt->n2, ttt->sub); Bprint(b, "// %s %d (%d,%d) sub %p\n", ttt->name, ttt->ty, ttt->n1, ttt->n2, ttt->sub);
ttt=ttt->sub; ttt=ttt->sub;
}
} }
case Base: case Base:
case Pointer: case Pointer:
@ -539,9 +607,9 @@ ttt=ttt->sub;
Bprint(b, "\t'X' 0 __dummy;\n"); Bprint(b, "\t'X' 0 __dummy;\n");
Bprint(b, "};\n\n"); Bprint(b, "};\n\n");
name = nameof(t, 1); /* might have smashed it */ name = cleanstl(nameof(t, 1)); /* might have smashed it */
Bprint(b, "defn %s(addr) { indent_%s(addr, \"\"); }\n", name, name); Bprint(b, "defn %s(addr) { indent_%s(addr, \"\"); }\n", name, name);
Bprint(b, "defn\nindent_%s(addr, indent) {\n", name); Bprint(b, "defn indent_%s(addr, indent) {\n", name);
Bprint(b, "\tcomplex %s addr;\n", name); Bprint(b, "\tcomplex %s addr;\n", name);
for(j=0; j<t->n; j++){ for(j=0; j<t->n; j++){
name = fixname(t->tname[j]); name = fixname(t->tname[j]);
@ -598,7 +666,7 @@ ttt=ttt->sub;
for(j=0; j<t->n; j++) for(j=0; j<t->n; j++)
Bprint(b, "\t\"%s\",\n", fixname(t->tname[j])); Bprint(b, "\t\"%s\",\n", fixname(t->tname[j]));
Bprint(b, "};\n"); Bprint(b, "};\n");
Bprint(b, "defn\n%s(val) {\n", name); Bprint(b, "defn %s(val) {\n", name);
Bprint(b, "\tlocal i;\n"); Bprint(b, "\tlocal i;\n");
Bprint(b, "\ti = match(val, vals_%s);\n", name); Bprint(b, "\ti = match(val, vals_%s);\n", name);
Bprint(b, "\tif i >= 0 then return names_%s[i];\n", name); Bprint(b, "\tif i >= 0 then return names_%s[i];\n", name);
@ -620,7 +688,7 @@ printtypes(Biobuf *b)
t = tl->hd; t = tl->hd;
if(t->ty==None){ if(t->ty==None){
if(t->n1 || t->n2) if(t->n1 || t->n2)
warn("type %d,%d referenced but not defined", t->n1, t->n2); warn("type %d,%d referenced but not defined - %p", t->n1, t->n2, t);
else if(t->sue && t->suename) else if(t->sue && t->suename)
warn("%s %s referenced but not defined", warn("%s %s referenced but not defined",
t->sue=='s' ? "struct" : t->sue=='s' ? "struct" :