forked from Imagelibrary/binutils-gdb
* dwarf2read.c (dwarf_decode_lines): Properly deal with
unknown standard opcodes.
This commit is contained in:
@@ -3963,7 +3963,18 @@ dwarf_decode_lines (unsigned int offset, char *comp_dir, bfd *abfd,
|
||||
{
|
||||
op_code = read_1_byte (abfd, line_ptr);
|
||||
line_ptr += 1;
|
||||
switch (op_code)
|
||||
|
||||
if (op_code >= lh.opcode_base)
|
||||
{ /* Special operand. */
|
||||
adj_opcode = op_code - lh.opcode_base;
|
||||
address += (adj_opcode / lh.line_range)
|
||||
* lh.minimum_instruction_length;
|
||||
line += lh.line_base + (adj_opcode % lh.line_range);
|
||||
/* append row to matrix using current values */
|
||||
record_line (current_subfile, line, address);
|
||||
basic_block = 1;
|
||||
}
|
||||
else switch (op_code)
|
||||
{
|
||||
case DW_LNS_extended_op:
|
||||
line_ptr += 1; /* ignore length */
|
||||
@@ -4061,14 +4072,15 @@ dwarf_decode_lines (unsigned int offset, char *comp_dir, bfd *abfd,
|
||||
address += read_2_bytes (abfd, line_ptr);
|
||||
line_ptr += 2;
|
||||
break;
|
||||
default: /* special operand */
|
||||
adj_opcode = op_code - lh.opcode_base;
|
||||
address += (adj_opcode / lh.line_range)
|
||||
* lh.minimum_instruction_length;
|
||||
line += lh.line_base + (adj_opcode % lh.line_range);
|
||||
/* append row to matrix using current values */
|
||||
record_line (current_subfile, line, address);
|
||||
basic_block = 1;
|
||||
default:
|
||||
{ /* Unknown standard opcode, ignore it. */
|
||||
int i;
|
||||
for (i = 0; i < lh.standard_opcode_lengths[op_code]; i++)
|
||||
{
|
||||
(void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
|
||||
line_ptr += bytes_read;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user