From 4cc81497afe989623dca1b45f3ae950dffb92021 Mon Sep 17 00:00:00 2001
From: Daniel Beer <daniel@tortek.co.nz>
Date: Fri, 13 Aug 2010 12:12:50 +1200
Subject: [PATCH] Create default stab to avoid carrying around stab_t.

---
 cproc.c      | 17 ++++-------------
 cproc.h      |  4 +---
 cproc_util.c | 19 +++++++++----------
 devcmd.c     | 32 ++++++++++++--------------------
 main.c       | 33 +++++++++++++--------------------
 rtools.c     | 34 +++++++++++++++++-----------------
 stab.c       |  2 ++
 stab.h       |  2 ++
 sym.c        | 42 +++++++++++++++++-------------------------
 9 files changed, 77 insertions(+), 108 deletions(-)

diff --git a/cproc.c b/cproc.c
index 946e95a..561bfeb 100644
--- a/cproc.c
+++ b/cproc.c
@@ -43,7 +43,6 @@ struct cproc {
 	int                     in_reader_loop;
 
 	device_t                device;
-	stab_t                  stab;
 };
 
 static struct cproc_option *find_option(cproc_t cp, const char *name)
@@ -199,8 +198,7 @@ static int cmd_help(cproc_t cp, char **arg)
 	return 0;
 }
 
