--- Net2/ddb/db_aout.c 2018/04/24 18:06:57 1.1 +++ Net2/ddb/db_aout.c 2018/04/24 18:15:50 1.1.1.3 @@ -24,10 +24,18 @@ * rights to redistribute these changes. */ /* + * db_aout.c,v 1.3 1993/05/20 03:39:06 cgd Exp + * * HISTORY - * $Log: db_aout.c,v $ - * Revision 1.1 2018/04/24 18:06:57 root - * Initial revision + * db_aout.c,v + * Revision 1.3 1993/05/20 03:39:06 cgd + * add explicit rcs id + * + * Revision 1.2 1993/05/07 09:13:53 cgd + * make SYMTAB_SPACE user-definable, as an "option" + * + * Revision 1.1.1.1 1993/03/21 09:46:26 cgd + * initial import of 386bsd-0.1 sources * * Revision 1.1 1992/03/25 21:44:55 pace * Initial revision @@ -49,7 +57,9 @@ * Symbol table routines for a.out format files. */ +#include "types.h" #include "param.h" +#include "systm.h" #include "proc.h" #include /* data types */ #include @@ -58,6 +68,7 @@ #define _AOUT_INCLUDE_ #include "nlist.h" +#include "stab.h" /* * An a.out symbol table as loaded into the kernel debugger: @@ -80,7 +91,9 @@ (sp = (struct nlist *)((symtab) + 1), \ ep = (struct nlist *)((char *)sp + *(symtab))) +#ifndef SYMTAB_SPACE #define SYMTAB_SPACE 63000 +#endif int db_symtabsize = SYMTAB_SPACE; char db_symtab[SYMTAB_SPACE] = { 1 }; @@ -175,13 +188,17 @@ X_db_search_symbol(symtab, off, strategy for (; sp < ep; sp++) { if (sp->n_un.n_name == 0) continue; - if ((sp->n_type & N_STAB) != 0) + if ((sp->n_type & N_STAB) != 0 || (sp->n_type & N_TYPE) == N_FN) continue; if (off >= sp->n_value) { if (off - sp->n_value < diff) { diff = off - sp->n_value; symp = sp; - if (diff == 0) + if (diff == 0 && + (strategy == DB_STGY_PROC && + sp->n_type == (N_TEXT|N_EXT) || + strategy == DB_STGY_ANY && + (sp->n_type & N_EXT))) break; } else if (off - sp->n_value == diff) { @@ -220,12 +237,111 @@ X_db_symbol_values(sym, namep, valuep) *valuep = sp->n_value; } + boolean_t -X_db_line_at_pc() +X_db_line_at_pc(symtab, cursym, filename, linenum, off) + db_symtab_t * symtab; + db_sym_t cursym; + char **filename; + int *linenum; + db_expr_t off; { + register struct nlist *sp, *ep; + register struct nlist *sym = (struct nlist *)cursym; + unsigned long sodiff = -1UL, lndiff = -1UL, ln = 0; + char *fname = NULL; + + sp = (struct nlist *)symtab->start; + ep = (struct nlist *)symtab->end; + +/* XXX - gcc specific */ +#define NEWSRC(str) ((str) != NULL && \ + (str)[0] == 'g' && strcmp((str), "gcc_compiled.") == 0) + + for (; sp < ep; sp++) { + + /* + * Prevent bogus linenumbers in case module not compiled + * with debugging options + */ +#if 0 + if (sp->n_value <= off && (off - sp->n_value) <= sodiff && + NEWSRC(sp->n_un.n_name)) { +#endif + if ((sp->n_type & N_TYPE) == N_FN || NEWSRC(sp->n_un.n_name)) { + sodiff = lndiff = -1UL; + ln = 0; + fname = NULL; + } + + if (sp->n_type == N_SO) { + if (sp->n_value <= off && (off - sp->n_value) < sodiff) { + sodiff = off - sp->n_value; + fname = sp->n_un.n_name; + } + continue; + } + + if (sp->n_type != N_SLINE) + continue; + + if (sp->n_value > off) + break; + + if (off - sp->n_value < lndiff) { + lndiff = off - sp->n_value; + ln = sp->n_desc; + } + } + + if (fname != NULL && ln != 0) { + *filename = fname; + *linenum = ln; + return TRUE; + } + return (FALSE); } +boolean_t +X_db_sym_numargs(symtab, cursym, nargp, argnamep) + db_symtab_t * symtab; + db_sym_t cursym; + int *nargp; + char **argnamep; +{ + register struct nlist *sp, *ep; + u_long addr; + int maxnarg = *nargp, nargs = 0; + + if (cursym == NULL) + return FALSE; + + addr = ((struct nlist *)cursym)->n_value; + sp = (struct nlist *)symtab->start; + ep = (struct nlist *)symtab->end; + + for (; sp < ep; sp++) { + if (sp->n_type == N_FUN && sp->n_value == addr) { + while (++sp < ep && sp->n_type == N_PSYM) { + if (nargs >= maxnarg) + break; + nargs++; + *argnamep++ = sp->n_un.n_name?sp->n_un.n_name:"???"; + { + /* XXX - remove trailers */ + char *cp = *(argnamep-1); + while (*cp != '\0' && *cp != ':') cp++; + if (*cp == ':') *cp = '\0'; + } + } + *nargp = nargs; + return TRUE; + } + } + return FALSE; +} + /* * Initialization routine for a.out files. */ @@ -236,11 +352,11 @@ kdb_init() extern int end; if (esym > (char *)&end) { - X_db_sym_init((int *)&end, esym, "mach"); + X_db_sym_init((int *)&end, esym, "netbsd"); } #endif - X_db_sym_init (db_symtab, 0, "mach"); + X_db_sym_init (db_symtab, 0, "netbsd"); } #if 0