This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFC] Fix source path lookup immediately after substitute-path
- From: Daniel Jacobowitz <drow at false dot org>
- To: gdb-patches at sourceware dot org
- Date: Tue, 22 Sep 2009 15:06:32 -0400
- Subject: [RFC] Fix source path lookup immediately after substitute-path
I've been frustrated several times by this routine. For the test I
compiled 'main.c' to 'main', then moved main.c into another directory.
+list main
1 main.c: No such file or directory.
in main.c
All is well so far.
+set substitute-path /scratch/dan/eabi44 /scratch/dan/eabi44/backup
+list main
1 in main.c
Where's my file? Maybe if I prod GDB it'll look again.
+dir
+list main
1 in main.c
Nope! Still can't find it!
+dir /no
Warning: /no: No such file or directory.
+list main
1 int main(){}
I discovered, by reading the source, that "dir" with a directory or
listing another source file would do the trick. There are two
different functions to invalidate cached source directory locations.
Some places call one but not the other; some call both; some
("set substitute-path" for instance) call neither. This patch
combines the two functions and makes them be reliably called.
I spent a little while trying to write a portable test case for this
and eventually gave up.
Any thoughts on this patch? May I include it in 7.0?
--
Daniel Jacobowitz
CodeSourcery
2009-09-22 Daniel Jacobowitz <dan@codesourcery.com>
gdb/
* source.c (forget_cached_source_info): Clear last_source_visited.
(init_last_source_visited): Delete.
(directory_command): Do not clear last_source_visited. Call
forget_cached_source_info only if required.
(unset_substitute_path_command, set_substitute_path_command): Call
forget_cached_source_info.
* mi/mi-cmd-env.c (mi_cmd_env_dir): Do not call
init_last_source_visited.
* defs.h (init_last_source_visited): Delete declaration.
Index: source.c
===================================================================
--- source.c (revision 262056)
+++ source.c (working copy)
@@ -345,6 +345,8 @@ forget_cached_source_info (void)
}
}
}
+
+ last_source_visited = NULL;
}
void
@@ -357,12 +359,6 @@ init_source_path (void)
forget_cached_source_info ();
}
-void
-init_last_source_visited (void)
-{
- last_source_visited = NULL;
-}
-
/* Add zero or more directories to the front of the source path. */
void
@@ -381,11 +377,10 @@ directory_command (char *dirname, int fr
else
{
mod_path (dirname, &source_path);
- last_source_visited = NULL;
+ forget_cached_source_info ();
}
if (from_tty)
show_directories ((char *) 0, from_tty);
- forget_cached_source_info ();
}
/* Add a path given with the -d command line switch.
@@ -1884,6 +1879,8 @@ unset_substitute_path_command (char *arg
if (from != NULL && !rule_found)
error (_("No substitution rule defined for `%s'"), from);
+
+ forget_cached_source_info ();
}
/* Add a new source path substitution rule. */
@@ -1922,6 +1919,7 @@ set_substitute_path_command (char *args,
/* Insert the new substitution rule. */
add_substitute_path_rule (argv[0], argv[1]);
+ forget_cached_source_info ();
}
Index: mi/mi-cmd-env.c
===================================================================
--- mi/mi-cmd-env.c (revision 262056)
+++ mi/mi-cmd-env.c (working copy)
@@ -232,7 +232,6 @@ mi_cmd_env_dir (char *command, char **ar
for (i = argc - 1; i >= 0; --i)
env_mod_path (argv[i], &source_path);
- init_last_source_visited ();
ui_out_field_string (uiout, "source-path", source_path);
forget_cached_source_info ();
Index: defs.h
===================================================================
--- defs.h (revision 262056)
+++ defs.h (working copy)
@@ -636,8 +636,6 @@ extern char *source_path;
extern void init_source_path (void);
-extern void init_last_source_visited (void);
-
/* From exec.c */
/* Take over the 'find_mapped_memory' vector from exec.c. */