2006-04-21 Frederic Riss <frederic.riss@st.com>

* dwarf2read.c (dwarf2_start_subfile): Change prototype to accept
	compilation directory as last argument.
	Always pass comp_dir as second argument to start_subfile and prepend
	dirname to the filename when necessary.
	Remove now superfluous search for pre-existing subfile.
	(dwarf_decode_lines): Pass the compilation directory to
	dwarf2_start_subfile.
This commit is contained in:
Frederic Riss 2006-04-21 20:26:07 +00:00
parent 5c182d5fce
commit 4f1520fbca
2 changed files with 42 additions and 29 deletions

View file

@ -1,3 +1,13 @@
2006-04-21 Frederic Riss <frederic.riss@st.com>
* dwarf2read.c (dwarf2_start_subfile): Change prototype to accept
compilation directory as last argument.
Always pass comp_dir as second argument to start_subfile and prepend
dirname to the filename when necessary.
Remove now superfluous search for pre-existing subfile.
(dwarf_decode_lines): Pass the compilation directory to
dwarf2_start_subfile.
2006-04-20 Daniel Jacobowitz <dan@codesourcery.com>
* m68klinux-tdep.c (m68k_linux_sigtramp_frame_prev_register):

View file

@ -846,7 +846,7 @@ static struct line_header *(dwarf_decode_line_header
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 *lh, char *comp_dir, bfd *abfd,
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 *lh, char *comp_dir, bfd *abfd,
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 *lh, char *comp_dir, bfd *abfd,
/* 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.
@ -6733,31 +6732,35 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
files.files[1].dir: /srcdir
The line number information for list0.c has to end up in a single
subfile, so that `break /srcdir/list0.c:1' works as expected. */
subfile, so that `break /srcdir/list0.c:1' works as expected.
start_subfile will ensure that this happens provided that we pass the
concatenation of files.files[1].dir and files.files[1].name as the
subfile's name. */
static void
dwarf2_start_subfile (char *filename, char *dirname)
dwarf2_start_subfile (char *filename, char *dirname, char *comp_dir)
{
/* If the filename isn't absolute, try to match an existing subfile
with the full pathname. */
char *fullname;
/* While reading the DIEs, we call start_symtab(DW_AT_name, DW_AT_comp_dir).
`start_symtab' will always pass the contents of DW_AT_comp_dir as
second argument to start_subfile. To be consistent, we do the
same here. In order not to lose the line information directory,
we concatenate it to the filename when it makes sense.
Note that the Dwarf3 standard says (speaking of filenames in line
information): ``The directory index is ignored for file names
that represent full path names''. Thus ignoring dirname in the
`else' branch below isn't an issue. */
if (!IS_ABSOLUTE_PATH (filename) && dirname != NULL)
{
struct subfile *subfile;
char *fullname = concat (dirname, "/", filename, (char *)NULL);
fullname = concat (dirname, SLASH_STRING, filename, (char *)NULL);
else
fullname = filename;
for (subfile = subfiles; subfile; subfile = subfile->next)
{
if (FILENAME_CMP (subfile->name, fullname) == 0)
{
current_subfile = subfile;
xfree (fullname);
return;
}
}
xfree (fullname);
}
start_subfile (filename, dirname);
start_subfile (fullname, comp_dir);
if (fullname != filename)
xfree (fullname);
}
static void