-static int parse_option(stab_t stab,
-			struct cproc_option *o, const char *word)
+static int parse_option(struct cproc_option *o, const char *word)
 {
 	switch (o->type) {
 	case CPROC_OPTION_BOOL:
@@ -210,7 +208,7 @@ static int parse_option(stab_t stab,
 		break;
 
 	case CPROC_OPTION_NUMERIC:
-		return expr_eval(stab, word, &o->data.numeric);
+		return expr_eval(stab_default, word, &o->data.numeric);
 
 	case CPROC_OPTION_STRING:
 		strncpy(o->data.text, word, sizeof(o->data.text));
@@ -260,7 +258,7 @@ static int cmd_opt(cproc_t cp, char **arg)
 	}
 
 	if (**arg) {
-		if (parse_option(cp->stab, opt, *arg) < 0) {
+		if (parse_option(opt, *arg) < 0) {
 			fprintf(stderr, "opt: can't parse option: %s\n",
 				*arg);
 			return -1;
@@ -324,7 +322,7 @@ static const struct cproc_option built_in_options[] = {
 	}
 };
 
-cproc_t cproc_new(device_t dev, stab_t st)
+cproc_t cproc_new(device_t dev)
 {
 	cproc_t cp = malloc(sizeof(*cp));
 
@@ -334,7 +332,6 @@ cproc_t cproc_new(device_t dev, stab_t st)
 	memset(cp, 0, sizeof(*cp));
 
 	cp->device = dev;
-	cp->stab = st;
 
 	vector_init(&cp->command_list, sizeof(struct cproc_command));
 	vector_init(&cp->option_list, sizeof(struct cproc_option));
@@ -357,7 +354,6 @@ void cproc_destroy(cproc_t cp)
 	cp->device->destroy(cp->device);
 	vector_destroy(&cp->command_list);
 	vector_destroy(&cp->option_list);
-	stab_destroy(cp->stab);
 	free(cp);
 }
 
@@ -366,11 +362,6 @@ device_t cproc_device(cproc_t cp)
 	return cp->device;
 }
 
-stab_t cproc_stab(cproc_t cp)
-{
-	return cp->stab;
-}
-
 int cproc_register_commands(cproc_t cp, const struct cproc_command *cmd,
 			    int count)
 {
diff --git a/cproc.h b/cproc.h
index 7623974..7bff3f7 100644
--- a/cproc.h
+++ b/cproc.h
@@ -20,7 +20,6 @@
 #define CPROC_H_
 
 #include "device.h"
-#include "stab.h"
 
 /* Command processor.
  *
@@ -90,12 +89,11 @@ struct cproc_option {
  * has been given. When you destroy a command processor, the device is
  * also destroyed.
  */
-cproc_t cproc_new(device_t dev, stab_t st);
+cproc_t cproc_new(device_t dev);
 void cproc_destroy(cproc_t cp);
 
 /* Fetch the command processor's device and symbol table */
 device_t cproc_device(cproc_t cp);
-stab_t cproc_stab(cproc_t cp);
 
 /* Register commands and options with the command processor. These functions
  * return 0 on success or -1 if an error occurs (failure to allocate memory).
diff --git a/cproc_util.c b/cproc_util.c
index 3f9fb44..f929832 100644
--- a/cproc_util.c
+++ b/cproc_util.c
@@ -24,7 +24,7 @@
 #include "stab.h"
 #include "util.h"
 
-static int format_addr(stab_t stab, char *buf, int max_len,
+static int format_addr(char *buf, int max_len,
 		       msp430_amode_t amode, uint16_t addr)
 {
 	char name[64];
@@ -54,7 +54,7 @@ static int format_addr(stab_t stab, char *buf, int max_len,
 
 	if ((!numeric ||
 	     (addr >= 0x200 && addr < 0xfff0)) &&
-	    !stab_nearest(stab, addr, name, sizeof(name), &offset) &&
+	    !stab_nearest(stab_default, addr, name, sizeof(name), &offset) &&
 	    !offset)
 		return snprintf(buf, max_len,
 				"%s\x1b[1m%s\x1b[0m", prefix, name);
@@ -108,19 +108,19 @@ static int format_reg(char *buf, int max_len,
  *
  * Returns the number of characters printed.
  */
-static int format_operand(stab_t stab, char *buf, int max_len,
+static int format_operand(char *buf, int max_len,
 			  msp430_amode_t amode, uint16_t addr,
 			  msp430_reg_t reg)
 {
 	int len = 0;
 
-	len += format_addr(stab, buf, max_len, amode, addr);
+	len += format_addr(buf, max_len, amode, addr);
 	len += format_reg(buf + len, max_len - len, amode, reg);
 	return len;
 }
 
 /* Write assembly language for the instruction to this buffer */
-static int dis_format(stab_t stab, char *buf, int max_len,
+static int dis_format(char *buf, int max_len,
 		      const struct msp430_instruction *insn)
 {
 	int len;
@@ -157,7 +157,7 @@ static int dis_format(stab_t stab, char *buf, int max_len,
 
 	/* Source operand */
 	if (insn->itype == MSP430_ITYPE_DOUBLE) {
-		len = format_operand(stab, buf + total,
+		len = format_operand(buf + total,
 				     max_len - total,
 				     insn->src_mode,
 				     insn->src_addr,
@@ -179,7 +179,7 @@ static int dis_format(stab_t stab, char *buf, int max_len,
 
 	/* Destination operand */
 	if (insn->itype != MSP430_ITYPE_NOARG)
-		total += format_operand(stab, buf + total,
+		total += format_operand(buf + total,
 					max_len - total,
 					insn->dst_mode,
 					insn->dst_addr,
@@ -207,7 +207,6 @@ static int dis_format(stab_t stab, char *buf, int max_len,
 void cproc_disassemble(cproc_t cp,
 		       address_t offset, const uint8_t *data, int length)
 {
-	stab_t stab = cproc_stab(cp);
 	int first_line = 1;
 
 	while (length) {
@@ -220,7 +219,7 @@ void cproc_disassemble(cproc_t cp,
 		char buf[256];
 		int len = 0;
 
-		if (!stab_nearest(stab, offset, obname, sizeof(obname),
+		if (!stab_nearest(stab_default, offset, obname, sizeof(obname),
 				  &oboff)) {
 			if (!oboff)
 				cproc_printf(cp, "\x1b[m%s:\x1b[0m", obname);
@@ -250,7 +249,7 @@ void cproc_disassemble(cproc_t cp,
 		}
 
 		if (retval >= 0)
-			len += dis_format(stab, buf + len, sizeof(buf) - len,
+			len += dis_format(buf + len, sizeof(buf) - len,
 					  &insn);
 
 		buf[len] = 0;
diff --git a/devcmd.c b/devcmd.c
index b2f1197..07d38f3 100644
--- a/devcmd.c
+++ b/devcmd.c
@@ -54,7 +54,6 @@ static int cmd_regs(cproc_t cp, char **arg)
 
 static int cmd_md(cproc_t cp, char **arg)
 {
-	stab_t stab = cproc_stab(cp);
 	device_t dev = cproc_device(cp);
 	char *off_text = get_arg(arg);
 	char *len_text = get_arg(arg);
@@ -66,13 +65,13 @@ static int cmd_md(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (expr_eval(stab, off_text, &offset) < 0) {
+	if (expr_eval(stab_default, off_text, &offset) < 0) {
 		fprintf(stderr, "md: can't parse offset: %s\n", off_text);
 		return -1;
 	}
 
 	if (len_text) {
-		if (expr_eval(stab, len_text, &length) < 0) {
+		if (expr_eval(stab_default, len_text, &length) < 0) {
 			fprintf(stderr, "md: can't parse length: %s\n",
 				len_text);
 			return -1;
@@ -99,7 +98,6 @@ static int cmd_md(cproc_t cp, char **arg)
 static int cmd_mw(cproc_t cp, char **arg)
 {
 	device_t dev = cproc_device(cp);
-	stab_t stab = cproc_stab(cp);
 	char *off_text = get_arg(arg);
 	char *byte_text;
 	address_t offset = 0;
@@ -111,7 +109,7 @@ static int cmd_mw(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (expr_eval(stab, off_text, &offset) < 0) {
+	if (expr_eval(stab_default, off_text, &offset) < 0) {
 		fprintf(stderr, "md: can't parse offset: %s\n", off_text);
 		return -1;
 	}
@@ -222,7 +220,6 @@ static int cmd_run(cproc_t cp, char **arg)
 static int cmd_set(cproc_t cp, char **arg)
 {
 	device_t dev = cproc_device(cp);
-	stab_t stab = cproc_stab(cp);
 	char *reg_text = get_arg(arg);
 	char *val_text = get_arg(arg);
 	int reg;
@@ -240,7 +237,7 @@ static int cmd_set(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (expr_eval(stab, val_text, &value) < 0) {
+	if (expr_eval(stab_default, val_text, &value) < 0) {
 		fprintf(stderr, "set: can't parse value: %s\n", val_text);
 		return -1;
 	}
@@ -258,7 +255,6 @@ static int cmd_set(cproc_t cp, char **arg)
 static int cmd_dis(cproc_t cp, char **arg)
 {
 	device_t dev = cproc_device(cp);
-	stab_t stab = cproc_stab(cp);
 	char *off_text = get_arg(arg);
 	char *len_text = get_arg(arg);
 	address_t offset = 0;
@@ -270,13 +266,13 @@ static int cmd_dis(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (expr_eval(stab, off_text, &offset) < 0) {
+	if (expr_eval(stab_default, off_text, &offset) < 0) {
 		fprintf(stderr, "dis: can't parse offset: %s\n", off_text);
 		return -1;
 	}
 
 	if (len_text) {
-		if (expr_eval(stab, len_text, &length) < 0) {
+		if (expr_eval(stab_default, len_text, &length) < 0) {
 			fprintf(stderr, "dis: can't parse length: %s\n",
 				len_text);
 			return -1;
@@ -408,7 +404,6 @@ static int hexout_feed(struct hexout_data *hexout,
 static int cmd_hexout(cproc_t cp, char **arg)
 {
 	device_t dev = cproc_device(cp);
-	stab_t stab = cproc_stab(cp);
 	char *off_text = get_arg(arg);
 	char *len_text = get_arg(arg);
 	char *filename = *arg;
@@ -421,8 +416,8 @@ static int cmd_hexout(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (expr_eval(stab, off_text, &off) < 0 ||
-	    expr_eval(stab, len_text, &length) < 0)
+	if (expr_eval(stab_default, off_text, &off) < 0 ||
+	    expr_eval(stab_default, len_text, &length) < 0)
 		return -1;
 
 	if (hexout_start(&hexout, filename) < 0)
@@ -547,7 +542,6 @@ static int prog_feed(void *user_data,
 static int cmd_prog(cproc_t cp, char **arg)
 {
 	device_t dev = cproc_device(cp);
-	stab_t stab = cproc_stab(cp);
 	FILE *in;
 	struct prog_data prog;
 
@@ -573,8 +567,8 @@ static int cmd_prog(cproc_t cp, char **arg)
 	}
 
 	if (binfile_info(in) & BINFILE_HAS_SYMS) {
-		stab_clear(stab);
-		binfile_syms(in, stab);
+		stab_clear(stab_default);
+		binfile_syms(in, stab_default);
 	}
 
 	fclose(in);
@@ -594,7 +588,6 @@ static int cmd_prog(cproc_t cp, char **arg)
 static int cmd_setbreak(cproc_t cp, char **arg)
 {
 	device_t dev = cproc_device(cp);
-	stab_t stab = cproc_stab(cp);
 	char *addr_text = get_arg(arg);
 	char *index_text = get_arg(arg);
 	int index = -1;
@@ -605,7 +598,7 @@ static int cmd_setbreak(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (expr_eval(stab, addr_text, &addr) < 0) {
+	if (expr_eval(stab_default, addr_text, &addr) < 0) {
 		fprintf(stderr, "setbreak: invalid address\n");
 		return -1;
 	}
@@ -662,7 +655,6 @@ static int cmd_delbreak(cproc_t cp, char **arg)
 static int cmd_break(cproc_t cp, char **arg)
 {
 	device_t dev = cproc_device(cp);
-	stab_t stab = cproc_stab(cp);
 	int i;
 
 	printf("%d breakpoints available:\n", dev->max_breakpoints);
@@ -674,7 +666,7 @@ static int cmd_break(cproc_t cp, char **arg)
 			address_t offset;
 
 			printf("    %d. 0x%05x", i, bp->addr);
-			if (!stab_nearest(stab, bp->addr, name,
+			if (!stab_nearest(stab_default, bp->addr, name,
 					  sizeof(name), &offset)) {
 				printf(" (%s", name);
 				if (offset)
diff --git a/main.c b/main.c
index e965674..dc36d14 100644
--- a/main.c
+++ b/main.c
@@ -46,14 +46,13 @@
 #include "olimex.h"
 #include "rf2500.h"
 
-static void io_prefix(stab_t stab,
-		      const char *prefix, uint16_t pc,
+static void io_prefix(const char *prefix, uint16_t pc,
 		      uint16_t addr, int is_byte)
 {
 	char name[64];
 	address_t offset;
 
-	if (!stab_nearest(stab, pc, name, sizeof(name), &offset)) {
+	if (!stab_nearest(stab_default, pc, name, sizeof(name), &offset)) {
 		printf("%s", name);
 		if (offset)
 			printf("+0x%x", offset);
@@ -62,7 +61,7 @@ static void io_prefix(stab_t stab,
 	}
 
 	printf(": IO %s.%c: 0x%04x", prefix, is_byte ? 'B' : 'W', addr);
-	if (!stab_nearest(stab, addr, name, sizeof(name), &offset)) {
+	if (!stab_nearest(stab_default, addr, name, sizeof(name), &offset)) {
 		printf(" (%s", name);
 		if (offset)
 			printf("+0x%x", offset);
@@ -73,9 +72,7 @@ static void io_prefix(stab_t stab,
 static int fetch_io(void *user_data, uint16_t pc,
 		    uint16_t addr, int is_byte, uint16_t *data_ret)
 {
-	stab_t stab = (stab_t)user_data;
-
-	io_prefix(stab, "READ", pc, addr, is_byte);
+	io_prefix("READ", pc, addr, is_byte);
 
 	for (;;) {
 		char text[128];
@@ -97,7 +94,7 @@ static int fetch_io(void *user_data, uint16_t pc,
 		if (!len)
 			return 0;
 
-		if (!expr_eval(stab, text, &data)) {
+		if (!expr_eval(stab_default, text, &data)) {
 			if (data_ret)
 				*data_ret = data;
 			return 0;
@@ -110,9 +107,7 @@ static int fetch_io(void *user_data, uint16_t pc,
 static void store_io(void *user_data, uint16_t pc,
 		     uint16_t addr, int is_byte, uint16_t data)
 {
-	stab_t stab = (stab_t)user_data;
-
-	io_prefix(stab, "WRITE", pc, addr, is_byte);
+	io_prefix("WRITE", pc, addr, is_byte);
 
 	if (is_byte)
 		printf(" => 0x%02x\n", data & 0xff);
@@ -128,7 +123,6 @@ struct cmdline_args {
 	int             want_jtag;
 	int             no_rc;
 	int             vcc_mv;
-	stab_t          stab;
 };
 
 struct driver {
@@ -187,7 +181,7 @@ static device_t driver_open_olimex(const struct cmdline_args *args)
 
 static device_t driver_open_sim(const struct cmdline_args *args)
 {
-	return sim_open(fetch_io, store_io, args->stab);
+	return sim_open(fetch_io, store_io, NULL);
 }
 
 static device_t driver_open_uif(const struct cmdline_args *args)
@@ -414,7 +408,6 @@ cproc_t setup_cproc(struct cmdline_args *args)
 {
 	int i;
 	device_t msp430_dev;
-	stab_t stab;
 	cproc_t cp;
 
 	i = 0;
@@ -427,21 +420,20 @@ cproc_t setup_cproc(struct cmdline_args *args)
 		return NULL;
 	}
 
-	stab = stab_new();
-	if (!stab)
+	stab_default = stab_new();
+	if (!stab_default)
 		return NULL;
-	args->stab = stab;
 
 	msp430_dev = driver_table[i].func(args);
 	if (!msp430_dev) {
-		stab_destroy(stab);
+		stab_destroy(stab_default);
 		return NULL;
 	}
 
-	cp = cproc_new(msp430_dev, stab);
+	cp = cproc_new(msp430_dev);
 	if (!cp) {
 		msp430_dev->destroy(msp430_dev);
-		stab_destroy(stab);
+		stab_destroy(stab_default);
 		return NULL;
 	}
 
@@ -495,6 +487,7 @@ int main(int argc, char **argv)
 	}
 
 	cproc_destroy(cp);
+	stab_destroy(stab_default);
 
 	return ret;
 }
diff --git a/rtools.c b/rtools.c
index e42f876..dc0580e 100644
--- a/rtools.c
+++ b/rtools.c
@@ -154,7 +154,7 @@ static int isearch_addr(cproc_t cp, const char *term, char **arg,
 		return -1;
 	}
 
-	if (expr_eval(cproc_stab(cp), addr_text, &addr) < 0)
+	if (expr_eval(stab_default, addr_text, &addr) < 0)
 		return -1;
 
 	q->flags |= which;
@@ -397,7 +397,6 @@ static int cmd_isearch(cproc_t cp, char **arg)
 		{"dstmode",     isearch_mode}
 	};
 
-	stab_t stab = cproc_stab(cp);
 	struct isearch_query q;
 	const char *addr_text;
 	const char *len_text;
@@ -412,8 +411,8 @@ static int cmd_isearch(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (expr_eval(stab, addr_text, &addr) < 0 ||
-	    expr_eval(stab, len_text, &len) < 0)
+	if (expr_eval(stab_default, addr_text, &addr) < 0 ||
+	    expr_eval(stab_default, len_text, &len) < 0)
 		return -1;
 
 	q.flags = 0;
@@ -745,7 +744,7 @@ static int add_symbol_nodes(void *user_data, const char *name,
 }
 
 static int cgraph_init(address_t offset, address_t len, uint8_t *memory,
-		       struct call_graph *graph, stab_t stab)
+		       struct call_graph *graph)
 {
 	vector_init(&graph->edge_to, sizeof(struct cg_edge));
 	vector_init(&graph->edge_from, sizeof(struct cg_edge));
@@ -759,7 +758,7 @@ static int cgraph_init(address_t offset, address_t len, uint8_t *memory,
 	if (add_irq_edges(offset, len, memory, graph) < 0)
 		goto fail;
 
-	if (stab_enum(stab, add_symbol_nodes, graph) < 0)
+	if (stab_enum(stab_default, add_symbol_nodes, graph) < 0)
 		goto fail;
 	if (add_nodes_from_edges(graph) < 0)
 		goto fail;
@@ -780,7 +779,6 @@ static int cgraph_init(address_t offset, address_t len, uint8_t *memory,
 
 static void cgraph_summary(struct call_graph *graph, cproc_t cp)
 {
-	stab_t stab = cproc_stab(cp);
 	int i;
 	int j = 0; /* Edge from index */
 	int k = 0; /* Edge to index */
@@ -812,7 +810,8 @@ static void cgraph_summary(struct call_graph *graph, cproc_t cp)
 			k++;
 		}
 
-		if (stab_nearest(stab, n->offset, name, sizeof(name), &o) ||
+		if (stab_nearest(stab_default, n->offset,
+				 name, sizeof(name), &o) ||
 		    o)
 			name[0] = 0;
 
@@ -824,7 +823,6 @@ static void cgraph_summary(struct call_graph *graph, cproc_t cp)
 static void cgraph_func_info(struct call_graph *graph, cproc_t cp,
 			     int addr)
 {
-	stab_t stab = cproc_stab(cp);
 	int i = 0;
 	int j = 0;
 	int k = 0;
@@ -851,7 +849,8 @@ static void cgraph_func_info(struct call_graph *graph, cproc_t cp,
 	       CG_EDGE_TO(graph, k)->dst < n->offset)
 		k++;
 
-	if (stab_nearest(stab, n->offset, name, sizeof(name), &offset))
+	if (stab_nearest(stab_default, n->offset,
+			 name, sizeof(name), &offset))
 		printf("0x%04x:\n", n->offset);
 	else if (offset)
 		printf("0x%04x %s+0x%x:\n", n->offset, name, offset);
@@ -867,7 +866,8 @@ static void cgraph_func_info(struct call_graph *graph, cproc_t cp,
 			if (e->src != n->offset)
 				break;
 
-			if (stab_nearest(stab, e->dst, name, sizeof(name),
+			if (stab_nearest(stab_default, e->dst,
+					 name, sizeof(name),
 					 &offset) ||
 			    offset)
 				snprintf(name, sizeof(name), "0x%04x", e->dst);
@@ -888,7 +888,8 @@ static void cgraph_func_info(struct call_graph *graph, cproc_t cp,
 			if (e->dst != n->offset)
 				break;
 
-			if (stab_nearest(stab, e->src, name, sizeof(name),
+			if (stab_nearest(stab_default, e->src,
+					 name, sizeof(name),
 					 &offset) ||
 			    offset)
 				snprintf(name, sizeof(name), "0x%04x", e->src);
@@ -902,7 +903,6 @@ static void cgraph_func_info(struct call_graph *graph, cproc_t cp,
 
 static int cmd_cgraph(cproc_t cp, char **arg)
 {
-	stab_t stab = cproc_stab(cp);
 	device_t dev = cproc_device(cp);
 	char *offset_text, *len_text, *addr_text;;
 	address_t offset, len, addr;
@@ -920,19 +920,19 @@ static int cmd_cgraph(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (expr_eval(stab, offset_text, &offset) < 0) {
+	if (expr_eval(stab_default, offset_text, &offset) < 0) {
 		fprintf(stderr, "cgraph: invalid offset: %s\n", offset_text);
 		return -1;
 	}
 	offset &= ~1;
 
-	if (expr_eval(stab, len_text, &len) < 0) {
+	if (expr_eval(stab_default, len_text, &len) < 0) {
 		fprintf(stderr, "cgraph: invalid length: %s\n", len_text);
 		return -1;
 	}
 	len &= ~1;
 
-	if (addr_text && expr_eval(stab, addr_text, &addr) < 0) {
+	if (addr_text && expr_eval(stab_default, addr_text, &addr) < 0) {
 		fprintf(stderr, "cgraph: invalid address: %s\n", addr_text);
 		return -1;
 	}
@@ -952,7 +952,7 @@ static int cmd_cgraph(cproc_t cp, char **arg)
 	}
 
 	/* Produce and display the call graph */
-	if (cgraph_init(offset, len, memory, &graph, cproc_stab(cp)) < 0) {
+	if (cgraph_init(offset, len, memory, &graph) < 0) {
 		fprintf(stderr, "cgraph: couldn't build call graph\n");
 		free(memory);
 		return -1;
diff --git a/stab.c b/stab.c
index f526856..d9113b8 100644
--- a/stab.c
+++ b/stab.c
@@ -28,6 +28,8 @@
 #include "stab.h"
 #include "util.h"
 
+stab_t stab_default;
+
 /************************************************************************
  * B+Tree definitions
  */
diff --git a/stab.h b/stab.h
index d7824e6..e1c018d 100644
--- a/stab.h
+++ b/stab.h
@@ -25,6 +25,8 @@
 struct stab;
 typedef struct stab *stab_t;
 
+extern stab_t stab_default;
+
 /* Create/destroy a symbol table. The constructor returns NULL if it
  * was unable to allocate memory for the table.
  */
diff --git a/sym.c b/sym.c
index 6d38720..dad0092 100644
--- a/sym.c
+++ b/sym.c
@@ -32,18 +32,17 @@
 
 static int cmd_eval(cproc_t cp, char **arg)
 {
-	stab_t stab = cproc_stab(cp);
 	address_t addr;
 	address_t offset;
 	char name[64];
 
-	if (expr_eval(stab, *arg, &addr) < 0) {
+	if (expr_eval(stab_default, *arg, &addr) < 0) {
 		fprintf(stderr, "=: can't parse: %s\n", *arg);
 		return -1;
 	}
 
 	printf("0x%05x", addr);
-	if (!stab_nearest(stab, addr, name, sizeof(name), &offset)) {
+	if (!stab_nearest(stab_default, addr, name, sizeof(name), &offset)) {
 		printf(" = %s", name);
 		if (offset)
 			printf("+0x%x", offset);
@@ -55,7 +54,6 @@ static int cmd_eval(cproc_t cp, char **arg)
 
 static int cmd_sym_load_add(cproc_t cp, int clear, char **arg)
 {
-	stab_t stab = cproc_stab(cp);
 	FILE *in;
 
 	if (clear && cproc_prompt_abort(cp, CPROC_MODIFY_SYMS))
@@ -68,13 +66,13 @@ static int cmd_sym_load_add(cproc_t cp, int clear, char **arg)
 	}
 
 	if (clear) {
-		stab_clear(stab);
+		stab_clear(stab_default);
 		cproc_unmodify(cp, CPROC_MODIFY_SYMS);
 	} else {
 		cproc_modify(cp, CPROC_MODIFY_SYMS);
 	}
 
-	if (binfile_syms(in, stab) < 0) {
+	if (binfile_syms(in, stab_default) < 0) {
 		fclose(in);
 		return -1;
 	}
@@ -97,7 +95,6 @@ static int savemap_cb(void *user_data, const char *name, address_t value)
 
 static int cmd_sym_savemap(cproc_t cp, char **arg)
 {
-	stab_t stab = cproc_stab(cp);
 	FILE *savemap_out;
 	char *fname = get_arg(arg);
 
@@ -113,7 +110,7 @@ static int cmd_sym_savemap(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (stab_enum(stab, savemap_cb, savemap_out) < 0) {
+	if (stab_enum(stab_default, savemap_cb, savemap_out) < 0) {
 		fclose(savemap_out);
 		return -1;
 	}
@@ -145,12 +142,11 @@ static int find_sym(void *user_data, const char *name, address_t value)
 
 static int cmd_sym_find(cproc_t cp, char **arg)
 {
-	stab_t stab = cproc_stab(cp);
 	regex_t find_preg;
 	char *expr = get_arg(arg);
 
 	if (!expr) {
-		stab_enum(stab, print_sym, NULL);
+		stab_enum(stab_default, print_sym, NULL);
 		return 0;
 	}
 
@@ -159,7 +155,7 @@ static int cmd_sym_find(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	stab_enum(stab, find_sym, &find_preg);
+	stab_enum(stab_default, find_sym, &find_preg);
 	regfree(&find_preg);
 	return 0;
 }
@@ -174,8 +170,7 @@ struct rename_data {
 	regex_t         preg;
 };
 
-static int renames_do(stab_t stab,
-		      struct rename_data *rename, const char *replace)
+static int renames_do(struct rename_data *rename, const char *replace)
 {
 	int i;
 	int count = 0;
@@ -197,13 +192,13 @@ static int renames_do(stab_t stab,
 
 		printf("%s -> %s\n", r->old_name, new_name);
 
-		if (stab_get(stab, r->old_name, &value) < 0) {
+		if (stab_get(stab_default, r->old_name, &value) < 0) {
 			fprintf(stderr, "sym: warning: "
 				"symbol missing: %s\n",
 				r->old_name);
 		} else {
-			stab_del(stab, r->old_name);
-			if (stab_set(stab, new_name, value) < 0) {
+			stab_del(stab_default, r->old_name);
+			if (stab_set(stab_default, new_name, value) < 0) {
 				fprintf(stderr, "sym: warning: "
 					"failed to set new name: %s\n",
 					new_name);
@@ -243,7 +238,6 @@ static int cmd_sym_rename(cproc_t cp, char **arg)
 	const char *replace = get_arg(arg);
 	int ret;
 	struct rename_data rename;
-	stab_t stab = cproc_stab(cp);
 
 	if (!(expr && replace)) {
 		fprintf(stderr, "sym: expected pattern and replacement\n");
@@ -257,7 +251,7 @@ static int cmd_sym_rename(cproc_t cp, char **arg)
 
 	vector_init(&rename.list, sizeof(struct rename_record));
 
-	if (stab_enum(stab, find_renames, &rename) < 0) {
+	if (stab_enum(stab_default, find_renames, &rename) < 0) {
 		fprintf(stderr, "sym: rename failed\n");
 		regfree(&rename.preg);
 		vector_destroy(&rename.list);
@@ -265,7 +259,7 @@ static int cmd_sym_rename(cproc_t cp, char **arg)
 	}
 
 	regfree(&rename.preg);
-	ret = renames_do(stab, &rename, replace);
+	ret = renames_do(&rename, replace);
 	vector_destroy(&rename.list);
 
 	if (ret > 0)
@@ -276,7 +270,6 @@ static int cmd_sym_rename(cproc_t cp, char **arg)
 
 static int cmd_sym_del(cproc_t cp, char **arg)
 {
-	stab_t stab = cproc_stab(cp);
 	char *name = get_arg(arg);
 
 	if (!name) {
@@ -285,7 +278,7 @@ static int cmd_sym_del(cproc_t cp, char **arg)
 		return -1;
 	}
 
-	if (stab_del(stab, name) < 0) {
+	if (stab_del(stab_default, name) < 0) {
 		fprintf(stderr, "sym: can't delete nonexistent symbol: %s\n",
 			name);
 		return -1;
@@ -297,7 +290,6 @@ static int cmd_sym_del(cproc_t cp, char **arg)
 
 static int cmd_sym(cproc_t cp, char **arg)
 {
-	stab_t stab = cproc_stab(cp);
 	char *subcmd = get_arg(arg);
 
 	if (!subcmd) {
@@ -309,7 +301,7 @@ static int cmd_sym(cproc_t cp, char **arg)
 	if (!strcasecmp(subcmd, "clear")) {
 		if (cproc_prompt_abort(cp, CPROC_MODIFY_SYMS))
 			return 0;
-		stab_clear(stab);
+		stab_clear(stab_default);
 		cproc_unmodify(cp, CPROC_MODIFY_SYMS);
 		return 0;
 	}
@@ -325,13 +317,13 @@ static int cmd_sym(cproc_t cp, char **arg)
 			return -1;
 		}
 
-		if (expr_eval(stab, val_text, &value) < 0) {
+		if (expr_eval(stab_default, val_text, &value) < 0) {
 			fprintf(stderr, "sym: can't parse value: %s\n",
 				val_text);
 			return -1;
 		}
 
-		if (stab_set(stab, name, value) < 0)
+		if (stab_set(stab_default, name, value) < 0)
 			return -1;
 
 		cproc_modify(cp, CPROC_MODIFY_SYMS);