Annotation of researchv8dc/cmd/adb/sym.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * adb - symbol table routines
                      3:  */
                      4: #include "defs.h"
                      5: #include <a.out.h>
                      6: #include <stab.h>
                      7: #include <sys/types.h>
                      8: 
                      9: /*
                     10:  * Lookup a symbol by name
                     11:  * leave a pointer to the symbol in cursym
                     12:  */
                     13: struct nlist *
                     14: lookup(symstr)
                     15:        register char *symstr;
                     16: {
                     17:        register struct nlist *sp;
                     18: 
                     19:        cursym = 0;
                     20:        if (symtab)
                     21:        for (sp = symtab; sp < esymtab; sp++)
                     22:                switch (sp->n_type &~ N_EXT) {
                     23:                case N_FUN:
                     24:                case N_STSYM:
                     25:                case N_TEXT:
                     26:                case N_DATA:
                     27:                case N_BSS:
                     28:                case N_ABS:
                     29:                        if (eqsym(sp->n_un.n_name, symstr, '_'))
                     30:                                return(cursym = sp);
                     31:                }
                     32:        return (0);
                     33: }
                     34: 
                     35: /*
                     36:  * find the symbols for a routine
                     37:  */
                     38: 
                     39: int
                     40: findrtn(rtn)
                     41: char *rtn;
                     42: {
                     43:        register struct nlist *sp;
                     44: 
                     45:        cursym = 0;
                     46:        if (symtab)
                     47:        for (sp = symtab; sp < esymtab; sp++)
                     48:                switch (sp->n_type &~ N_EXT) {
                     49:                case N_FUN:
                     50:                case N_TEXT:
                     51:                        if (eqsym(sp->n_un.n_name, rtn, '_')) {
                     52:                                cursym = sp;
                     53:                                return (1);
                     54:                        }
                     55:                }
                     56:        return (0);
                     57: }
                     58: 
                     59: /*
                     60:  * Find the closest symbol to val, and return
                     61:  * the difference between val and the symbol found.
                     62:  * Leave a pointer to the symbol found as cursym.
                     63:  */
                     64: WORD
                     65: findsym(val, type)
                     66:        register WORD val;
                     67:        int type;
                     68: {
                     69:        register WORD diff;
                     70:        register struct nlist *sp;
                     71: 
                     72:        cursym = 0;
                     73:        diff = HUGE;
                     74:        if ((type & SPTYPE) == NOSP || symtab == 0)
                     75:                return (diff);
                     76:        for (sp = symtab; sp < esymtab; sp++)
                     77:                switch (sp->n_type) {
                     78:                case N_TEXT|N_EXT:
                     79:                case N_DATA|N_EXT:
                     80:                case N_BSS|N_EXT:
                     81:                case N_ABS|N_EXT:
                     82:                case N_FUN:
                     83:                case N_STSYM:
                     84:                /* data objects? */
                     85:                /* should look at type here */
                     86:                        if (val - sp->n_value < diff && val >= sp->n_value) {
                     87:                                diff = val - sp->n_value;
                     88:                                cursym = sp;
                     89:                                if (diff == 0)
                     90:                                        break;
                     91:                        }
                     92:                }
                     93:        if (cursym && cursym->n_value == 0 && diff != 0)
                     94:                return (HUGE);
                     95:        return (diff);
                     96: }
                     97: 
                     98: /*
                     99:  * advance cursym to the next local variable
                    100:  * return 0 if the next variable is a global
                    101:  */
                    102: int
                    103: localsym()
                    104: {
                    105:        register struct nlist *sp;
                    106: 
                    107:        if (cursym == NULL)
                    108:                return (0);
                    109:        for (sp = cursym; ++sp < esymtab; )
                    110:                switch (sp->n_type) {
                    111:                case N_TEXT:
                    112:                case N_DATA:
                    113:                        if (sp->n_un.n_name[0] == '_')  /* C global */
                    114:                                return (0);
                    115:                        continue;
                    116:                case N_LSYM:
                    117:                case N_PSYM:
                    118:                case N_RSYM:
                    119:                case N_STSYM:
                    120:                        cursym = sp;
                    121:                        return (1);
                    122: 
                    123:                case N_FUN:
                    124:                case N_EFUN:
                    125:                        return (0);
                    126:                }
                    127:        cursym = 0;
                    128:        return (0);
                    129: }
                    130: 
                    131: /*
                    132:  * Print value v and then the string s.
                    133:  * If v is not zero, then we look for a nearby symbol
                    134:  * and print name+offset if we find a symbol for which
                    135:  * offset is small enough.
                    136:  */
                    137: psymoff(v, type, s)
                    138:        WORD v;
                    139:        int type;
                    140:        char *s;
                    141: {
                    142:        WORD w;
                    143:        int r;
                    144: 
                    145:        if ((type & SPTYPE) == REGSP) {
                    146:                printf("%%%R", v);
                    147:                printf(s);
                    148:                return;
                    149:        }
                    150:        if (v)
                    151:                w = findsym(v, type);
                    152:        if (v==0 || w >= maxoff)
                    153:                printf("%R", v);
                    154:        else {
                    155:                printf("%s", cursym->n_un.n_name);
                    156:                if (w)
                    157:                        printf("+%R", w);
                    158:        }
                    159:        printf(s);
                    160: }
                    161: 
                    162: /*
                    163:  * Print value v symbolically if it has a reasonable
                    164:  * interpretation as name+offset.  If not, print nothing.
                    165:  * Used in printing out registers $r.
                    166:  */
                    167: valpr(v, idsp)
                    168:        WORD v;
                    169: {
                    170:        WORD d;
                    171: 
                    172:        d = findsym(v, idsp);
                    173:        if (d >= maxoff)
                    174:                return;
                    175:        printf("%s", cursym->n_un.n_name);
                    176:        if (d)
                    177:                printf("+%R", d);
                    178: }
                    179: 
                    180: eqsym(s1, s2, c)
                    181: register char *s1, *s2;
                    182: {
                    183: 
                    184:        if (!strcmp(s1,s2))
                    185:                return (1);
                    186:        if (*s1 == c && !strcmp(s1+1, s2))
                    187:                return (1);
                    188:        return (0);
                    189: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.