diff options
author | Geoffrey Keating <geoffk@geoffk.org> | 2001-11-12 20:36:55 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@geoffk.org> | 2001-11-12 20:36:55 +0000 |
commit | 9aa1fe7eee9169fed74ed3b8b5810be12fb53ca0 (patch) | |
tree | c23e2f438da357ff69f6a23668b80fc1ea8447b2 /gdb/dwarf2read.c | |
parent | 1902c51fa6c7592a74d1006067ab61aabef4ac33 (diff) | |
download | gdb-9aa1fe7eee9169fed74ed3b8b5810be12fb53ca0.zip gdb-9aa1fe7eee9169fed74ed3b8b5810be12fb53ca0.tar.gz gdb-9aa1fe7eee9169fed74ed3b8b5810be12fb53ca0.tar.bz2 |
* dwarf2read.c (dwarf_decode_lines): Properly deal with
unknown standard opcodes.
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r-- | gdb/dwarf2read.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 16a3e23..2ecfe8a 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -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; + } + } } } } |