/* * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * The contents of this file constitute Original Code as defined in and * are subject to the Apple Public Source License Version 1.1 (the * "License"). You may not use this file except in compliance with the * License. Please obtain a copy of the License at * http://www.apple.com/publicsource and read it before using this file. * * This Original Code and all software distributed under the License are * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the * License for the specific language governing rights and limitations * under the License. * * @APPLE_LICENSE_HEADER_END@ */ /* * @OSF_COPYRIGHT@ */ /* * HISTORY * * Revision 1.1.1.1 1998/09/22 21:05:48 wsanchez * Import of Mac OS X kernel (~semeria) * * Revision 1.1.1.1 1998/03/07 02:26:09 wsanchez * Import of OSF Mach kernel (~mburg) * * Revision 1.2.20.6 1996/01/09 19:16:22 devrcs * Add proto for db_task_getlinenum(). * [1995/12/01 21:42:34 jfraser] * * Revision 1.2.20.5 1995/02/28 01:58:53 dwm * Merged with changes from 1.2.20.4 * [1995/02/28 01:53:54 dwm] * * mk6 CR1120 - Merge mk6pro_shared into cnmk_shared * [1995/02/28 01:12:57 dwm] * * Revision 1.2.20.4 1995/02/23 21:43:48 alanl * Prepend a "db_" to qsort and qsort_limit_search * (collisions with the real qsort in stdlib.h) * [95/02/14 travos] * * Expanded db_sym_switch structure to make ddb object format dependent; * this allows us to remove all of the aout dependencies. * [95/01/24 sjs] * * Revision 1.2.23.4 1994/12/22 20:36:20 bolinger * Fix ri-osc CR881: Fixed glitch in use of symtab cloning hack. * [1994/12/22 20:35:17 bolinger] * * Revision 1.2.23.3 1994/11/02 18:36:07 dwm * mk6 CR668 - 1.3b26 merge * 64bit cleanup, prototypes * fix X_db_search_by_addr macro to match prototype * [1994/11/02 18:16:20 dwm] * * Revision 1.2.20.4 1995/02/23 21:43:48 alanl * Prepend a "db_" to qsort and qsort_limit_search * (collisions with the real qsort in stdlib.h) * [95/02/14 travos] * * Expanded db_sym_switch structure to make ddb object format dependent; * this allows us to remove all of the aout dependencies. * [95/01/24 sjs] * * Revision 1.2.23.4 1994/12/22 20:36:20 bolinger * Fix ri-osc CR881: Fixed glitch in use of symtab cloning hack. * [1994/12/22 20:35:17 bolinger] * * Revision 1.2.23.3 1994/11/02 18:36:07 dwm * mk6 CR668 - 1.3b26 merge * 64bit cleanup, prototypes * fix X_db_search_by_addr macro to match prototype * [1994/11/02 18:16:20 dwm] * * Revision 1.2.20.2 1994/09/23 01:21:51 ezf * change marker to not FREE * [1994/09/22 21:11:04 ezf] * * Revision 1.2.20.1 1994/06/11 21:12:25 bolinger * Merge up to NMK17.2. * [1994/06/11 20:04:14 bolinger] * * Revision 1.2.14.1 1994/02/08 10:58:56 bernadat * Added db_sym_print_completion * db_sym_parse_and_lookup_incomplete * db_sym_parse_and_print_completion * db_print_completion * db_lookup_incomplete * ddb_init * prototypes * * Changed func type to db_sym_parse_and_lookup prototype * * Added definition of db_maxoff. * [93/08/12 paire] * [94/02/07 bernadat] * * Revision 1.2.18.1 1994/06/08 19:11:28 dswartz * Preemption merge. * [1994/06/08 19:10:27 dswartz] * * Revision 1.2.17.2 1994/06/01 21:34:50 klj * Initial preemption code base merge * * Revision 1.2.4.3 1993/07/27 18:28:12 elliston * Add ANSI prototypes. CR #9523. * [1993/07/27 18:13:02 elliston] * * Revision 1.2.4.2 1993/06/09 02:20:56 gm * Added to OSF/1 R1.3 from NMK15.0. * [1993/06/02 20:57:18 jeffc] * * Revision 1.2 1993/04/19 16:03:18 devrcs * Added 3 new fields in db_symtab_t for sorting. * [barbou@gr.osf.org] * [92/12/03 bernadat] * * Revision 1.1 1992/09/30 02:24:22 robert * Initial revision * * $EndLog$ */ /* CMU_HIST */ /* * Revision 2.6 91/10/09 16:02:45 af * Revision 2.5.1.1 91/10/05 13:07:39 jeffreyh * Added macro definitions of db_find_task_sym_and_offset(), * db_find_xtrn_task_sym_and_offset(), db_search_symbol(). * [91/08/29 tak] * * Revision 2.5.1.1 91/10/05 13:07:39 jeffreyh * Added macro definitions of db_find_task_sym_and_offset(), * db_find_xtrn_task_sym_and_offset(), db_search_symbol(). * [91/08/29 tak] * * Revision 2.5 91/07/31 17:31:49 dbg * Add map pointer and storage for name to db_symtab_t. * [91/07/30 16:45:08 dbg] * * Revision 2.4 91/05/14 15:36:08 mrt * Correcting copyright * * Revision 2.3 91/02/05 17:07:12 mrt * Changed to new Mach copyright * [91/01/31 16:19:27 mrt] * * Revision 2.2 90/08/27 21:52:39 dbg * Changed type of db_sym_t to char * - it's a better type for an * opaque pointer. * [90/08/22 dbg] * * Created. * [90/08/19 af] * */ /* CMU_ENDHIST */ /* * Mach Operating System * Copyright (c) 1991,1990 Carnegie Mellon University * All Rights Reserved. * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. */ /* */ /* * Author: Alessandro Forin, Carnegie Mellon University * Date: 8/90 */ #ifndef _DDB_DB_SYM_H_ #define _DDB_DB_SYM_H_ #include <mach/boolean.h> #include <mach/machine/vm_types.h> #include <machine/db_machdep.h> #include <kern/task.h> /* * This module can handle multiple symbol tables, * of multiple types, at the same time */ #define SYMTAB_NAME_LEN 32 typedef struct { int type; #define SYMTAB_AOUT 0 #define SYMTAB_COFF 1 #define SYMTAB_MACHDEP 2 char *start; /* symtab location */ char *end; char *private; /* optional machdep pointer */ char *map_pointer; /* symbols are for this map only, if not null */ char name[SYMTAB_NAME_LEN]; /* symtab name */ unsigned long minsym; /* lowest symbol value */ unsigned long maxsym; /* highest symbol value */ boolean_t sorted; /* is this table sorted ? */ } 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 */ typedef void * db_sym_t; /* opaque handle on symbols */ #define DB_SYM_NULL ((db_sym_t)0) /* * Non-stripped symbol tables will have duplicates, for instance * the same string could match a parameter name, a local var, a * global var, etc. * We are most concern with the following matches. */ typedef int db_strategy_t; /* search strategy */ #define DB_STGY_ANY 0 /* anything goes */ #define DB_STGY_XTRN 1 /* only external symbols */ #define DB_STGY_PROC 2 /* only procedures */ extern boolean_t db_qualify_ambiguous_names; /* if TRUE, check across symbol tables * for multiple occurrences of a name. * Might slow down quite a bit */ extern unsigned long db_maxoff; /* Prototypes for functions exported by this module. */ extern boolean_t db_add_symbol_table( int type, char *start, char *end, char *name, char *ref, char *map_pointer, unsigned long minsym, unsigned long maxsym, boolean_t sorted); extern void db_install_inks( vm_offset_t base); extern boolean_t db_value_of_name( char *name, db_expr_t *valuep); extern db_sym_t db_lookup(char *symstr); extern char * db_get_sym( db_expr_t * off); extern db_sym_t db_sym_parse_and_lookup( int (*func)(db_symtab_t *, char *, char *, int, db_sym_t*, char **, int *), db_symtab_t *symtab, char *symstr); extern int db_sym_parse_and_lookup_incomplete( int (*func)(db_symtab_t *, char *, char *, int, db_sym_t*, char **, int *), db_symtab_t *symtab, char *symstr, char **name, int *len, int *toadd); extern int db_sym_parse_and_print_completion( int (*func)(db_symtab_t *, char *), db_symtab_t *symtab, char *symstr); extern db_sym_t db_search_task_symbol( db_addr_t val, db_strategy_t strategy, db_addr_t *offp, task_t task); extern db_sym_t db_search_task_symbol_and_line( db_addr_t val, db_strategy_t strategy, db_expr_t *offp, char **filenamep, int *linenump, task_t task, int *argsp); extern void db_symbol_values( db_symtab_t *stab, db_sym_t sym, char **namep, db_expr_t *valuep); extern void db_task_printsym( db_expr_t off, db_strategy_t strategy, task_t task); extern void db_printsym( db_expr_t off, db_strategy_t strategy); extern boolean_t db_line_at_pc( db_sym_t sym, char **filename, int *linenum, db_expr_t pc); extern void db_qsort( char *table, int nbelts, int eltsize, int (*compfun)(char *, char *)); extern void db_qsort_limit_search( char *target, char **start, char **end, int eltsize, int (*compfun)(char *, char *)); extern void db_sym_print_completion( db_symtab_t *stab, char *name, int function, char *fname, int line); extern void db_print_completion( char *symstr); extern int db_lookup_incomplete( char *symstr, int symlen); extern void ddb_init(void); extern void db_machdep_init(void); extern void db_clone_symtabXXX(char *, char *, vm_offset_t); extern db_symtab_t *db_symtab_cloneeXXX(char *); extern db_task_getlinenum( db_expr_t, task_t); /* Some convenience macros. */ #define db_find_sym_and_offset(val,namep,offp) \ db_symbol_values(0, db_search_symbol(val,DB_STGY_ANY,offp),namep,0) /* find name&value given approx val */ #define db_find_xtrn_sym_and_offset(val,namep,offp) \ db_symbol_values(0, db_search_symbol(val,DB_STGY_XTRN,offp),namep,0) /* ditto, but no locals */ #define db_find_task_sym_and_offset(val,namep,offp,task) \ db_symbol_values(0, db_search_task_symbol(val,DB_STGY_ANY,offp,task), \ namep, 0) /* find name&value given approx val */ #define db_find_xtrn_task_sym_and_offset(val,namep,offp,task) \ db_symbol_values(0, db_search_task_symbol(val,DB_STGY_XTRN,offp,task), \ namep,0) /* ditto, but no locals */ #define db_search_symbol(val,strgy,offp) \ db_search_task_symbol(val,strgy,offp,0) /* find symbol in current task */ /* * Symbol table switch, defines the interface * to symbol-table specific routines. */ extern struct db_sym_switch { void (*init)(void); boolean_t (*sym_init)( char *start, char *end, char *name, char *task_addr ); db_sym_t (*lookup)( db_symtab_t *stab, char *symstr ); db_sym_t (*search_symbol)( db_symtab_t *stab, db_addr_t off, db_strategy_t strategy, db_expr_t *diffp ); boolean_t (*line_at_pc)( db_symtab_t *stab, db_sym_t sym, char **file, int *line, db_expr_t pc ); void (*symbol_values)( db_sym_t sym, char **namep, db_expr_t *valuep ); db_sym_t (*search_by_addr)( db_symtab_t *stab, db_addr_t off, char **file, char **func, int *line, db_expr_t *diffp, int *args ); int (*print_completion)( db_symtab_t *stab, char *symstr ); int (*lookup_incomplete)( db_symtab_t *stab, char *symstr, char **name, int *len, int *toadd ); } x_db[]; #ifndef symtab_type #define symtab_type(s) SYMTAB_AOUT #endif #define X_db_init() x_db[symtab_type(s)].init() #define X_db_sym_init(s,e,n,t) x_db[symtab_type(s)].sym_init(s,e,n,t) #define X_db_lookup(s,n) x_db[(s)->type].lookup(s,n) #define X_db_search_symbol(s,o,t,d) x_db[(s)->type].search_symbol(s,o,t,d) #define X_db_line_at_pc(s,p,f,l,a) x_db[(s)->type].line_at_pc(s,p,f,l,a) #define X_db_symbol_values(s,p,n,v) x_db[(s)->type].symbol_values(p,n,v) #define X_db_search_by_addr(s,a,f,c,l,d,r) \ x_db[(s)->type].search_by_addr(s,a,f,c,l,d,r) #define X_db_print_completion(s,p) x_db[(s)->type].print_completion(s,p) #define X_db_lookup_incomplete(s,p,n,l,t) \ x_db[(s)->type].lookup_incomplete(s,p,n,l,t) #endif /* !_DDB_DB_SYM_H_ */