|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)sym.c 1.2 (Berkeley) 4/27/87";
3: #endif
4:
5: /*
6: * adb - symbol table routines
7: */
8: #include "defs.h"
9: #include <stab.h>
10:
11: /*
12: * Lookup a symbol by name.
13: */
14: struct nlist *
15: lookup(symstr)
16: char *symstr;
17: {
18: register struct nlist *sp;
19:
20: cursym = 0;
21: if (symtab)
22: for (sp = symtab; sp < esymtab; sp++)
23: /* SHOULD DO SOME OF EQSYM INLINE TO SAVE TIME */
24: if ((sp->n_type&N_STAB)==0 && eqsym(sp->n_un.n_name, symstr, '_'))
25: return(cursym = sp);
26: return (0);
27: }
28:
29: /*
30: * Find the closest symbol to val, and return
31: * the difference between val and the symbol found.
32: * Leave a pointer to the symbol found as cursym.
33: */
34: findsym(val, type)
35: register val;
36: int type;
37: {
38: register diff;
39: register struct nlist *sp;
40:
41: cursym = 0;
42: diff = MAXINT;
43: if (type == NSYM || symtab == 0)
44: return (diff);
45: for (sp = symtab; sp < esymtab; sp++) {
46: if (sp->n_type & N_STAB || !(sp->n_type & N_EXT)
47: || sp->n_type == (N_FN|N_EXT))
48: continue;
49: if (val - sp->n_value < diff && val >= sp->n_value) {
50: diff = val - sp->n_value;
51: cursym = sp;
52: if (diff == 0)
53: break;
54: }
55: }
56: return (diff);
57: }
58:
59: /*
60: * Advance cursym to the next local variable.
61: * Leave its value in localval as a side effect.
62: * Return 0 at end of file.
63: */
64: localsym(cframe)
65: ADDR cframe;
66: {
67: register int type;
68: register struct nlist *sp;
69:
70: if (cursym)
71: for (sp = cursym; ++sp < esymtab; ) {
72: type = sp->n_type;
73: if (sp->n_un.n_name[0] =='_' || type == N_FN)
74: return (0);
75: switch (type) {
76:
77: case N_TEXT:
78: case N_TEXT|N_EXT:
79: case N_DATA:
80: case N_DATA|N_EXT:
81: case N_BSS:
82: case N_BSS|N_EXT:
83: localval = sp->n_value;
84: cursym = sp;
85: return (1);
86:
87: case N_LSYM:
88: localval = cframe - sp->n_value;
89: cursym = sp;
90: return (1);
91:
92: case N_PSYM:
93: case N_ABS:
94: localval = cframe + sp->n_value;
95: cursym = sp;
96: return (1);
97: }
98: }
99: cursym = 0;
100: return (0);
101: }
102:
103: /*
104: * Print value v and then the string s.
105: * If v is not zero, then we look for a nearby symbol
106: * and print name+offset if we find a symbol for which
107: * offset is small enough.
108: *
109: * For values which are just into kernel address space
110: * that they match exactly or that they be more than maxoff
111: * bytes into kernel space.
112: */
113: psymoff(v, type, s)
114: register v;
115: int type;
116: char *s;
117: {
118: register w;
119:
120: if (v)
121: w = findsym(v, type);
122: if (v==0 || w >= maxoff)
123: printf(LPRMODE, v);
124: else {
125: printf("%s", cursym->n_un.n_name);
126: if (w)
127: printf(OFFMODE, w);
128: }
129: printf(s);
130: }
131:
132: /*
133: * Print value v symbolically if it has a reasonable
134: * interpretation as name+offset. If not, print nothing.
135: * Used in printing out registers $r.
136: */
137: valpr(v, idsp)
138: {
139: register off_t d;
140:
141: d = findsym(v, idsp);
142: if (d >= maxoff)
143: return;
144: printf("%s", cursym->n_un.n_name);
145: if (d)
146: printf(OFFMODE, d);
147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.