1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57#ifndef _DDB_DB_SYM_H_
58#define _DDB_DB_SYM_H_
59
60#include <mach/boolean.h>
61#include <mach/machine/vm_types.h>
62#include <machine/db_machdep.h>
63#include <kern/task.h>
64
65
66
67
68
69#define SYMTAB_NAME_LEN 32
70
71typedef struct {
72 int type;
73#define SYMTAB_AOUT 0
74#define SYMTAB_COFF 1
75#define SYMTAB_MACHDEP 2
76 char *start;
77 char *end;
78 char *private;
79 char *map_pointer;
80
81 char name[SYMTAB_NAME_LEN];
82
83 unsigned long minsym;
84 unsigned long maxsym;
85 boolean_t sorted;
86} db_symtab_t;
87
88extern db_symtab_t *db_last_symtab;
89
90
91
92
93
94
95typedef void * db_sym_t;
96#define DB_SYM_NULL ((db_sym_t)0)
97
98
99
100
101
102
103
104typedef int db_strategy_t;
105
106#define DB_STGY_ANY 0
107#define DB_STGY_XTRN 1
108#define DB_STGY_PROC 2
109
110extern boolean_t db_qualify_ambiguous_names;
111
112
113
114
115extern unsigned long db_maxoff;
116
117
118
119extern boolean_t db_add_symbol_table(
120 int type,
121 char *start,
122 char *end,
123 char *name,
124 char *ref,
125 char *map_pointer,
126 unsigned long minsym,
127 unsigned long maxsym,
128 boolean_t sorted);
129
130extern void db_install_inks(
131 vm_offset_t base);
132
133extern boolean_t db_value_of_name(
134 char *name,
135 db_expr_t *valuep);
136
137extern db_sym_t db_lookup(char *symstr);
138
139extern char * db_get_sym(
140 db_expr_t * off);
141
142extern db_sym_t db_sym_parse_and_lookup(
143 int (*func)(db_symtab_t *,
144 char *,
145 char *,
146 int,
147 db_sym_t*,
148 char **,
149 int *),
150 db_symtab_t *symtab,
151 char *symstr);
152
153extern int db_sym_parse_and_lookup_incomplete(
154 int (*func)(db_symtab_t *,
155 char *,
156 char *,
157 int,
158 db_sym_t*,
159 char **,
160 int *),
161 db_symtab_t *symtab,
162 char *symstr,
163 char **name,
164 int *len,
165 int *toadd);
166
167extern int db_sym_parse_and_print_completion(
168 int (*func)(db_symtab_t *,
169 char *),
170 db_symtab_t *symtab,
171 char *symstr);
172
173extern db_sym_t db_search_task_symbol(
174 db_addr_t val,
175 db_strategy_t strategy,
176 db_addr_t *offp,
177 task_t task);
178
179extern db_sym_t db_search_task_symbol_and_line(
180 db_addr_t val,
181 db_strategy_t strategy,
182 db_expr_t *offp,
183 char **filenamep,
184 int *linenump,
185 task_t task,
186 int *argsp);
187
188extern void db_symbol_values(
189 db_symtab_t *stab,
190 db_sym_t sym,
191 char **namep,
192 db_expr_t *valuep);
193
194extern void db_task_printsym(
195 db_expr_t off,
196 db_strategy_t strategy,
197 task_t task);
198
199extern void db_printsym(
200 db_expr_t off,
201 db_strategy_t strategy);
202
203extern boolean_t db_line_at_pc(
204 db_sym_t sym,
205 char **filename,
206 int *linenum,
207 db_expr_t pc);
208
209extern void db_qsort(
210 char *table,
211 int nbelts,
212 int eltsize,
213 int (*compfun)(char *, char *));
214
215extern void db_qsort_limit_search(
216 char *target,
217 char **start,
218 char **end,
219 int eltsize,
220 int (*compfun)(char *, char *));
221
222extern void db_sym_print_completion(
223 db_symtab_t *stab,
224 char *name,
225 int function,
226 char *fname,
227 int line);
228
229extern void db_print_completion(
230 char *symstr);
231
232extern int db_lookup_incomplete(
233 char *symstr,
234 int symlen);
235
236extern void ddb_init(void);
237
238extern void db_machdep_init(void);
239
240extern void db_clone_symtabXXX(char *, char *, vm_offset_t);
241
242extern db_symtab_t *db_symtab_cloneeXXX(char *);
243
244extern int db_task_getlinenum( db_expr_t, task_t);
245
246
247
248#define db_find_sym_and_offset(val,namep,offp) \
249 db_symbol_values(0, db_search_symbol(val,DB_STGY_ANY,offp),namep,0)
250
251
252#define db_find_xtrn_sym_and_offset(val,namep,offp) \
253 db_symbol_values(0, db_search_symbol(val,DB_STGY_XTRN,offp),namep,0)
254
255
256#define db_find_task_sym_and_offset(val,namep,offp,task) \
257 db_symbol_values(0, db_search_task_symbol(val,DB_STGY_ANY,offp,task), \
258 namep, 0)
259
260#define db_find_xtrn_task_sym_and_offset(val,namep,offp,task) \
261 db_symbol_values(0, db_search_task_symbol(val,DB_STGY_XTRN,offp,task), \
262 namep,0)
263
264#define db_search_symbol(val,strgy,offp) \
265 db_search_task_symbol(val,strgy,offp,0)
266
267
268
269
270
271
272
273extern struct db_sym_switch {
274
275 void (*init)(void);
276
277 boolean_t (*sym_init)(
278 char *start,
279 char *end,
280 char *name,
281 char *task_addr
282 );
283
284 db_sym_t (*lookup)(
285 db_symtab_t *stab,
286 char *symstr
287 );
288 db_sym_t (*search_symbol)(
289 db_symtab_t *stab,
290 db_addr_t off,
291 db_strategy_t strategy,
292 db_expr_t *diffp
293 );
294
295 boolean_t (*line_at_pc)(
296 db_symtab_t *stab,
297 db_sym_t sym,
298 char **file,
299 int *line,
300 db_expr_t pc
301 );
302
303 void (*symbol_values)(
304 db_sym_t sym,
305 char **namep,
306 db_expr_t *valuep
307 );
308 db_sym_t (*search_by_addr)(
309 db_symtab_t *stab,
310 db_addr_t off,
311 char **file,
312 char **func,
313 int *line,
314 db_expr_t *diffp,
315 int *args
316 );
317
318 int (*print_completion)(
319 db_symtab_t *stab,
320 char *symstr
321 );
322
323 int (*lookup_incomplete)(
324 db_symtab_t *stab,
325 char *symstr,
326 char **name,
327 int *len,
328 int *toadd
329 );
330} x_db[];
331
332#ifndef symtab_type
333#define symtab_type(s) SYMTAB_AOUT
334#endif
335
336#define X_db_init() x_db[symtab_type(s)].init()
337#define X_db_sym_init(s,e,n,t) x_db[symtab_type(s)].sym_init(s,e,n,t)
338#define X_db_lookup(s,n) x_db[(s)->type].lookup(s,n)
339#define X_db_search_symbol(s,o,t,d) x_db[(s)->type].search_symbol(s,o,t,d)
340#define X_db_line_at_pc(s,p,f,l,a) x_db[(s)->type].line_at_pc(s,p,f,l,a)
341#define X_db_symbol_values(s,p,n,v) x_db[(s)->type].symbol_values(p,n,v)
342#define X_db_search_by_addr(s,a,f,c,l,d,r) \
343 x_db[(s)->type].search_by_addr(s,a,f,c,l,d,r)
344#define X_db_print_completion(s,p) x_db[(s)->type].print_completion(s,p)
345#define X_db_lookup_incomplete(s,p,n,l,t) \
346 x_db[(s)->type].lookup_incomplete(s,p,n,l,t)
347
348#endif
349