#include "ui-out.h"
#include "readline/readline.h"
+#include "psymtab.h"
+
#define OPEN_MODE (O_RDONLY | O_BINARY)
#define FDOPEN_MODE FOPEN_RB
void
set_default_source_symtab_and_line (void)
{
- struct symtab_and_line cursal;
-
if (!have_full_symbols () && !have_partial_symbols ())
error (_("No symbol table is loaded. Use the \"file\" command."));
{
struct symtabs_and_lines sals;
struct symtab_and_line sal;
- struct partial_symtab *ps;
- struct partial_symtab *cs_pst = 0;
struct objfile *ofp;
if (s)
{
const char *name = s->filename;
int len = strlen (name);
+
if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
|| strcmp (name, "<<C++-namespaces>>") == 0)))
{
if (current_source_symtab)
return;
- /* How about the partial symbol tables? */
-
ALL_OBJFILES (ofp)
- {
- for (ps = ofp->psymtabs; ps != NULL; ps = ps->next)
- {
- const char *name = ps->filename;
- int len = strlen (name);
- if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
- || strcmp (name, "<<C++-namespaces>>") == 0)))
- cs_pst = ps;
- }
- }
- if (cs_pst)
- {
- if (cs_pst->readin)
- {
- internal_error (__FILE__, __LINE__,
- _("select_source_symtab: "
- "readin pst found and no symtabs."));
- }
- else
- {
- current_source_pspace = current_program_space;
- current_source_symtab = PSYMTAB_TO_SYMTAB (cs_pst);
- }
- }
+ {
+ if (ofp->sf)
+ s = ofp->sf->qf->find_last_source_symtab (ofp);
+ if (s)
+ current_source_symtab = s;
+ }
if (current_source_symtab)
return;
struct program_space *pspace;
struct symtab *s;
struct objfile *objfile;
- struct partial_symtab *pst;
ALL_PSPACES (pspace)
ALL_PSPACE_OBJFILES (pspace, objfile)
}
}
- ALL_OBJFILE_PSYMTABS (objfile, pst)
- {
- if (pst->fullname != NULL)
- {
- xfree (pst->fullname);
- pst->fullname = NULL;
- }
- }
+ if (objfile->sf)
+ objfile->sf->qf->forget_cached_source_info (objfile);
}
last_source_visited = NULL;
if (stat (name, &st) < 0)
{
int save_errno = errno;
+
fprintf_unfiltered (gdb_stderr, "Warning: ");
print_sys_errmsg (name, save_errno);
}
/* The open syscall MODE parameter is not specified. */
gdb_assert ((mode & O_CREAT) == 0);
+ gdb_assert (string != NULL);
+
+ /* A file with an empty name cannot possibly exist. Report a failure
+ without further checking.
+
+ This is an optimization which also defends us against buggy
+ implementations of the "stat" function. For instance, we have
+ noticed that a MinGW debugger built on Windows XP 32bits crashes
+ when the debugger is started with an empty argument. */
+ if (string[0] == '\0')
+ {
+ errno = ENOENT;
+ return -1;
+ }
if (!path)
path = ".";
goto done;
}
+ /* For dos paths, d:/foo -> /foo, and d:foo -> foo. */
+ if (HAS_DRIVE_SPEC (string))
+ string = STRIP_DRIVE_SPEC (string);
+
/* /foo => foo, to avoid multiple slashes that Emacs doesn't like. */
while (IS_DIR_SEPARATOR(string[0]))
string++;
/* Normal file name in path -- just use it. */
strncpy (filename, p, len);
filename[len] = 0;
+
+ /* Don't search $cdir. It's also a magic path like $cwd, but we
+ don't have enough information to expand it. The user *could*
+ have an actual directory named '$cdir' but handling that would
+ be confusing, it would mean different things in different
+ contexts. If the user really has '$cdir' one can use './$cdir'.
+ We can get $cdir when loading scripts. When loading source files
+ $cdir must have already been expanded to the correct value. */
+ if (strcmp (filename, "$cdir") == 0)
+ continue;
}
/* Remove trailing slashes */
IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
? "" : SLASH_STRING,
filename, (char *)NULL);
+
*filename_opened = xfullpath (f);
xfree (f);
}
An invalid file descriptor is returned. ( the return value is negative )
FULLNAME is set to NULL. */
-static int
+int
find_and_open_source (const char *filename,
const char *dirname,
char **fullname)
return NULL;
}
-
-/* Finds the fullname that a partial_symtab represents.
-
- If this functions finds the fullname, it will save it in ps->fullname
- and it will also return the value.
-
- If this function fails to find the file that this partial_symtab represents,
- NULL will be returned and ps->fullname will be set to NULL. */
-char *
-psymtab_to_fullname (struct partial_symtab *ps)
-{
- int r;
-
- if (!ps)
- return NULL;
-
- /* Don't check ps->fullname here, the file could have been
- deleted/moved/..., look for it again */
- r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
-
- if (r >= 0)
- {
- close (r);
- return ps->fullname;
- }
-
- return NULL;
-}
\f
/* Create and initialize the table S->line_charpos that records
the positions of the lines in the source file, which is assumed
static void
set_substitute_path_command (char *args, int from_tty)
{
- char *from_path, *to_path;
char **argv;
struct substitute_path_rule *rule;
_initialize_source (void)
{
struct cmd_list_element *c;
+
current_source_symtab = 0;
init_source_path ();
add_com ("reverse-search", class_files, reverse_search_command, _("\
Search backward for regular expression (see regex(3)) from last line listed.\n\
The matching line number is also stored as the value of \"$_\"."));
+ add_com_alias ("rev", "reverse-search", class_files, 1);
if (xdb_commands)
{