This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFC] Don't lose compilation directory in Dwarf2 line-tables
On Tue, 2006-04-18 at 09:04 -0400, Daniel Jacobowitz wrote:
> On Tue, Apr 18, 2006 at 02:32:09PM +0200, Frederic RISS wrote:
> > All this file matching seems quite fragile, and the current approach
> > will get it wrong sometimes. Shouldn't the loop in dwarf2_start_subfile
> > be killed in favor of a search using both xfullpath(dirname'/'filename)
> > at the start of buildsym.c::start_subfile?
>
> The problem with using xfullpath is that it requires the file to exist
I realized that after having sent the patch.
> and already be found; as long as we are consistent, it's not too
> fragile, because we're checking against our own output.
I just made that comment because of the testsuite breakage that ensued
from modifying dirname before the loop... which seemed to imply that the
mechanism was fragile.
> > +
> > + if (dirname == NULL)
> > + dirname = comp_dir;
> > + else
> > + if (!IS_ABSOLUTE_PATH (dirname) && comp_dir != NULL)
> > + {
> > + dirname = concat (comp_dir, SLASH_STRING, dirname, (char *)NULL);
> > + /* do_cleanups is called after line info procesing */
> > + make_cleanup (xfree, dirname);
>
> Comment formatting again (and "processing"). But this is really nasty.
> Why not free it before we return? We don't return dirname, and
> start_subfile takes a copy.
I kind of copied it from the end of decode_dwarf_lines where
make_cleanups are used for the same kind of things.
Thanks for your review, I'm attaching an updated patch.
Fred.
2006-04-18 Frederic Riss <frederic.riss@st.com>
* dwarf2read.c (dwarf2_start_subfile): Change prototype to accept
compilation directory as last argument. Prepend the passed comp_dir
to dirname when necessary.
(dwarf_decode_lines): Pass the compilation directory to
dwarf2_start_subfile.
--- dwarf2read.c.orig 2006-04-13 11:17:40.000000000 +0200
+++ dwarf2read.c 2006-04-18 15:34:47.000000000 +0200
@@ -846,7 +846,7 @@ static struct line_header *(dwarf_decode
static void dwarf_decode_lines (struct line_header *, char *, bfd *,
struct dwarf2_cu *, struct partial_symtab *);
-static void dwarf2_start_subfile (char *, char *);
+static void dwarf2_start_subfile (char *, char *, char *);
static struct symbol *new_symbol (struct die_info *, struct type *,
struct dwarf2_cu *);
@@ -6529,13 +6529,12 @@ dwarf_decode_lines (struct line_header *
directory and file name numbers in the statement program
are 1-based. */
struct file_entry *fe = &lh->file_names[file - 1];
- char *dir;
+ char *dir = NULL;
if (fe->dir_index)
dir = lh->include_dirs[fe->dir_index - 1];
- else
- dir = comp_dir;
- dwarf2_start_subfile (fe->name, dir);
+
+ dwarf2_start_subfile (fe->name, dir, comp_dir);
}
/* Decode the table. */
@@ -6627,17 +6626,16 @@ dwarf_decode_lines (struct line_header *
0-based, but the directory and file name numbers in
the statement program are 1-based. */
struct file_entry *fe;
- char *dir;
+ char *dir = NULL;
file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
line_ptr += bytes_read;
fe = &lh->file_names[file - 1];
if (fe->dir_index)
dir = lh->include_dirs[fe->dir_index - 1];
- else
- dir = comp_dir;
+
if (!decode_for_pst_p)
- dwarf2_start_subfile (fe->name, dir);
+ dwarf2_start_subfile (fe->name, dir, comp_dir);
}
break;
case DW_LNS_set_column:
@@ -6717,7 +6715,8 @@ dwarf_decode_lines (struct line_header *
/* Start a subfile for DWARF. FILENAME is the name of the file and
DIRNAME the name of the source directory which contains FILENAME
- or NULL if not known.
+ or NULL if not known. COMP_DIR is the compilation directory for the
+ linetable's compilation unit or NULL if not known.
This routine tries to keep line numbers from identical absolute and
relative file names in a common subfile.
@@ -6736,8 +6735,10 @@ dwarf_decode_lines (struct line_header *
subfile, so that `break /srcdir/list0.c:1' works as expected. */
static void
-dwarf2_start_subfile (char *filename, char *dirname)
+dwarf2_start_subfile (char *filename, char *dirname, char *comp_dir)
{
+ char *dir = dirname;
+
/* If the filename isn't absolute, try to match an existing subfile
with the full pathname. */
@@ -6757,7 +6758,18 @@ dwarf2_start_subfile (char *filename, ch
}
xfree (fullname);
}
- start_subfile (filename, dirname);
+
+ /* Make the dirname as absolute as possible. */
+
+ if (dirname == NULL)
+ dir = comp_dir;
+ else if (!IS_ABSOLUTE_PATH (dirname) && comp_dir != NULL)
+ dir = concat (comp_dir, SLASH_STRING, dirname, (char *)NULL);
+
+ start_subfile (filename, dir);
+
+ if (dirname != NULL && dir != dirname)
+ xfree(dir);
}
static void