2012-01-19 Tristan Gingold <gingold@adacore.com>

* dwarf.c (process_extended_line_op): Reindent define_file output.
	Detect define_file opcode length mismatch.
	(display_debug_lines_decoded): Add an entry in file_table for each
	define_file opcode.
	Ignore DW_LNE_set_discriminator and DW_LNE_HP_set_sequence.
	Display extended opcode for unhandle opcode.
This commit is contained in:
Tristan Gingold 2012-01-19 11:34:44 +00:00
parent 8da108ce40
commit 143a3db098
2 changed files with 39 additions and 10 deletions

View File

@ -1,3 +1,12 @@
2012-01-19 Tristan Gingold <gingold@adacore.com>
* dwarf.c (process_extended_line_op): Reindent define_file output.
Detect define_file opcode length mismatch.
(display_debug_lines_decoded): Add an entry in file_table for each
define_file opcode.
Ignore DW_LNE_set_discriminator and DW_LNE_HP_set_sequence.
Display extended opcode for unhandle opcode.
2012-01-17 Alan Modra <amodra@gmail.com>
* version.c (print_version): Update copyright message year.

View File

@ -247,6 +247,7 @@ process_extended_line_op (unsigned char *data, int is_stmt)
unsigned int len;
unsigned char *name;
dwarf_vma adr;
unsigned char *orig_data = data;
len = read_leb128 (data, & bytes_read, 0);
data += bytes_read;
@ -277,7 +278,7 @@ process_extended_line_op (unsigned char *data, int is_stmt)
break;
case DW_LNE_define_file:
printf (_(" define new File Table entry\n"));
printf (_("define new File Table entry\n"));
printf (_(" Entry\tDir\tTime\tSize\tName\n"));
printf (" %d\t", ++state_machine_regs.last_file_entry);
@ -288,7 +289,11 @@ process_extended_line_op (unsigned char *data, int is_stmt)
printf ("%s\t", dwarf_vmatoa ("u", read_leb128 (data, & bytes_read, 0)));
data += bytes_read;
printf ("%s\t", dwarf_vmatoa ("u", read_leb128 (data, & bytes_read, 0)));
printf ("%s\n\n", name);
data += bytes_read;
printf ("%s", name);
if (data - orig_data != len)
printf (_(" [Bad opcode length]"));
printf ("\n\n");
break;
case DW_LNE_set_discriminator:
@ -2800,7 +2805,9 @@ display_debug_lines_decoded (struct dwarf_section *section,
int offset_size;
int i;
File_Entry *file_table = NULL;
unsigned int n_files = 0;
unsigned char **directory_table = NULL;
unsigned int n_directories = 0;
hdrptr = data;
@ -2885,7 +2892,6 @@ display_debug_lines_decoded (struct dwarf_section *section,
data = standard_opcodes + linfo.li_opcode_base - 1;
if (*data != 0)
{
unsigned int n_directories = 0;
unsigned char *ptr_directory_table = data;
while (*data != 0)
@ -2912,7 +2918,6 @@ display_debug_lines_decoded (struct dwarf_section *section,
/* Traverse the File Name table just to count the entries. */
if (*data != 0)
{
unsigned int n_files = 0;
unsigned char *ptr_file_name_table = data;
while (*data != 0)
@ -3044,21 +3049,36 @@ display_debug_lines_decoded (struct dwarf_section *section,
break;
case DW_LNE_define_file:
{
unsigned int dir_index = 0;
file_table = (File_Entry *) xrealloc
(file_table, (n_files + 1) * sizeof (File_Entry));
++state_machine_regs.last_file_entry;
/* Source file name. */
file_table[n_files].name = op_code_data;
op_code_data += strlen ((char *) op_code_data) + 1;
dir_index = read_leb128 (op_code_data, & bytes_read, 0);
/* Directory index. */
file_table[n_files].directory_index =
read_leb128 (op_code_data, & bytes_read, 0);
op_code_data += bytes_read;
read_leb128 (op_code_data, & bytes_read, 0);
/* Last modification time. */
file_table[n_files].modification_date =
read_leb128 (op_code_data, & bytes_read, 0);
op_code_data += bytes_read;
read_leb128 (op_code_data, & bytes_read, 0);
/* File length. */
file_table[n_files].length =
read_leb128 (op_code_data, & bytes_read, 0);
printf ("%s:\n", directory_table[dir_index]);
n_files++;
break;
}
case DW_LNE_set_discriminator:
case DW_LNE_HP_set_sequence:
/* Simply ignored. */
break;
default:
printf (_("UNKNOWN: length %d\n"), ext_op_code_len - bytes_read);
printf (_("UNKNOWN (%u): length %d\n"),
ext_op_code, ext_op_code_len - bytes_read);
break;
}
data += ext_op_code_len;