This diff removes the "symbol table" argument of the functions dealing
with symbols. While here keep the definition of ``db_symtab'' private
because we only have one global symbol table.
ok?
Index: ddb/db_elf.c
===================================================================
RCS file: /cvs/src/sys/ddb/db_elf.c,v
retrieving revision 1.16
diff -u -p -r1.16 db_elf.c
--- ddb/db_elf.c 27 Jan 2016 10:37:12 -0000 1.16
+++ ddb/db_elf.c 26 Feb 2016 15:28:20 -0000
@@ -45,6 +45,16 @@
#include <sys/exec_elf.h>
+
+typedef struct {
+ const char *name; /* symtab name */
+ char *start; /* symtab location */
+ char *end;
+ char *private; /* optional machdep pointer */
+} db_symtab_t;
+
+db_symtab_t db_symtab;
+
static char *db_elf_find_strtab(db_symtab_t *);
static char *db_elf_find_linetab(db_symtab_t *, size_t *);
@@ -171,15 +181,16 @@ db_elf_sym_init(int symsize, void *symta
/*
* Link the symbol table into the debugger.
*/
- if (db_add_symbol_table((char *)symtab_start,
- (char *)symtab_end, name, (char *)symtab) != -1) {
- db_printf("[ using %lu bytes of %s ELF symbol table ]\n",
- (u_long)roundup(((char *)esymtab - (char *)symtab),
- sizeof(u_long)), name);
- return (TRUE);
- }
+ db_symtab.start = (char *)symtab_start;
+ db_symtab.end = (char *)symtab_end;
+ db_symtab.name = name;
+ db_symtab.private = (char *)symtab;
+
+ db_printf("[ using %lu bytes of %s ELF symbol table ]\n",
+ (u_long)roundup(((char *)esymtab - (char *)symtab), sizeof(u_long)),
+ name);
- return (FALSE);
+ return (TRUE);
badheader:
db_printf("[ %s ELF symbol table not valid: %s ]\n", name, errstr);
@@ -237,11 +248,15 @@ db_elf_find_linetab(db_symtab_t *stab, s
* Lookup the symbol with the given name.
*/
db_sym_t
-db_elf_sym_lookup(db_symtab_t *stab, char *symstr)
+db_elf_sym_lookup(char *symstr)
{
+ db_symtab_t *stab = &db_symtab;
Elf_Sym *symp, *symtab_start, *symtab_end;
char *strtab;
+ if (stab->private == NULL)
+ return ((db_sym_t)0);
+
symtab_start = STAB_TO_SYMSTART(stab);
symtab_end = STAB_TO_SYMEND(stab);
@@ -263,14 +278,18 @@ db_elf_sym_lookup(db_symtab_t *stab, cha
* provided threshold).
*/
db_sym_t
-db_elf_sym_search(db_symtab_t *symtab, db_addr_t off, db_strategy_t strategy,
+db_elf_sym_search(db_addr_t off, db_strategy_t strategy,
db_expr_t *diffp)
{
+ db_symtab_t *stab = &db_symtab;
Elf_Sym *rsymp, *symp, *symtab_start, *symtab_end;
db_expr_t diff = *diffp;
- symtab_start = STAB_TO_SYMSTART(symtab);
- symtab_end = STAB_TO_SYMEND(symtab);
+ if (stab->private == NULL)
+ return ((db_sym_t)0);
+
+ symtab_start = STAB_TO_SYMSTART(stab);
+ symtab_end = STAB_TO_SYMEND(stab);
rsymp = NULL;
@@ -326,14 +345,18 @@ db_elf_sym_search(db_symtab_t *symtab, d
* Return the name and value for a symbol.
*/
void
-db_elf_sym_values(db_symtab_t *symtab, db_sym_t sym, char **namep,
+db_elf_sym_values(db_sym_t sym, char **namep,
db_expr_t *valuep)
{
+ db_symtab_t *stab = &db_symtab;
Elf_Sym *symp = (Elf_Sym *)sym;
char *strtab;
+ if (stab->private == NULL)
+ return;
+
if (namep) {
- strtab = db_elf_find_strtab(symtab);
+ strtab = db_elf_find_strtab(stab);
if (strtab == NULL)
*namep = NULL;
else
@@ -349,14 +372,18 @@ db_elf_sym_values(db_symtab_t *symtab, d
* if we can find the appropriate debugging symbol.
*/
boolean_t
-db_elf_line_at_pc(db_symtab_t *symtab, db_sym_t cursym, char **filename,
+db_elf_line_at_pc(db_sym_t cursym, char **filename,
int *linenum, db_expr_t off)
{
+ db_symtab_t *stab = &db_symtab;
static char path[PATH_MAX];
const char *linetab, *dirname, *basename;
size_t linetab_size;
- linetab = db_elf_find_linetab(symtab, &linetab_size);
+ if (stab->private == NULL)
+ return (FALSE);
+
+ linetab = db_elf_find_linetab(stab, &linetab_size);
if (linetab == NULL)
return (FALSE);
@@ -373,12 +400,16 @@ db_elf_line_at_pc(db_symtab_t *symtab, d
}
void
-db_elf_sym_forall(db_symtab_t *stab, db_forall_func_t db_forall_func, void
*arg)
+db_elf_sym_forall(db_forall_func_t db_forall_func, void *arg)
{
+ db_symtab_t *stab = &db_symtab;
char *strtab;
static char suffix[2];
Elf_Sym *symp, *symtab_start, *symtab_end;
+ if (stab->private == NULL)
+ return;
+
symtab_start = STAB_TO_SYMSTART(stab);
symtab_end = STAB_TO_SYMEND(stab);
@@ -405,8 +436,7 @@ db_elf_sym_forall(db_symtab_t *stab, db_
default:
suffix[0] = '\0';
}
- (*db_forall_func)(stab, (db_sym_t)symp,
+ (*db_forall_func)((db_sym_t)symp,
strtab + symp->st_name, suffix, 0, arg);
}
- return;
}
Index: ddb/db_hangman.c
===================================================================
RCS file: /cvs/src/sys/ddb/db_hangman.c,v
retrieving revision 1.34
diff -u -p -r1.34 db_hangman.c
--- ddb/db_hangman.c 26 Feb 2016 15:27:53 -0000 1.34
+++ ddb/db_hangman.c 26 Feb 2016 15:28:21 -0000
@@ -72,12 +72,10 @@ struct db_hang_forall_arg {
/*
* Horrible abuse of the forall function, but we're not in a hurry.
*/
-static void db_hang_forall(db_symtab_t *, db_sym_t, char *, char *, int,
- void *);
+static void db_hang_forall(db_sym_t, char *, char *, int, void *);
static void
-db_hang_forall(db_symtab_t *stab, db_sym_t sym, char *name, char *suff, int
pre,
- void *varg)
+db_hang_forall(db_sym_t sym, char *name, char *suff, int pre, void *varg)
{
struct db_hang_forall_arg *arg = (struct db_hang_forall_arg *)varg;
@@ -88,30 +86,21 @@ db_hang_forall(db_symtab_t *stab, db_sym
static __inline char *
db_randomsym(size_t *lenp)
{
- extern db_symtab_t db_symtab;
- db_symtab_t *stab = &db_symtab;
int nsyms;
char *p, *q;
struct db_hang_forall_arg dfa;
- if (stab->start == 0)
- return (NULL);
-
dfa.cnt = 0;
- db_elf_sym_forall(stab, db_hang_forall, &dfa);
+ db_elf_sym_forall(db_hang_forall, &dfa);
nsyms = -dfa.cnt;
if (nsyms == 0)
return (NULL);
dfa.cnt = arc4random_uniform(nsyms);
- db_elf_sym_forall(stab, db_hang_forall, &dfa);
-
- q = db_qualify(dfa.sym, stab->name);
+ db_elf_sym_forall(db_hang_forall, &dfa);
- /* don't show symtab name */
- while (*q++ != ':')
- ;
+ db_symbol_values(dfa.sym, &q, 0);
/* strlen(q) && ignoring underscores and colons */
for ((*lenp) = 0, p = q; *p; p++)
Index: ddb/db_sym.c
===================================================================
RCS file: /cvs/src/sys/ddb/db_sym.c,v
retrieving revision 1.45
diff -u -p -r1.45 db_sym.c
--- ddb/db_sym.c 26 Feb 2016 15:27:53 -0000 1.45
+++ ddb/db_sym.c 26 Feb 2016 15:28:21 -0000
@@ -48,8 +48,6 @@
#define MAXNOSYMTABS MAXLKMS+1 /* Room for kernel + LKM's */
#endif
-db_symtab_t db_symtab;
-
extern char end[];
/*
@@ -94,56 +92,6 @@ ddb_init(void)
printf("[ no symbol table formats found ]\n");
}
-/*
- * Add symbol table, with given name, to list of symbol tables.
- */
-int
-db_add_symbol_table(char *start, char *end, const char *name, char *ref)
-{
- db_symtab.start = start;
- db_symtab.end = end;
- db_symtab.name = name;
- db_symtab.private = ref;
-
- return 0;
-}
-
-/*
- * Delete a symbol table. Caller is responsible for freeing storage.
- */
-void
-db_del_symbol_table(char *name)
-{
- db_symtab.start = 0;
- db_symtab.end = 0;
- db_symtab.name = 0;
- db_symtab.private = 0;
-}
-
-/*
- * db_qualify("vm_map", "bsd") returns "bsd:vm_map".
- *
- * Note: return value points to static data whose content is
- * overwritten by each call... but in practice this seems okay.
- */
-char *
-db_qualify(db_sym_t sym, const char *symtabname)
-{
- char *symname;
- static char tmp[256];
- char *s;
-
- db_symbol_values(sym, &symname, 0);
- s = tmp;
- while ((*s++ = *symtabname++) != '\0')
- ;
- s[-1] = ':';
- while ((*s++ = *symname++) != '\0')
- ;
- return tmp;
-}
-
-
boolean_t
db_eqname(char *src, char *dst, int c)
{
@@ -173,7 +121,7 @@ db_value_of_name(char *name, db_expr_t *
db_sym_t
db_lookup(char *symstr)
{
- return db_elf_sym_lookup(&db_symtab, symstr);
+ return db_elf_sym_lookup(symstr);
}
/*
@@ -188,7 +136,7 @@ db_search_symbol(db_addr_t val, db_strat
db_sym_t ret = DB_SYM_NULL, sym;
newdiff = diff = ~0;
- sym = db_elf_sym_search(&db_symtab, val, strategy, &newdiff);
+ sym = db_elf_sym_search(val, strategy, &newdiff);
if (newdiff < diff) {
diff = newdiff;
ret = sym;
@@ -210,7 +158,7 @@ db_symbol_values(db_sym_t sym, char **na
return;
}
- db_elf_sym_values(&db_symtab, sym, namep, &value);
+ db_elf_sym_values(sym, namep, &value);
if (valuep)
*valuep = value;
@@ -261,8 +209,8 @@ db_printsym(db_expr_t off, db_strategy_t
d, DB_FORMAT_R, 1, 0));
}
if (strategy != DB_STGY_PROC) {
- if (db_elf_line_at_pc(&db_symtab, cursym,
- &filename, &linenum, off))
+ if (db_elf_line_at_pc(cursym, &filename,
+ &linenum, off))
(*pr)(" [%s:%d]", filename, linenum);
}
return;
Index: ddb/db_sym.h
===================================================================
RCS file: /cvs/src/sys/ddb/db_sym.h,v
retrieving revision 1.21
diff -u -p -r1.21 db_sym.h
--- ddb/db_sym.h 12 Feb 2016 10:58:41 -0000 1.21
+++ ddb/db_sym.h 26 Feb 2016 15:28:21 -0000
@@ -30,18 +30,6 @@
*/
/*
- * This module can handle multiple symbol tables
- */
-typedef struct {
- const char *name; /* symtab name */
- char *start; /* symtab location */
- char *end;
- char *private; /* optional machdep pointer */
-} db_symtab_t;
-
-extern db_symtab_t *db_last_symtab; /* where last symbol was found */
-
-/*
* Symbol representation is specific to the symtab style:
* BSD compilers use dbx' nlist, other compilers might use
* a different one
@@ -72,17 +60,9 @@ typedef int db_strategy_t; /* search st
* the type, prefix an initial ignorable function prefix (e.g. "_"
* in a.out), and arg an opaque argument to be passed in.
*/
-typedef void (db_forall_func_t)(db_symtab_t *, db_sym_t, char *, char *, int,
void *);
+typedef void (db_forall_func_t)(db_sym_t, char *, char *, int, void *);
extern unsigned int db_maxoff; /* like gdb's "max-symbolic-offset" */
-/*
- * Functions exported by the symtable module
- */
-int db_add_symbol_table(char *, char *, const char *, char *);
- /* extend the list of symbol tables */
-
-void db_del_symbol_table(char *);
- /* remove a symbol table from list */
boolean_t db_eqname(char *, char *, int);
/* strcmp, modulo leading char */
@@ -111,11 +91,9 @@ void db_printsym(db_expr_t, db_strategy_
#define db_sym_numargs(sym, nargp, argnames) (FALSE)
-char *db_qualify(db_sym_t, const char *);
-
boolean_t db_elf_sym_init(int, void *, void *, const char *);
-db_sym_t db_elf_sym_lookup(db_symtab_t *, char *);
-void db_elf_sym_values(db_symtab_t *, db_sym_t, char **, db_expr_t *);
-db_sym_t db_elf_sym_search(db_symtab_t *, db_addr_t, db_strategy_t, db_expr_t
*);
-boolean_t db_elf_line_at_pc(db_symtab_t *, db_sym_t, char **, int *,
db_expr_t);
-void db_elf_sym_forall(db_symtab_t *, db_forall_func_t db_forall_func, void *);
+db_sym_t db_elf_sym_lookup(char *);
+void db_elf_sym_values(db_sym_t, char **, db_expr_t *);
+db_sym_t db_elf_sym_search(db_addr_t, db_strategy_t, db_expr_t *);
+boolean_t db_elf_line_at_pc(db_sym_t, char **, int *, db_expr_t);
+void db_elf_sym_forall(db_forall_func_t db_forall_func, void *);