fixes
This commit is contained in:
parent
4b01610937
commit
d58b36f9d3
5 changed files with 118 additions and 23 deletions
|
|
@ -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*);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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" :
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue