tClean up the dwarf code a little and make acidtypes handle gcc 3.3.3 binaries. - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 87a478a361877db7c4f904da527cb72d4eff6de2
 (DIR) parent e37302c4b99f147f1fd85ca27a2dbd2aa7a4eb41
 (HTM) Author: rsc <devnull@localhost>
       Date:   Wed, 21 Apr 2004 02:02:47 +0000
       
       Clean up the dwarf code a little and make
       acidtypes handle gcc 3.3.3 binaries.
       
       Diffstat:
         M src/cmd/acidtypes/dat.h             |      15 +++++++++++++++
         M src/cmd/acidtypes/dwarf.c           |     261 +++++++++++++++----------------
         M src/cmd/acidtypes/mkfile            |       1 +
         M src/cmd/acidtypes/stabs.c           |      46 +++----------------------------
       
       4 files changed, 144 insertions(+), 179 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/acidtypes/dat.h b/src/cmd/acidtypes/dat.h
       t@@ -1,6 +1,7 @@
        typedef struct Type Type;
        typedef struct Typeref Typeref;
        typedef struct TypeList TypeList;
       +typedef struct Sym Sym;
        
        enum
        {
       t@@ -47,6 +48,14 @@ struct TypeList
                TypeList *tl;
        };
        
       +struct Sym
       +{
       +        char *fn;
       +        char *name;
       +        Type *type;
       +        Sym *next;
       +};
       +
        void *erealloc(void*, uint);
        void *emalloc(uint);
        char *estrdup(char*);
       t@@ -70,3 +79,9 @@ void freetypes(void);
        
        extern char *prefix;
        char *fixname(char*);
       +
       +void addsymx(char*, char*, Type*);
       +void dumpsyms(Biobuf*);
       +
       +
       +
 (DIR) diff --git a/src/cmd/acidtypes/dwarf.c b/src/cmd/acidtypes/dwarf.c
       t@@ -6,6 +6,8 @@
        #include <dwarf.h>
        #include "dat.h"
        
       +static void ds2acid(Dwarf*, DwarfSym*, Biobuf*, char*);
       +
        static ulong
        valof(uint ty, DwarfVal *v)
        {
       t@@ -32,162 +34,147 @@ xnewtype(uint ty, DwarfSym *s)
        int
        dwarf2acid(Dwarf *d, Biobuf *b)
        {
       -        char *fn;
                DwarfSym s;
       -        Type *t;
        
                /* pass over dwarf section pulling out type info */
        
                if(dwarfenum(d, &s) < 0)
                        return -1;
        
       -        while(dwarfnextsym(d, &s, s.depth!=1) == 1){
       -        top:
       -                switch(s.attrs.tag){
       -                case TagSubprogram:
       -                case TagLexDwarfBlock:
       -                        dwarfnextsym(d, &s, 1);
       -                        goto top;
       -
       -                case TagTypedef:
       -                        t = xnewtype(Typedef, &s);
       -                        t->name = s.attrs.name;
       -                        t->sub = typebynum(s.attrs.type, 0);
       -                        break;
       -                case TagBaseType:
       -                        t = xnewtype(Base, &s);
       -                        t->xsizeof = s.attrs.bytesize;
       -                        switch(s.attrs.encoding){
       -                        default:
       -                        case TypeAddress:
       -                                t->printfmt = 'x';
       -                                break;
       -                        case TypeBoolean:
       -                        case TypeUnsigned:
       -                        case TypeSigned:
       -                        case TypeSignedChar:
       -                        case TypeUnsignedChar:
       -                                t->printfmt = 'd';
       -                                break;
       -                        case TypeFloat:
       -                                t->printfmt = 'f';
       -                                break;
       -                        case TypeComplexFloat:
       -                                t->printfmt = 'F';
       -                                break;
       -                        case TypeImaginaryFloat:
       -                                t->printfmt = 'i';
       -                                break;
       -                        }
       -                        break;
       -                case TagPointerType:
       -                        t = xnewtype(Pointer, &s);
       -                        t->sub = typebynum(s.attrs.type, 0);
       -                        break;
       -                case TagStructType:
       -                case TagUnionType:
       -                        t = xnewtype(Aggr, &s);
       -                        t->sue = s.attrs.tag==TagStructType ? 's' : 'u';
       -                        t->xsizeof = s.attrs.bytesize;
       -                        t->suename = s.attrs.name;
       -                        t->isunion = s.attrs.tag==TagUnionType;
       -                        dwarfnextsym(d, &s, 1);
       -                        if(s.depth != 2)
       -                                goto top;
       -                        do{
       -                                if(!s.attrs.have.name || !s.attrs.have.type || s.attrs.tag != TagMember)
       -                                        continue;
       -                                if(t->n%32 == 0){
       -                                        t->tname = erealloc(t->tname, (t->n+32)*sizeof(t->tname[0]));
       -                                        t->val = erealloc(t->val, (t->n+32)*sizeof(t->val[0]));
       -                                        t->t = erealloc(t->t, (t->n+32)*sizeof(t->t[0]));
       -                                }
       -                                t->tname[t->n] = s.attrs.name;
       -                                if(t->isunion)
       -                                        t->val[t->n] = 0;
       -                                else
       -                                        t->val[t->n] = valof(s.attrs.have.datamemberloc, &s.attrs.datamemberloc);
       -                                t->t[t->n] = typebynum(s.attrs.type, 0);
       -                                t->n++;
       -                        }while(dwarfnextsym(d, &s, 1) == 1 && s.depth==2);
       -                        goto top;
       +        while(dwarfnextsymat(d, &s, 0) == 1)
       +                ds2acid(d, &s, b, nil);
       +
       +        printtypes(b);
       +        dumpsyms(b);
       +        freetypes();
       +        return 0;
       +}
       +
       +static void
       +ds2acid(Dwarf *d, DwarfSym *s, Biobuf *b, char *fn)
       +{
       +        int depth;
       +        Type *t;
       +
       +        depth = s->depth;
       +
       +        switch(s->attrs.tag){
       +        case TagSubroutineType:
       +                t = xnewtype(Function, s);
       +                goto Recurse;
       +
       +        case TagSubprogram:
       +                fn = s->attrs.name;
       +                goto Recurse;
       +
       +        case TagCompileUnit:
       +        case TagLexDwarfBlock:
       +        Recurse:
       +                /* recurse into substructure */
       +                while(dwarfnextsymat(d, s, depth+1) == 1)
       +                        ds2acid(d, s, b, fn);
       +                break;
       +
       +        case TagTypedef:
       +                t = xnewtype(Typedef, s);
       +                t->name = s->attrs.name;
       +                t->sub = typebynum(s->attrs.type, 0);
       +                break;
       +
       +        case TagBaseType:
       +                t = xnewtype(Base, s);
       +                t->xsizeof = s->attrs.bytesize;
       +                switch(s->attrs.encoding){
       +                default:
       +                case TypeAddress:
       +                        t->printfmt = 'x';
                                break;
       -                case TagSubroutineType:
       -                        t = xnewtype(Function, &s);
       +                case TypeBoolean:
       +                case TypeUnsigned:
       +                case TypeSigned:
       +                case TypeSignedChar:
       +                case TypeUnsignedChar:
       +                        t->printfmt = 'd';
                                break;
       -                case TagConstType:
       -                case TagVolatileType:
       -                        t = xnewtype(Defer, &s);
       -                        t->sub = typebynum(s.attrs.type, 0);
       +                case TypeFloat:
       +                        t->printfmt = 'f';
                                break;
       -                case TagArrayType:
       -                        t = xnewtype(Array, &s);
       -                        t->sub = typebynum(s.attrs.type, 0);
       +                case TypeComplexFloat:
       +                        t->printfmt = 'F';
                                break;
       -                case TagEnumerationType:
       -                        t = xnewtype(Enum, &s);
       -                        t->sue = 'e';
       -                        t->suename = s.attrs.name;
       -                        t->xsizeof = s.attrs.bytesize;
       -                        dwarfnextsym(d, &s, 1);
       -                        if(s.depth != 2)
       -                                goto top;
       -                        do{
       -                                if(!s.attrs.have.name || !s.attrs.have.constvalue || s.attrs.tag != TagEnumerator)
       -                                        continue;
       -                                if(t->n%32 == 0){
       -                                        t->tname = erealloc(t->tname, (t->n+32)*sizeof(t->tname[0]));
       -                                        t->val = erealloc(t->val, (t->n+32)*sizeof(t->val[0]));
       -                                }
       -                                t->tname[t->n] = s.attrs.name;
       -                                t->val[t->n] = valof(s.attrs.have.constvalue, &s.attrs.constvalue);
       -                                t->n++;
       -                        }while(dwarfnextsym(d, &s, 1) == 1 && s.depth==2);
       -                        goto top;
       +                case TypeImaginaryFloat:
       +                        t->printfmt = 'i';
                                break;
                        }
       -        }
       +                break;
        
       -        printtypes(b);
       +        case TagPointerType:
       +                t = xnewtype(Pointer, s);
       +                t->sub = typebynum(s->attrs.type, 0);
       +                break;
        
       -        /* pass over dwarf section pulling out type definitions */
        
       -        if(dwarfenum(d, &s) < 0)
       -                goto out;
       -
       -        fn = nil;
       -        while(dwarfnextsym(d, &s, 1) == 1){
       -                if(s.depth == 1)
       -                        fn = nil;
       -                switch(s.attrs.tag){
       -                case TagSubprogram:
       -                        fn = s.attrs.name;
       -                        break;
       -                case TagFormalParameter:
       -                        if(s.depth != 2)
       -                                break;
       -                        /* fall through */
       -                case TagVariable:
       -                        if(s.attrs.name == nil || s.attrs.type == 0)
       +        case TagConstType:
       +        case TagVolatileType:
       +                t = xnewtype(Defer, s);
       +                t->sub = typebynum(s->attrs.type, 0);
       +                break;
       +
       +        case TagArrayType:
       +                t = xnewtype(Array, s);
       +                t->sub = typebynum(s->attrs.type, 0);
       +                break;
       +
       +        case TagStructType:
       +        case TagUnionType:
       +                t = xnewtype(Aggr, s);
       +                t->sue = s->attrs.tag==TagStructType ? 's' : 'u';
       +                t->xsizeof = s->attrs.bytesize;
       +                t->suename = s->attrs.name;
       +                t->isunion = s->attrs.tag==TagUnionType;
       +                while(dwarfnextsymat(d, s, depth+1) == 1){
       +                        if(s->attrs.tag != TagMember){
       +                                ds2acid(d, s, b, fn);
                                        continue;
       -                        t = typebynum(s.attrs.type, 0);
       -                        if(t->ty == Pointer){
       -                                t = t->sub;
       -                                if(t && t->equiv)
       -                                        t = t->equiv;
                                }
       -                        if(t == nil)
       -                                break;
       -                        if(t->ty != Aggr)
       -                                break;
       -                        Bprint(b, "complex %s %s%s%s;\n", nameof(t, 1),
       -                                fn ? fixname(fn) : "", fn ? ":" : "", fixname(s.attrs.name));
       -                        break;
       +                        if(!s->attrs.have.name || !s->attrs.have.type)
       +                                continue;
       +                        if(t->n%32 == 0){
       +                                t->tname = erealloc(t->tname, (t->n+32)*sizeof(t->tname[0]));
       +                                t->val = erealloc(t->val, (t->n+32)*sizeof(t->val[0]));
       +                                t->t = erealloc(t->t, (t->n+32)*sizeof(t->t[0]));
       +                        }
       +                        t->tname[t->n] = s->attrs.name;
       +                        if(t->isunion)
       +                                t->val[t->n] = 0;
       +                        else
       +                                t->val[t->n] = valof(s->attrs.have.datamemberloc, &s->attrs.datamemberloc);
       +                        t->t[t->n] = typebynum(s->attrs.type, 0);
       +                        t->n++;
                        }
       -        }
       +                break;
        
       -out:
       -        freetypes();
       -        return 0;
       +        case TagEnumerationType:
       +                t = xnewtype(Enum, s);
       +                t->sue = 'e';
       +                t->suename = s->attrs.name;
       +                t->xsizeof = s->attrs.bytesize;
       +                while(dwarfnextsymat(d, s, depth+1) == 1){
       +                        if(s->attrs.tag != TagEnumerator){
       +                                ds2acid(d, s, b, fn);
       +                                continue;
       +                        }
       +                        if(!s->attrs.have.name || !s->attrs.have.constvalue)
       +                                continue;
       +                        if(t->n%32 == 0){
       +                                t->tname = erealloc(t->tname, (t->n+32)*sizeof(t->tname[0]));
       +                                t->val = erealloc(t->val, (t->n+32)*sizeof(t->val[0]));
       +                        }
       +                        t->tname[t->n] = s->attrs.name;
       +                        t->val[t->n] = valof(s->attrs.have.constvalue, &s->attrs.constvalue);
       +                        t->n++;
       +                }
       +                break;
       +        }
        }
        
 (DIR) diff --git a/src/cmd/acidtypes/mkfile b/src/cmd/acidtypes/mkfile
       t@@ -6,6 +6,7 @@ OFILES=\
                dwarf.$O\
                main.$O\
                stabs.$O\
       +        sym.$O\
                type.$O\
                util.$O\
        
 (DIR) diff --git a/src/cmd/acidtypes/stabs.c b/src/cmd/acidtypes/stabs.c
       t@@ -17,15 +17,6 @@ static Type *parsedefn(char *p, Type *t, char **pp);
        static int parsebound(char**);
        static vlong parsebigint(char**);
        
       -typedef struct Sym Sym;
       -struct Sym
       -{
       -        char *fn;
       -        char *name;
       -        Type *type;
       -        Sym *next;
       -};
       -
        typedef struct Ftypes Ftypes;
        struct Ftypes
        {
       t@@ -38,18 +29,6 @@ struct Ftypes
        Ftypes *fstack;
        Ftypes *allftypes;
        
       -static Sym*
       -mksym(char *fn, char *name, Type *type)
       -{
       -        Sym *s;
       -
       -        s = emalloc(sizeof *s);
       -        s->fn = fn;
       -        s->name = name;
       -        s->type = type;
       -        return s;
       -}
       -
        static char*
        estrndup(char *s, int n)
        {
       t@@ -626,15 +605,11 @@ stabs2acid(Stab *stabs, Biobuf *b)
                Ftypes *f;
                Type *t, *tt;
                StabSym sym;
       -        Sym *symbols, *s;
       -        Sym **lsym;
        
                dir = nil;
                file = nil;
                fno = 0;
                fn = nil;
       -        symbols = nil;
       -        lsym = &symbols;
                for(i=0; stabsym(stabs, i, &sym)>=0; i++){
                        switch(sym.type){
                        case N_SO:
       t@@ -737,8 +712,7 @@ stabs2acid(Stab *stabs, Biobuf *b)
                                if(c != 't' && c != 'T')
                                switch(sym.type){
                                case N_GSYM:
       -                                *lsym = mksym(nil, name, t);
       -                                lsym = &(*lsym)->next;
       +                                addsymx(nil, name, t);
                                        break;
                                case N_FUN:
                                        fn = name;
       t@@ -748,8 +722,7 @@ stabs2acid(Stab *stabs, Biobuf *b)
                                case N_LCSYM:
                                case N_STSYM:
                                case N_RSYM:
       -                                *lsym = mksym(fn, name, t);
       -                                lsym = &(*lsym)->next;
       +                                addsymx(fn, name, t);
                                        break;
                                }
                                break;
       t@@ -757,19 +730,8 @@ stabs2acid(Stab *stabs, Biobuf *b)
                }
        
                printtypes(b);
       -
       -        for(s=symbols; s; s=s->next){
       -                t = s->type;
       -                if(t->ty == Pointer){
       -                        t = t->sub;
       -                        if(t && t->equiv)
       -                                t = t->equiv;
       -                }
       -                if(t == nil || t->ty != Aggr)
       -                        continue;
       -                Bprint(b, "complex %s %s%s%s;\n", nameof(t, 1),
       -                        s->fn ? fixname(s->fn) : "", s->fn ? ":" : "", fixname(s->name));
       -        }
       +        dumpsyms(b);
       +        freetypes();
        
                return 0;
        }