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:
parent
5c182d5fce
commit
4f1520fbca
2 changed files with 42 additions and 29 deletions
|
@ -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>
|
2006-04-20 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
|
|
||||||
* m68klinux-tdep.c (m68k_linux_sigtramp_frame_prev_register):
|
* m68klinux-tdep.c (m68k_linux_sigtramp_frame_prev_register):
|
||||||
|
|
|
@ -846,7 +846,7 @@ static struct line_header *(dwarf_decode_line_header
|
||||||
static void dwarf_decode_lines (struct line_header *, char *, bfd *,
|
static void dwarf_decode_lines (struct line_header *, char *, bfd *,
|
||||||
struct dwarf2_cu *, struct partial_symtab *);
|
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 *,
|
static struct symbol *new_symbol (struct die_info *, struct type *,
|
||||||
struct dwarf2_cu *);
|
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
|
directory and file name numbers in the statement program
|
||||||
are 1-based. */
|
are 1-based. */
|
||||||
struct file_entry *fe = &lh->file_names[file - 1];
|
struct file_entry *fe = &lh->file_names[file - 1];
|
||||||
char *dir;
|
char *dir = NULL;
|
||||||
|
|
||||||
if (fe->dir_index)
|
if (fe->dir_index)
|
||||||
dir = lh->include_dirs[fe->dir_index - 1];
|
dir = lh->include_dirs[fe->dir_index - 1];
|
||||||
else
|
|
||||||
dir = comp_dir;
|
dwarf2_start_subfile (fe->name, dir, comp_dir);
|
||||||
dwarf2_start_subfile (fe->name, dir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Decode the table. */
|
/* 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
|
0-based, but the directory and file name numbers in
|
||||||
the statement program are 1-based. */
|
the statement program are 1-based. */
|
||||||
struct file_entry *fe;
|
struct file_entry *fe;
|
||||||
char *dir;
|
char *dir = NULL;
|
||||||
|
|
||||||
file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
|
file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
|
||||||
line_ptr += bytes_read;
|
line_ptr += bytes_read;
|
||||||
fe = &lh->file_names[file - 1];
|
fe = &lh->file_names[file - 1];
|
||||||
if (fe->dir_index)
|
if (fe->dir_index)
|
||||||
dir = lh->include_dirs[fe->dir_index - 1];
|
dir = lh->include_dirs[fe->dir_index - 1];
|
||||||
else
|
|
||||||
dir = comp_dir;
|
|
||||||
if (!decode_for_pst_p)
|
if (!decode_for_pst_p)
|
||||||
dwarf2_start_subfile (fe->name, dir);
|
dwarf2_start_subfile (fe->name, dir, comp_dir);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DW_LNS_set_column:
|
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
|
/* Start a subfile for DWARF. FILENAME is the name of the file and
|
||||||
DIRNAME the name of the source directory which contains FILENAME
|
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
|
This routine tries to keep line numbers from identical absolute and
|
||||||
relative file names in a common subfile.
|
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
|
files.files[1].dir: /srcdir
|
||||||
|
|
||||||
The line number information for list0.c has to end up in a single
|
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
|
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
|
char *fullname;
|
||||||
with the full pathname. */
|
|
||||||
|
/* 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)
|
if (!IS_ABSOLUTE_PATH (filename) && dirname != NULL)
|
||||||
{
|
fullname = concat (dirname, SLASH_STRING, filename, (char *)NULL);
|
||||||
struct subfile *subfile;
|
else
|
||||||
char *fullname = concat (dirname, "/", filename, (char *)NULL);
|
fullname = filename;
|
||||||
|
|
||||||
for (subfile = subfiles; subfile; subfile = subfile->next)
|
start_subfile (fullname, comp_dir);
|
||||||
{
|
|
||||||
if (FILENAME_CMP (subfile->name, fullname) == 0)
|
if (fullname != filename)
|
||||||
{
|
xfree (fullname);
|
||||||
current_subfile = subfile;
|
|
||||||
xfree (fullname);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xfree (fullname);
|
|
||||||
}
|
|
||||||
start_subfile (filename, dirname);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Add table
Reference in a new issue