Annotation of researchv9/cmd/adb/comm/sym.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * adb - symbol table routines
                      3:  */
                      4: #include "defs.h"
                      5: #include "sym.h"
                      6: #include "space.h"
                      7: 
                      8: struct sym *cursym;
                      9: struct sym *symtab;
                     10: 
                     11: /*
                     12:  * Lookup a symbol by name
                     13:  * leave a pointer to the symbol in cursym
                     14:  */
                     15: struct sym *
                     16: lookup(symstr)
                     17:        register char *symstr;
                     18: {
                     19:        register struct sym *sp;
                     20: 
                     21:        cursym = 0;
                     22:        for (sp = symtab; sp; sp = sp->y_next)
                     23:                if (eqsym(sp, symstr))
                     24:                        return(cursym = sp);
                     25:        return (0);
                     26: }
                     27: 
                     28: /*
                     29:  * find the symbols for a routine
                     30:  */
                     31: 
                     32: int
                     33: findrtn(rtn)
                     34: char *rtn;
                     35: {
                     36:        register struct sym *sp;
                     37: 
                     38:        cursym = 0;
                     39:        for (sp = symtab; sp; sp = sp->y_next)
                     40:                switch (sp->y_type) {
                     41:                case S_TEXT:
                     42:                        if (eqsym(sp, rtn)) {
                     43:                                cursym = sp;
                     44:                                return (1);
                     45:                        }
                     46:                }
                     47:        return (0);
                     48: }
                     49: 
                     50: /*
                     51:  * Find the closest symbol to val, and return
                     52:  * the difference between val and the symbol found.
                     53:  * Leave a pointer to the symbol found as cursym.
                     54:  */
                     55: WORD
                     56: findsym(w, type)
                     57:        WORD w;
                     58:        int type;
                     59: {
                     60:        register unsigned long diff;
                     61:        register unsigned long val;
                     62:        register struct sym *sp;
                     63: 
                     64:        val = w;
                     65:        cursym = 0;
                     66:        diff = HUGE;
                     67:        type &= SPTYPE;
                     68:        if (type == NOSP || symtab == 0)
                     69:                return (diff);
                     70:        for (sp = symtab; sp; sp = sp->y_next) {
                     71:                switch (type) {
                     72:                case INSTSP:
                     73:                        if (sp->y_type != S_TEXT && sp->y_type != S_ABS)
                     74:                                continue;
                     75:                        break;
                     76: 
                     77:                case DATASP:
                     78:                        if (sp->y_type != S_DATA && sp->y_type != S_ABS)
                     79:                                continue;
                     80:                        break;
                     81:                }
                     82:                if (val >= (unsigned long)sp->y_value
                     83:                &&  val - (unsigned long)sp->y_value < diff) {
                     84:                        diff = val - (unsigned long)sp->y_value;
                     85:                        cursym = sp;
                     86:                        if (diff == 0)
                     87:                                break;
                     88:                }
                     89:        }
                     90:        if (cursym && cursym->y_value == 0 && diff != 0)
                     91:                return (HUGE);
                     92:        return (diff);
                     93: }
                     94: 
                     95: /*
                     96:  * advance cursym to the next local variable
                     97:  * return 0 if the next variable is a global
                     98:  */
                     99: int
                    100: localsym()
                    101: {
                    102:        register struct sym *sp;
                    103: 
                    104:        if ((sp = cursym) == NULL)
                    105:                return (0);
                    106:        if (sp->y_type != S_STAB)
                    107:                sp = sp->y_locals;
                    108:        else
                    109:                sp = sp->y_next;
                    110:        cursym = sp;
                    111:        return (cursym != 0);
                    112: }
                    113: 
                    114: /*
                    115:  * Print value v and then the string s.
                    116:  * If v is not zero, then we look for a nearby symbol
                    117:  * and print name+offset if we find a symbol for which
                    118:  * offset is small enough.
                    119:  */
                    120: psymoff(v, type, s)
                    121:        WORD v;
                    122:        int type;
                    123:        char *s;
                    124: {
                    125:        WORD w;
                    126: 
                    127:        if ((type & SPTYPE) == REGSP) {
                    128:                printf("%%%R", v);
                    129:                printf(s);
                    130:                return;
                    131:        }
                    132:        if (v)
                    133:                w = findsym(v, type);
                    134:        if (v==0 || w >= maxoff)
                    135:                printf("%R", v);
                    136:        else {
                    137:                printf("%s", cursym->y_name);
                    138:                if (w)
                    139:                        printf("+%R", w);
                    140:        }
                    141:        printf(s);
                    142: }
                    143: 
                    144: /*
                    145:  * Print value v symbolically if it has a reasonable
                    146:  * interpretation as name+offset.  If not, print nothing.
                    147:  * Used in printing out registers $r.
                    148:  */
                    149: valpr(v, idsp)
                    150:        WORD v;
                    151: {
                    152:        WORD d;
                    153: 
                    154:        d = findsym(v, idsp);
                    155:        if (d >= maxoff)
                    156:                return;
                    157:        printf("%s", cursym->y_name);
                    158:        if (d)
                    159:                printf("+%R", d);
                    160: }
                    161: 
                    162: printsym()
                    163: {
                    164:        register struct sym *sp;
                    165:        register struct sym *lp;
                    166: 
                    167:        for (sp = symtab; sp; sp = sp->y_next) {
                    168:                printf("%8R %c %s\n", sp->y_value, gsname(sp->y_type), sp->y_name);
                    169:                for (lp = sp->y_locals; lp; lp = lp->y_next)
                    170:                        printf("%8R %c %s\n", lp->y_value, lsname(lp->y_ltype), lp->y_name);
                    171:        }
                    172: }
                    173: 
                    174: static
                    175: gsname(t)
                    176: int t;
                    177: {
                    178:        switch (t) {
                    179:        case S_TEXT:
                    180:                return ('T');
                    181:        case S_DATA:
                    182:                return ('D');
                    183:        case S_ABS:
                    184:                return ('A');
                    185:        case S_STAB:
                    186:                return ('L');
                    187:        default:
                    188:                return ('?');
                    189:        }
                    190: }
                    191: 
                    192: static
                    193: lsname(t)
                    194: int t;
                    195: {
                    196:        switch (t) {
                    197:        case S_LSYM:
                    198:                return ('l');
                    199:        case S_PSYM:
                    200:                return ('p');
                    201:        case S_RSYM:
                    202:                return ('r');
                    203:        case S_STSYM:
                    204:                return ('s');
                    205:        default:
                    206:                return ('?');
                    207:        }
                    208: }

unix.superglobalmegacorp.com

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