|
|
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 "AS IS" ! 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 Mellon ! 24: * the rights to redistribute these changes. ! 25: */ ! 26: /* ! 27: * Author: Alessandro Forin, Carnegie Mellon University ! 28: * Date: 8/90 ! 29: */ ! 30: ! 31: #include <mach/boolean.h> ! 32: #include <mach/machine/vm_types.h> ! 33: #include <machine/db_machdep.h> ! 34: ! 35: /* ! 36: * This module can handle multiple symbol tables, ! 37: * of multiple types, at the same time ! 38: */ ! 39: #define SYMTAB_NAME_LEN 32 ! 40: ! 41: typedef struct { ! 42: int type; ! 43: #define SYMTAB_AOUT 0 ! 44: #define SYMTAB_COFF 1 ! 45: #define SYMTAB_MACHDEP 2 ! 46: char *start; /* symtab location */ ! 47: char *end; ! 48: char *private; /* optional machdep pointer */ ! 49: char *map_pointer; /* symbols are for this map only, ! 50: if not null */ ! 51: char name[SYMTAB_NAME_LEN]; ! 52: /* symtab name */ ! 53: } db_symtab_t; ! 54: ! 55: extern db_symtab_t *db_last_symtab; /* where last symbol was found */ ! 56: ! 57: /* ! 58: * Symbol representation is specific to the symtab style: ! 59: * BSD compilers use dbx' nlist, other compilers might use ! 60: * a different one ! 61: */ ! 62: typedef char * db_sym_t; /* opaque handle on symbols */ ! 63: #define DB_SYM_NULL ((db_sym_t)0) ! 64: ! 65: /* ! 66: * Non-stripped symbol tables will have duplicates, for instance ! 67: * the same string could match a parameter name, a local var, a ! 68: * global var, etc. ! 69: * We are most concerned with the following matches. ! 70: */ ! 71: typedef int db_strategy_t; /* search strategy */ ! 72: ! 73: #define DB_STGY_ANY 0 /* anything goes */ ! 74: #define DB_STGY_XTRN 1 /* only external symbols */ ! 75: #define DB_STGY_PROC 2 /* only procedures */ ! 76: ! 77: extern boolean_t db_qualify_ambiguous_names; ! 78: /* if TRUE, check across symbol tables ! 79: * for multiple occurrences of a name. ! 80: * Might slow down quite a bit ! 81: * ..but the machine has nothing ! 82: * else to do, now does it ? */ ! 83: ! 84: /* ! 85: * Functions exported by the symtable module ! 86: */ ! 87: ! 88: /* extend the list of symbol tables */ ! 89: ! 90: extern boolean_t db_add_symbol_table( int type, ! 91: char * start, ! 92: char * end, ! 93: char *name, ! 94: char *ref, ! 95: char *map_pointer ); ! 96: ! 97: /* find symbol value given name */ ! 98: ! 99: extern int db_value_of_name( char* name, db_expr_t* valuep); ! 100: ! 101: /* find symbol given value */ ! 102: ! 103: extern db_sym_t db_search_task_symbol( db_addr_t val, ! 104: db_strategy_t strategy, ! 105: db_addr_t *offp, ! 106: task_t task ); ! 107: ! 108: /* return name and value of symbol */ ! 109: ! 110: extern void db_symbol_values( db_symtab_t *stab, ! 111: db_sym_t sym, ! 112: char** namep, ! 113: db_expr_t* valuep); ! 114: ! 115: /* find name&value given approx val */ ! 116: ! 117: #define db_find_sym_and_offset(val,namep,offp) \ ! 118: db_symbol_values(0, db_search_symbol(val,DB_STGY_ANY,offp),namep,0) ! 119: ! 120: /* ditto, but no locals */ ! 121: #define db_find_xtrn_sym_and_offset(val,namep,offp) \ ! 122: db_symbol_values(0, db_search_symbol(val,DB_STGY_XTRN,offp),namep,0) ! 123: ! 124: /* find name&value given approx val */ ! 125: ! 126: #define db_find_task_sym_and_offset(val,namep,offp,task) \ ! 127: db_symbol_values(0, db_search_task_symbol(val,DB_STGY_ANY,offp,task), \ ! 128: namep, 0) ! 129: ! 130: /* ditto, but no locals */ ! 131: #define db_find_xtrn_task_sym_and_offset(val,namep,offp,task) \ ! 132: db_symbol_values(0, db_search_task_symbol(val,DB_STGY_XTRN,offp,task), \ ! 133: namep,0) ! 134: ! 135: /* find symbol in current task */ ! 136: #define db_search_symbol(val,strgy,offp) \ ! 137: db_search_task_symbol(val,strgy,offp,0) ! 138: ! 139: /* strcmp, modulo leading char */ ! 140: extern boolean_t db_eqname( char* src, char* dst, char c ); ! 141: ! 142: /* print closest symbol to a value */ ! 143: extern void db_task_printsym( db_expr_t off, ! 144: db_strategy_t strategy, ! 145: task_t task); ! 146: ! 147: /* print closest symbol to a value */ ! 148: extern void db_printsym( db_expr_t off, db_strategy_t strategy); ! 149: ! 150: /* ! 151: * Symbol table switch, defines the interface ! 152: * to symbol-table specific routines. ! 153: * [NOTE: incomplete prototypes cuz broken compiler] ! 154: */ ! 155: ! 156: extern struct db_sym_switch { ! 157: ! 158: boolean_t (*init)( ! 159: /* char *start, ! 160: char *end, ! 161: char *name, ! 162: char *task_addr ! 163: */ ); ! 164: ! 165: db_sym_t (*lookup)( ! 166: /* db_symtab_t *stab, ! 167: char *symstr ! 168: */ ); ! 169: db_sym_t (*search_symbol)( ! 170: /* db_symtab_t *stab, ! 171: db_addr_t off, ! 172: db_strategy_t strategy, ! 173: db_expr_t *diffp ! 174: */ ); ! 175: ! 176: boolean_t (*line_at_pc)( ! 177: /* db_symtab_t *stab, ! 178: db_sym_t sym, ! 179: char **file, ! 180: int *line, ! 181: db_expr_t pc ! 182: */ ); ! 183: ! 184: void (*symbol_values)( ! 185: /* db_sym_t sym, ! 186: char **namep, ! 187: db_expr_t *valuep ! 188: */ ); ! 189: ! 190: } x_db[]; ! 191: ! 192: #ifndef symtab_type ! 193: #define symtab_type(s) SYMTAB_AOUT ! 194: #endif ! 195: ! 196: #define X_db_sym_init(s,e,n,t) x_db[symtab_type(s)].init(s,e,n,t) ! 197: #define X_db_lookup(s,n) x_db[(s)->type].lookup(s,n) ! 198: #define X_db_search_symbol(s,o,t,d) x_db[(s)->type].search_symbol(s,o,t,d) ! 199: #define X_db_line_at_pc(s,p,f,l,a) x_db[(s)->type].line_at_pc(s,p,f,l,a) ! 200: #define X_db_symbol_values(s,p,n,v) x_db[(s)->type].symbol_values(p,n,v)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.