* dwarf2read.c (dwarf2_debug_line_missing_file_complaint): New

function.
	(dwarf_decode_lines): Check for line info without a file.
This commit is contained in:
Daniel Jacobowitz 2007-05-14 17:15:20 +00:00
parent af2cbe8c98
commit 25e43795f0
2 changed files with 68 additions and 34 deletions

View File

@ -1,3 +1,10 @@
2007-05-14 Paul Brook <paul@codesourcery.com>
Daniel Jacobowitz <dan@codesourcery.com>
* dwarf2read.c (dwarf2_debug_line_missing_file_complaint): New
function.
(dwarf_decode_lines): Check for line info without a file.
2007-05-14 Daniel Jacobowitz <dan@codesourcery.com> 2007-05-14 Daniel Jacobowitz <dan@codesourcery.com>
* linux-thread-db.c (thread_db_pid_to_str): Print thread IDs * linux-thread-db.c (thread_db_pid_to_str): Print thread IDs

View File

@ -687,6 +687,13 @@ dwarf2_statement_list_fits_in_line_number_section_complaint (void)
_("statement list doesn't fit in .debug_line section")); _("statement list doesn't fit in .debug_line section"));
} }
static void
dwarf2_debug_line_missing_file_complaint (void)
{
complaint (&symfile_complaints,
_(".debug_line section has line data without a file"));
}
static void static void
dwarf2_complex_location_expr_complaint (void) dwarf2_complex_location_expr_complaint (void)
{ {
@ -6708,19 +6715,24 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
address += (adj_opcode / lh->line_range) address += (adj_opcode / lh->line_range)
* lh->minimum_instruction_length; * lh->minimum_instruction_length;
line += lh->line_base + (adj_opcode % lh->line_range); line += lh->line_base + (adj_opcode % lh->line_range);
lh->file_names[file - 1].included_p = 1; if (lh->num_file_names < file)
if (!decode_for_pst_p) dwarf2_debug_line_missing_file_complaint ();
{ else
if (last_subfile != current_subfile) {
{ lh->file_names[file - 1].included_p = 1;
if (last_subfile) if (!decode_for_pst_p)
record_line (last_subfile, 0, address); {
last_subfile = current_subfile; if (last_subfile != current_subfile)
{
if (last_subfile)
record_line (last_subfile, 0, address);
last_subfile = current_subfile;
}
/* Append row to matrix using current values. */
record_line (current_subfile, line,
check_cu_functions (address, cu));
} }
/* Append row to matrix using current values. */ }
record_line (current_subfile, line,
check_cu_functions (address, cu));
}
basic_block = 1; basic_block = 1;
} }
else switch (op_code) else switch (op_code)
@ -6734,9 +6746,15 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
{ {
case DW_LNE_end_sequence: case DW_LNE_end_sequence:
end_sequence = 1; end_sequence = 1;
lh->file_names[file - 1].included_p = 1;
if (!decode_for_pst_p) if (lh->num_file_names < file)
record_line (current_subfile, 0, address); dwarf2_debug_line_missing_file_complaint ();
else
{
lh->file_names[file - 1].included_p = 1;
if (!decode_for_pst_p)
record_line (current_subfile, 0, address);
}
break; break;
case DW_LNE_set_address: case DW_LNE_set_address:
address = read_address (abfd, line_ptr, cu, &bytes_read); address = read_address (abfd, line_ptr, cu, &bytes_read);
@ -6769,17 +6787,22 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
} }
break; break;
case DW_LNS_copy: case DW_LNS_copy:
lh->file_names[file - 1].included_p = 1; if (lh->num_file_names < file)
if (!decode_for_pst_p) dwarf2_debug_line_missing_file_complaint ();
else
{ {
if (last_subfile != current_subfile) lh->file_names[file - 1].included_p = 1;
{ if (!decode_for_pst_p)
if (last_subfile) {
record_line (last_subfile, 0, address); if (last_subfile != current_subfile)
last_subfile = current_subfile; {
} if (last_subfile)
record_line (current_subfile, line, record_line (last_subfile, 0, address);
check_cu_functions (address, cu)); last_subfile = current_subfile;
}
record_line (current_subfile, line,
check_cu_functions (address, cu));
}
} }
basic_block = 0; basic_block = 0;
break; break;
@ -6802,15 +6825,19 @@ dwarf_decode_lines (struct line_header *lh, char *comp_dir, bfd *abfd,
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]; if (lh->num_file_names < file)
if (fe->dir_index) dwarf2_debug_line_missing_file_complaint ();
dir = lh->include_dirs[fe->dir_index - 1]; else
{
if (!decode_for_pst_p) fe = &lh->file_names[file - 1];
{ if (fe->dir_index)
last_subfile = current_subfile; dir = lh->include_dirs[fe->dir_index - 1];
dwarf2_start_subfile (fe->name, dir, comp_dir); if (!decode_for_pst_p)
} {
last_subfile = current_subfile;
dwarf2_start_subfile (fe->name, dir, comp_dir);
}
}
} }
break; break;
case DW_LNS_set_column: case DW_LNS_set_column: