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"));