* dwarf2read.c (dwarf_decode_lines): Properly deal with
authorGeoffrey Keating <geoffk@geoffk.org>
Mon, 12 Nov 2001 20:36:55 +0000 (20:36 +0000)
committerGeoffrey Keating <geoffk@geoffk.org>
Mon, 12 Nov 2001 20:36:55 +0000 (20:36 +0000)
unknown standard opcodes.

gdb/ChangeLog
gdb/dwarf2read.c

index 4d1d19a12952ae264861ba7cfc0d2b5f1f7c1a4d..f2ddf39a576648c548a5118bab8c4403dc52bb28 100644 (file)
@@ -1,3 +1,8 @@
+2001-11-11  Geoffrey Keating  <geoffk@redhat.com>
+
+       * dwarf2read.c (dwarf_decode_lines): Properly deal with
+       unknown standard opcodes.
+
 2001-11-11  Andrew Cagney  <ac131313@redhat.com>
 
        * README (alpha-dec-osf5.1): Mention -DUSE_LDR_ROUTINES.
index 16a3e23080e608f033e7272c42820e0f70dadf2c..2ecfe8a7a1c71ee354bcc2daeb59a6f2e20e3214 100644 (file)
@@ -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;
+                 }
+             }
            }
        }
     }