Annotation of Net2/ddb/db_sym.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie the
                     24:  * rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  * HISTORY
                     28:  * $Log: db_sym.c,v $
                     29:  * Revision 1.1  1992/03/25  21:45:27  pace
                     30:  * Initial revision
                     31:  *
                     32:  * Revision 2.5  91/02/05  17:07:07  mrt
                     33:  *     Changed to new Mach copyright
                     34:  *     [91/01/31  16:19:17  mrt]
                     35:  * 
                     36:  * Revision 2.4  90/10/25  14:44:05  rwd
                     37:  *     Changed db_printsym to print unsigned.
                     38:  *     [90/10/19            rpd]
                     39:  * 
                     40:  * Revision 2.3  90/09/09  23:19:56  rpd
                     41:  *     Avoid totally incorrect guesses of symbol names for small values.
                     42:  *     [90/08/30  17:39:48  af]
                     43:  * 
                     44:  * Revision 2.2  90/08/27  21:52:18  dbg
                     45:  *     Removed nlist.h.  Fixed some type declarations.
                     46:  *     Qualifier character is ':'.
                     47:  *     [90/08/20            dbg]
                     48:  *     Modularized symtab info into a new db_symtab_t type.
                     49:  *     Modified db_add_symbol_table  and others accordingly.
                     50:  *     Defined db_sym_t, a new (opaque) type used to represent
                     51:  *     symbols.  This should support all sort of future symtable
                     52:  *     formats. Functions like db_qualify take a db_sym_t now.
                     53:  *     New db_symbol_values() function to explode the content
                     54:  *     of a db_sym_t.
                     55:  *     db_search_symbol() replaces db_find_sym_and_offset(), which is
                     56:  *     now a macro defined in our (new) header file.  This new
                     57:  *     function accepts more restrictive searches, which are
                     58:  *     entirely delegated to the symtab-specific code.
                     59:  *     Accordingly, db_printsym() accepts a strategy parameter.
                     60:  *     New db_line_at_pc() function.
                     61:  *     Renamed misleading db_eqsym into db_eqname.
                     62:  *     [90/08/20  10:47:06  af]
                     63:  * 
                     64:  *     Created.
                     65:  *     [90/07/25            dbg]
                     66:  * 
                     67:  * Revision 2.1  90/07/26  16:43:52  dbg
                     68:  * Created.
                     69:  * 
                     70:  */
                     71: /*
                     72:  *     Author: David B. Golub, Carnegie Mellon University
                     73:  *     Date:   7/90
                     74:  */
                     75: #include "param.h"
                     76: #include "proc.h"
                     77: #include <machine/db_machdep.h>
                     78: #include <ddb/db_sym.h>
                     79: 
                     80: /*
                     81:  * We import from the symbol-table dependent routines:
                     82:  */
                     83: extern db_sym_t        X_db_lookup();
                     84: extern db_sym_t        X_db_search_symbol();
                     85: extern boolean_t X_db_line_at_pc();
                     86: extern void    X_db_symbol_values();
                     87: 
                     88: /*
                     89:  * Multiple symbol tables
                     90:  */
                     91: #define        MAXNOSYMTABS    3       /* mach, ux, emulator */
                     92: 
                     93: db_symtab_t    db_symtabs[MAXNOSYMTABS] = {{0,},};
                     94: int db_nsymtab = 0;
                     95: 
                     96: db_symtab_t    *db_last_symtab;
                     97: 
                     98: db_sym_t       db_lookup();    /* forward */
                     99: 
                    100: /*
                    101:  * Add symbol table, with given name, to list of symbol tables.
                    102:  */
                    103: void
                    104: db_add_symbol_table(start, end, name, ref)
                    105:        char *start;
                    106:        char *end;
                    107:        char *name;
                    108:        char *ref;
                    109: {
                    110:        if (db_nsymtab >= MAXNOSYMTABS) {
                    111:                printf ("No slots left for %s symbol table", name);
                    112:                panic ("db_sym.c: db_add_symbol_table");
                    113:        }
                    114: 
                    115:        db_symtabs[db_nsymtab].start = start;
                    116:        db_symtabs[db_nsymtab].end = end;
                    117:        db_symtabs[db_nsymtab].name = name;
                    118:        db_symtabs[db_nsymtab].private = ref;
                    119:        db_nsymtab++;
                    120: }
                    121: 
                    122: /*
                    123:  *  db_qualify("vm_map", "ux") returns "unix:vm_map".
                    124:  *
                    125:  *  Note: return value points to static data whose content is
                    126:  *  overwritten by each call... but in practice this seems okay.
                    127:  */
                    128: static char *
                    129: db_qualify(sym, symtabname)
                    130:        db_sym_t        sym;
                    131:        register char   *symtabname;
                    132: {
                    133:        char            *symname;
                    134:        static char     tmp[256];
                    135:        register char   *s;
                    136: 
                    137:        db_symbol_values(sym, &symname, 0);
                    138:        s = tmp;
                    139:        while (*s++ = *symtabname++) {
                    140:        }
                    141:        s[-1] = ':';
                    142:        while (*s++ = *symname++) {
                    143:        }
                    144:        return tmp;
                    145: }
                    146: 
                    147: 
                    148: boolean_t
                    149: db_eqname(src, dst, c)
                    150:        char *src;
                    151:        char *dst;
                    152:        char c;
                    153: {
                    154:        if (!strcmp(src, dst))
                    155:            return (TRUE);
                    156:        if (src[0] == c)
                    157:            return (!strcmp(src+1,dst));
                    158:        return (FALSE);
                    159: }
                    160: 
                    161: boolean_t
                    162: db_value_of_name(name, valuep)
                    163:        char            *name;
                    164:        db_expr_t       *valuep;
                    165: {
                    166:        db_sym_t        sym;
                    167: 
                    168:        sym = db_lookup(name);
                    169:        if (sym == DB_SYM_NULL)
                    170:            return (FALSE);
                    171:        db_symbol_values(sym, &name, valuep);
                    172:        return (TRUE);
                    173: }
                    174: 
                    175: 
                    176: /*
                    177:  * Lookup a symbol.
                    178:  * If the symbol has a qualifier (e.g., ux:vm_map),
                    179:  * then only the specified symbol table will be searched;
                    180:  * otherwise, all symbol tables will be searched.
                    181:  */
                    182: db_sym_t
                    183: db_lookup(symstr)
                    184:        char *symstr;
                    185: {
                    186:        db_sym_t sp;
                    187:        register int i;
                    188:        int symtab_start = 0;
                    189:        int symtab_end = db_nsymtab;
                    190:        register char *cp;
                    191: 
                    192:        /*
                    193:         * Look for, remove, and remember any symbol table specifier.
                    194:         */
                    195:        for (cp = symstr; *cp; cp++) {
                    196:                if (*cp == ':') {
                    197:                        *cp = '\0';
                    198:                        for (i = 0; i < db_nsymtab; i++) {
                    199:                                if (! strcmp(symstr, db_symtabs[i].name)) {
                    200:                                        symtab_start = i;
                    201:                                        symtab_end = i + 1;
                    202:                                        break;
                    203:                                }
                    204:                        }
                    205:                        *cp = ':';
                    206:                        if (i == db_nsymtab) {
                    207:                                db_error("invalid symbol table name");
                    208:                        }
                    209:                        symstr = cp+1;
                    210:                }
                    211:        }
                    212: 
                    213:        /*
                    214:         * Look in the specified set of symbol tables.
                    215:         * Return on first match.
                    216:         */
                    217:        for (i = symtab_start; i < symtab_end; i++) {
                    218:                if (sp = X_db_lookup(&db_symtabs[i], symstr)) {
                    219:                        db_last_symtab = &db_symtabs[i];
                    220:                        return sp;
                    221:                }
                    222:        }
                    223:        return 0;
                    224: }
                    225: 
                    226: /*
                    227:  * Does this symbol name appear in more than one symbol table?
                    228:  * Used by db_symbol_values to decide whether to qualify a symbol.
                    229:  */
                    230: boolean_t db_qualify_ambiguous_names = FALSE;
                    231: 
                    232: boolean_t
                    233: db_symbol_is_ambiguous(sym)
                    234:        db_sym_t        sym;
                    235: {
                    236:        char            *sym_name;
                    237:        register int    i;
                    238:        register
                    239:        boolean_t       found_once = FALSE;
                    240: 
                    241:        if (!db_qualify_ambiguous_names)
                    242:                return FALSE;
                    243: 
                    244:        db_symbol_values(sym, &sym_name, 0);
                    245:        for (i = 0; i < db_nsymtab; i++) {
                    246:                if (X_db_lookup(&db_symtabs[i], sym_name)) {
                    247:                        if (found_once)
                    248:                                return TRUE;
                    249:                        found_once = TRUE;
                    250:                }
                    251:        }
                    252:        return FALSE;
                    253: }
                    254: 
                    255: /*
                    256:  * Find the closest symbol to val, and return its name
                    257:  * and the difference between val and the symbol found.
                    258:  */
                    259: db_sym_t
                    260: db_search_symbol( val, strategy, offp)
                    261:        register db_addr_t      val;
                    262:        db_strategy_t           strategy;
                    263:        db_expr_t               *offp;
                    264: {
                    265:        register
                    266:        unsigned int    diff;
                    267:        unsigned int    newdiff;
                    268:        register int    i;
                    269:        db_sym_t        ret = DB_SYM_NULL, sym;
                    270: 
                    271:        newdiff = diff = ~0;
                    272:        db_last_symtab = 0;
                    273:        for (i = 0; i < db_nsymtab; i++) {
                    274:            sym = X_db_search_symbol(&db_symtabs[i], val, strategy, &newdiff);
                    275:            if (newdiff < diff) {
                    276:                db_last_symtab = &db_symtabs[i];
                    277:                diff = newdiff;
                    278:                ret = sym;
                    279:            }
                    280:        }
                    281:        *offp = diff;
                    282:        return ret;
                    283: }
                    284: 
                    285: /*
                    286:  * Return name and value of a symbol
                    287:  */
                    288: void
                    289: db_symbol_values(sym, namep, valuep)
                    290:        db_sym_t        sym;
                    291:        char            **namep;
                    292:        db_expr_t       *valuep;
                    293: {
                    294:        db_expr_t       value;
                    295: 
                    296:        if (sym == DB_SYM_NULL) {
                    297:                *namep = 0;
                    298:                return;
                    299:        }
                    300: 
                    301:        X_db_symbol_values(sym, namep, &value);
                    302: 
                    303:        if (db_symbol_is_ambiguous(sym))
                    304:                *namep = db_qualify(sym, db_last_symtab->name);
                    305:        if (valuep)
                    306:                *valuep = value;
                    307: }
                    308: 
                    309: 
                    310: /*
                    311:  * Print a the closest symbol to value
                    312:  *
                    313:  * After matching the symbol according to the given strategy
                    314:  * we print it in the name+offset format, provided the symbol's
                    315:  * value is close enough (eg smaller than db_maxoff).
                    316:  * We also attempt to print [filename:linenum] when applicable
                    317:  * (eg for procedure names).
                    318:  *
                    319:  * If we could not find a reasonable name+offset representation,
                    320:  * then we just print the value in hex.  Small values might get
                    321:  * bogus symbol associations, e.g. 3 might get some absolute
                    322:  * value like _INCLUDE_VERSION or something, therefore we do
                    323:  * not accept symbols whose value is zero (and use plain hex).
                    324:  */
                    325: 
                    326: unsigned int   db_maxoff = 0x10000000;
                    327: 
                    328: void
                    329: db_printsym(off, strategy)
                    330:        db_expr_t       off;
                    331:        db_strategy_t   strategy;
                    332: {
                    333:        db_expr_t       d;
                    334:        char            *filename;
                    335:        char            *name;
                    336:        db_expr_t       value;
                    337:        int             linenum;
                    338:        db_sym_t        cursym;
                    339: 
                    340:        cursym = db_search_symbol(off, strategy, &d);
                    341:        db_symbol_values(cursym, &name, &value);
                    342:        if (name == 0 || d >= db_maxoff || value == 0) {
                    343:                db_printf("%#n", off);
                    344:                return;
                    345:        }
                    346:        db_printf("%s", name);
                    347:        if (d)
                    348:                db_printf("+%#r", d);
                    349:        if (strategy == DB_STGY_PROC) {
                    350:                if (db_line_at_pc(cursym, &filename, &linenum, off))
                    351:                        db_printf(" [%s:%d]", filename, linenum);
                    352:        }
                    353: }
                    354: 
                    355: 
                    356: boolean_t
                    357: db_line_at_pc( sym, filename, linenum, pc)
                    358: {
                    359:        return X_db_line_at_pc( db_last_symtab, sym, filename, linenum, pc);
                    360: }

unix.superglobalmegacorp.com

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