* gdb/dwarf2-frame.c (decode_frame_entry_1): Decode version 3 CIE
authorPaul Brook <paul@codesourcery.com>
Tue, 8 Jun 2004 13:34:56 +0000 (13:34 +0000)
committerPaul Brook <paul@codesourcery.com>
Tue, 8 Jun 2004 13:34:56 +0000 (13:34 +0000)
records.

gdb/ChangeLog
gdb/dwarf2-frame.c

index 370a5d97f9dc3b2c01668105667a87aac0c67db8..973ad818f6c4d4552d3821517d8da24118aa596c 100644 (file)
@@ -1,3 +1,8 @@
+2004-06-06  Paul Brook  <paul@codesourcery.com>
+
+       * gdb/dwarf2-frame.c (decode_frame_entry_1): Decode version 3 CIE
+       records.
+
 2004-06-08  Paul N. Hilfinger  <Hilfinger@gnat.com>
 
        * ada-lang.c (lookup_symbol_in_language): New function to allow
index fccb94d3e33eca562d012fa93d8906647d32d65a..52ca337cc8b8545b4809b90c7e9bc2266a997eaf 100644 (file)
@@ -1268,6 +1268,7 @@ decode_frame_entry_1 (struct comp_unit *unit, char *start, int eh_frame_p)
       /* This is a CIE.  */
       struct dwarf2_cie *cie;
       char *augmentation;
+      unsigned int cie_version;
 
       /* Record the offset into the .debug_frame section of this CIE.  */
       cie_pointer = start - unit->dwarf_frame_buffer;
@@ -1288,7 +1289,8 @@ decode_frame_entry_1 (struct comp_unit *unit, char *start, int eh_frame_p)
       cie->encoding = encoding_for_size (unit->addr_size);
 
       /* Check version number.  */
-      if (read_1_byte (unit->abfd, buf) != DW_CIE_VERSION)
+      cie_version = read_1_byte (unit->abfd, buf);
+      if (cie_version != 1 && cie_version != 3)
        return NULL;
       buf += 1;
 
@@ -1314,8 +1316,15 @@ decode_frame_entry_1 (struct comp_unit *unit, char *start, int eh_frame_p)
        read_signed_leb128 (unit->abfd, buf, &bytes_read);
       buf += bytes_read;
 
-      cie->return_address_register = read_1_byte (unit->abfd, buf);
-      buf += 1;
+      if (cie_version == 1)
+       {
+         cie->return_address_register = read_1_byte (unit->abfd, buf);
+         bytes_read = 1;
+       }
+      else
+       cie->return_address_register = read_unsigned_leb128 (unit->abfd, buf,
+                                                            &bytes_read);
+      buf += bytes_read;
 
       cie->saw_z_augmentation = (*augmentation == 'z');
       if (cie->saw_z_augmentation)