diff options
author | Keith Seitz <keiths@cygnus> | 1998-01-23 20:54:35 +0000 |
---|---|---|
committer | Keith Seitz <keiths@cygnus> | 1998-01-23 20:54:35 +0000 |
commit | 11f91b2bbca1d68abb0f79a6ef6681daf06c4add (patch) | |
tree | a2870f7545ad55bdff7ec87303212a52b943bc3e /gdb/gdbtk.c | |
parent | 67f3b91e8be7ddb5815b1f49341a9af5c1f98a9f (diff) | |
download | gdb-11f91b2bbca1d68abb0f79a6ef6681daf06c4add.zip gdb-11f91b2bbca1d68abb0f79a6ef6681daf06c4add.tar.gz gdb-11f91b2bbca1d68abb0f79a6ef6681daf06c4add.tar.bz2 |
* symfile.c: Define two new hooks for symbol reading: "pre_add_symbol_hook"
and "post_add_symbol_hook". These hooks are called before we begin reading
symbols, and after we finish.
(generic_load): Use new symbol reading hooks and get rid of compiler warning.
* gdbtk.c (gdbtk_init): Add hooks for pre- and post-symbol reading.
(gdbtk_pre_add_symbol): New function: the pre-add-symbol hook.
(gdbtk_post_add_symbol): New function: the post-add-symbol hook.
(find_file_in_dir): New function. Moved the guts of gdb_find_file_command
into here to allow its use by others.
(gdb_loc): Use find_file_in_dir to return the real path to the file
(or "N/A" if we can't find it).
* configure.in (TIX_LIB_EXT): Define new variable for those special cases
when TCL_SHLIB_SUFFIX is not enough to specify the dependency.
* configure: Regenerate.
Diffstat (limited to 'gdb/gdbtk.c')
-rw-r--r-- | gdb/gdbtk.c | 73 |
1 files changed, 56 insertions, 17 deletions
diff --git a/gdb/gdbtk.c b/gdb/gdbtk.c index c83ed35f..93a3eb3 100644 --- a/gdb/gdbtk.c +++ b/gdb/gdbtk.c @@ -88,6 +88,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ int gdbtk_load_hash PARAMS ((char *, unsigned long)); int (*ui_load_progress_hook) PARAMS ((char *, unsigned long)); +void (*pre_add_symbol_hook) PARAMS ((char *)); +void (*post_add_symbol_hook) PARAMS ((void)); static void null_routine PARAMS ((int)); static void gdbtk_flush PARAMS ((FILE *)); @@ -142,10 +144,13 @@ static int gdb_get_tracepoint_info PARAMS ((ClientData, Tcl_Interp *, int, Tcl_O static int gdb_actions_command PARAMS ((ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[])); static int gdb_prompt_command PARAMS ((ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[])); static int gdb_find_file_command PARAMS ((ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[])); +static char *find_file_in_dir PARAMS ((char *)); static int gdb_get_tracepoint_list PARAMS ((ClientData, Tcl_Interp *, int, Tcl_Obj *CONST objv[])); static void gdbtk_create_tracepoint PARAMS ((struct tracepoint *)); static void gdbtk_delete_tracepoint PARAMS ((struct tracepoint *)); static void tracepoint_notify PARAMS ((struct tracepoint *, const char *)); +void gdbtk_pre_add_symbol PARAMS ((char *)); +void gdbtk_post_add_symbol PARAMS ((void)); /* Handle for TCL interpreter */ @@ -484,7 +489,7 @@ gdb_get_breakpoint_info (clientData, interp, argc, argv) filename = symtab_to_filename (sal.symtab); if (filename == NULL) - filename = "N/A"; + filename = ""; Tcl_DStringAppendElement (result_ptr, filename); find_pc_partial_function (b->address, &funcname, NULL, NULL); Tcl_DStringAppendElement (result_ptr, funcname); @@ -613,7 +618,9 @@ gdb_loc (clientData, interp, argc, argv) find_pc_partial_function (pc, &funcname, NULL, NULL); Tcl_DStringAppendElement (result_ptr, funcname); + /* Would it be better to use "find_file_in_dir"? */ filename = symtab_to_filename (sal.symtab); + if (filename == NULL) filename = "N/A"; Tcl_DStringAppendElement (result_ptr, filename); @@ -1955,6 +1962,8 @@ gdbtk_init ( argv0 ) readline_hook = gdbtk_readline; readline_end_hook = gdbtk_readline_end; ui_load_progress_hook = gdbtk_load_hash; + pre_add_symbol_hook = gdbtk_pre_add_symbol; + post_add_symbol_hook = gdbtk_post_add_symbol; create_tracepoint_hook = gdbtk_create_tracepoint; delete_tracepoint_hook = gdbtk_delete_tracepoint; @@ -2688,7 +2697,6 @@ gdb_find_file_command (clientData, interp, objc, objv) Tcl_Obj *CONST objv[]; { char *file, *filename; - struct symtab *st = NULL; if (objc != 2) { @@ -2698,28 +2706,59 @@ gdb_find_file_command (clientData, interp, objc, objv) return TCL_ERROR; } - /* try something simple first */ file = Tcl_GetStringFromObj (objv[1], NULL); - if (access (file, R_OK) == 0) - { - Tcl_SetObjResult (interp, Tcl_NewStringObj (file, -1)); - return TCL_OK; - } + filename = find_file_in_dir (file); + + if (filename == NULL) + Tcl_SetResult (interp, "", TCL_STATIC); + else + Tcl_SetObjResult (interp, Tcl_NewStringObj (filename, -1)); + + return TCL_OK; +} + +static char * +find_file_in_dir (file) + char *file; +{ + struct symtab *st = NULL; - /* We really need a symtab for this to work... */ - st = lookup_symtab (file); - if (st != NULL) + if (file != NULL) { - filename = symtab_to_filename (st); - if (filename != NULL) + /* try something simple first */ + if (access (file, R_OK) == 0) + return file; + + /* We really need a symtab for this to work... */ + st = lookup_symtab (file); + if (st != NULL) { - Tcl_SetObjResult (interp, Tcl_NewStringObj (filename, -1)); - return TCL_OK; + file = symtab_to_filename (st); + if (file != NULL) + return file; } } + + return NULL; +} - Tcl_SetResult (interp, "", TCL_STATIC); - return TCL_OK; +/* This hook is called whenever we are ready to load a symbol file so that + the UI can notify the user... */ +void +gdbtk_pre_add_symbol (name) + char *name; +{ + char command[256]; + + sprintf (command, "gdbtk_tcl_pre_add_symbol %s", name); + Tcl_Eval (interp, command); +} + +/* This hook is called whenever we finish loading a symbol file. */ +void +gdbtk_post_add_symbol () +{ + Tcl_Eval (interp, "gdbtk_tcl_post_add_symbol"); } /* Come here during initialize_all_files () */ |