Annotation of 43BSDTahoe/bin/adb/adb.vax/sym.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)sym.c 4.3 4/27/87";
                      2: /*
                      3:  * adb - symbol table routines
                      4:  */
                      5: #include "defs.h"
                      6: #include <stab.h>
                      7: 
                      8: /*
                      9:  * Lookup a symbol by name.
                     10:  */
                     11: struct nlist *
                     12: lookup(symstr)
                     13:        char *symstr;
                     14: {
                     15:        register struct nlist *sp;
                     16: 
                     17:        cursym = 0;
                     18:        if (symtab)
                     19:        for (sp = symtab; sp < esymtab; sp++)
                     20:                /* SHOULD DO SOME OF EQSYM INLINE TO SAVE TIME */
                     21:                if ((sp->n_type&N_STAB)==0 && eqsym(sp->n_un.n_name, symstr, '_'))
                     22:                        return(cursym = sp);
                     23:        return (0);
                     24: }
                     25: 
                     26: /*
                     27:  * Find the closest symbol to val, and return
                     28:  * the difference between val and the symbol found.
                     29:  * Leave a pointer to the symbol found as cursym.
                     30:  */
                     31: findsym(val, type)
                     32:        long val;
                     33:        int type;
                     34: {
                     35:        long diff;
                     36:        register struct nlist *sp;
                     37: 
                     38:        cursym = 0;
                     39:        diff = MAXINT;
                     40:        if (type == NSYM || symtab == 0)
                     41:                return (diff);
                     42:        for (sp = symtab; sp < esymtab; sp++) {
                     43:                if (sp->n_type & N_STAB || !(sp->n_type & N_EXT)
                     44:                    || sp->n_type == (N_FN|N_EXT))
                     45:                        continue;
                     46:                if (val - sp->n_value < diff && val >= sp->n_value) {
                     47:                        diff = val - sp->n_value;
                     48:                        cursym = sp;
                     49:                        if (diff == 0)
                     50:                                break;
                     51:                }
                     52:        }
                     53:        return (diff);
                     54: }
                     55: 
                     56: /*
                     57:  * Advance cursym to the next local variable.
                     58:  * Leave its value in localval as a side effect.
                     59:  * Return 0 at end of file.
                     60:  */
                     61: localsym(cframe, cargp)
                     62:        ADDR cframe, cargp;
                     63: {
                     64:        register int type;
                     65:        register struct nlist *sp;
                     66: 
                     67:        if (cursym)
                     68:        for (sp = cursym; ++sp < esymtab; ) {
                     69:                if (sp->n_un.n_name[0] =='_' || sp->n_type == N_FN)
                     70:                        return (0);
                     71:                type = sp->n_type;
                     72:                switch (sp->n_type) {
                     73: 
                     74:                case N_TEXT:
                     75:                case N_TEXT|N_EXT:
                     76:                case N_DATA:
                     77:                case N_DATA|N_EXT:
                     78:                case N_BSS:
                     79:                case N_BSS|N_EXT:
                     80:                        localval = sp->n_value;
                     81:                        cursym = sp;
                     82:                        return (1);
                     83: 
                     84:                case N_LSYM:
                     85:                        localval = cframe - sp->n_value;
                     86:                        cursym = sp;
                     87:                        return (1);
                     88: 
                     89:                case N_PSYM:
                     90:                        /* code below works since n_value > 0 */
                     91:                case N_ABS:
                     92:                        if (sp->n_value < 0)
                     93:                                localval = cframe + sp->n_value;
                     94:                        else
                     95:                                localval = cargp + sp->n_value;
                     96:                        cursym = sp;
                     97:                        return (1);
                     98:                }
                     99:        }
                    100:        cursym = 0;
                    101:        return (0);
                    102: }
                    103: 
                    104: /*
                    105:  * Print value v and then the string s.
                    106:  * If v is not zero, then we look for a nearby symbol
                    107:  * and print name+offset if we find a symbol for which
                    108:  * offset is small enough.
                    109:  *
                    110:  * For values which are just into kernel address space
                    111:  * that they match exactly or that they be more than maxoff
                    112:  * bytes into kernel space.
                    113:  */
                    114: psymoff(v, type, s)
                    115:        long v;
                    116:        int type;
                    117:        char *s;
                    118: {
                    119:        long w;
                    120: 
                    121:        if (v) 
                    122:                w = findsym(v, type);
                    123:        if (v==0 || w >= maxoff || (INKERNEL(v) && KVTOPH(v) < maxoff && w))
                    124:                printf(LPRMODE, v);
                    125:        else {
                    126:                printf("%s", cursym->n_un.n_name);
                    127:                if (w)
                    128:                        printf(OFFMODE, w);
                    129:        }
                    130:        printf(s);
                    131: }
                    132: 
                    133: /*
                    134:  * Print value v symbolically if it has a reasonable
                    135:  * interpretation as name+offset.  If not, print nothing.
                    136:  * Used in printing out registers $r.
                    137:  */
                    138: valpr(v, idsp)
                    139:        long v;
                    140: {
                    141:        off_t d;
                    142: 
                    143:        d = findsym(v, idsp);
                    144:        if (d >= maxoff)
                    145:                return;
                    146:        printf("%s", cursym->n_un.n_name);
                    147:        if (d)
                    148:                printf(OFFMODE, d);
                    149: }

unix.superglobalmegacorp.com

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