X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsource.c;h=e0ae0b179fd8c3221b0c09ce10d7200629fa65c7;hb=ec56be1b4dc25ec39c32ceab997747ad651c9d22;hp=a142b32a90f5af96b3fc0f75051fbf589ecf7e3d;hpb=56163ce1d3a08ade22d84d366dc9066df789914a;p=deliverable%2Fbinutils-gdb.git
diff --git a/gdb/source.c b/gdb/source.c
index a142b32a90..e0ae0b179f 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -1,13 +1,13 @@
/* List lines of source files for GDB, the GNU debugger.
Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
- 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -16,9 +16,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see . */
#include "defs.h"
#include "symtab.h"
@@ -241,7 +239,7 @@ select_source_symtab (struct symtab *s)
/* Make the default place to list be the function `main'
if one exists. */
- if (lookup_symbol (main_name (), 0, VAR_DOMAIN, 0, NULL))
+ if (lookup_symbol (main_name (), 0, VAR_DOMAIN, 0))
{
sals = decode_line_spec (main_name (), 1);
sal = sals.sals[0];
@@ -252,7 +250,8 @@ select_source_symtab (struct symtab *s)
return;
}
- /* All right; find the last file in the symtab list (ignoring .h's). */
+ /* Alright; find the last file in the symtab list (ignoring .h's
+ and namespace symtabs). */
current_source_line = 1;
@@ -262,14 +261,15 @@ select_source_symtab (struct symtab *s)
{
const char *name = s->filename;
int len = strlen (name);
- if (!(len > 2 && strcmp(&name[len - 2], ".h") == 0))
+ if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
+ || strcmp (name, "<>") == 0)))
current_source_symtab = s;
}
}
if (current_source_symtab)
return;
- /* Howabout the partial symbol tables? */
+ /* How about the partial symbol tables? */
for (ofp = object_files; ofp != NULL; ofp = ofp->next)
{
@@ -277,7 +277,8 @@ select_source_symtab (struct symtab *s)
{
const char *name = ps->filename;
int len = strlen (name);
- if (!(len > 2 && strcmp (&name[len - 2], ".h") == 0))
+ if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
+ || strcmp (name, "<>") == 0)))
cs_pst = ps;
}
}
@@ -371,7 +372,7 @@ directory_command (char *dirname, int from_tty)
/* FIXME, this goes to "delete dir"... */
if (dirname == 0)
{
- if (from_tty && query (_("Reinitialize source path to empty? ")))
+ if (!from_tty || query (_("Reinitialize source path to empty? ")))
{
xfree (source_path);
init_source_path ();
@@ -929,15 +930,19 @@ rewrite_source_path (const char *path)
DIRNAME is the compilation directory of a particular source file.
Only some debug formats provide this info.
FULLNAME can be the last known absolute path to the file in question.
+ Space for the path must have been malloc'd. If a path substitution
+ is applied we free the old value and set a new one.
On Success
A valid file descriptor is returned. ( the return value is positive )
FULLNAME is set to the absolute path to the file just opened.
+ The caller is responsible for freeing FULLNAME.
On Failure
An invalid file descriptor is returned. ( the return value is negative )
FULLNAME is set to NULL. */
-int
+
+static int
find_and_open_source (struct objfile *objfile,
const char *filename,
const char *dirname,
@@ -1001,10 +1006,11 @@ find_and_open_source (struct objfile *objfile,
strcat (path + len, source_path + len + cdir_len); /* After $cdir */
}
}
- else
+
+ if (IS_ABSOLUTE_PATH (filename))
{
- /* If dirname is NULL, chances are the path is embedded in
- the filename. Try the source path substitution on it. */
+ /* If filename is absolute path, try the source path
+ substitution on it. */
char *rewritten_filename = rewrite_source_path (filename);
if (rewritten_filename != NULL)
@@ -1023,13 +1029,6 @@ find_and_open_source (struct objfile *objfile,
result = openp (path, OPF_SEARCH_IN_PATH, p, OPEN_MODE, 0, fullname);
}
- if (result >= 0)
- {
- char *tmp_fullname;
- tmp_fullname = *fullname;
- *fullname = xstrdup (tmp_fullname);
- xfree (tmp_fullname);
- }
return result;
}
@@ -1050,11 +1049,11 @@ open_source_file (struct symtab *s)
/* Finds the fullname that a symtab represents.
- If this functions finds the fullname, it will save it in ps->fullname
+ If this functions finds the fullname, it will save it in s->fullname
and it will also return the value.
If this function fails to find the file that this symtab represents,
- NULL will be returned and ps->fullname will be set to NULL. */
+ NULL will be returned and s->fullname will be set to NULL. */
char *
symtab_to_fullname (struct symtab *s)
{
@@ -1122,14 +1121,15 @@ find_source_lines (struct symtab *s, int desc)
long mtime = 0;
int size;
+ gdb_assert (s);
line_charpos = (int *) xmalloc (lines_allocated * sizeof (int));
if (fstat (desc, &st) < 0)
perror_with_name (s->filename);
- if (s && s->objfile && s->objfile->obfd)
- mtime = bfd_get_mtime (s->objfile->obfd);
+ if (s->objfile && s->objfile->obfd)
+ mtime = s->objfile->mtime;
else if (exec_bfd)
- mtime = bfd_get_mtime (exec_bfd);
+ mtime = exec_bfd_mtime;
if (mtime && mtime < st.st_mtime)
warning (_("Source file is more recent than executable."));
@@ -1424,7 +1424,7 @@ print_source_lines_base (struct symtab *s, int line, int stopline, int noerror)
}
/* Show source lines from the file of symtab S, starting with line
- number LINE and stopping before line number STOPLINE. If this is the
+ number LINE and stopping before line number STOPLINE. If this is
not the command line version, then the source is shown in the source
window otherwise it is simply printed */
@@ -1852,6 +1852,7 @@ unset_substitute_path_command (char *args, int from_tty)
/* This function takes either 0 or 1 argument. */
+ make_cleanup_freeargv (argv);
if (argv != NULL && argv[0] != NULL && argv[1] != NULL)
error (_("Incorrect usage, too many arguments in command"));