]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Handle DW_CFA_GNU_negative_offset_extended.
authorRoland McGrath <roland@redhat.com>
Wed, 1 Apr 2009 22:20:03 +0000 (15:20 -0700)
committerRoland McGrath <roland@redhat.com>
Wed, 1 Apr 2009 22:20:03 +0000 (15:20 -0700)
libdw/unwind.c

index 5d83cb4b2621512064df1c5ee03fe3b33299260b..2bb64398274dea87c55a685fca1dd6f446fb7f99 100644 (file)
@@ -116,7 +116,6 @@ execute_cfi (Dwarf_CFI *cache,
       return true;
     }
 
-
 #define register_rule(regno, r_rule, r_value) do {     \
     if (unlikely (! enough_registers (regno)))         \
       goto out;                                                \
@@ -228,9 +227,17 @@ execute_cfi (Dwarf_CFI *cache,
        case DW_CFA_offset_extended_sf:
          get_uleb128 (operand, program);
          get_sleb128 (sf_offset, program);
+       offset_extended_sf:
          offset = sf_offset * cie->data_alignment_factor;
          goto offset_extended;
 
+       case DW_CFA_GNU_negative_offset_extended:
+         /* GNU extension obsoleted by DW_CFA_offset_extended_sf.  */
+         get_uleb128 (operand, program);
+         get_uleb128 (offset, program);
+         sf_offset = -offset;
+         goto offset_extended_sf;
+
        case DW_CFA_val_offset:
          get_uleb128 (operand, program);
          get_uleb128 (offset, program);
@@ -257,8 +264,8 @@ execute_cfi (Dwarf_CFI *cache,
          /* DW_FORM_block is a ULEB128 length followed by that many bytes.  */
          get_uleb128 (operand, program);
          cfi_assert (operand <= (Dwarf_Word) (end - program));
-         register_rule (regno, expression, offset);
          program += operand;
+         register_rule (regno, expression, offset);
          continue;
 
        case DW_CFA_val_expression:
@@ -267,8 +274,8 @@ execute_cfi (Dwarf_CFI *cache,
          offset = program - (const uint8_t *) cache->data->d_buf;
          get_uleb128 (operand, program);
          cfi_assert (operand <= (Dwarf_Word) (end - program));
-         register_rule (regno, val_expression, offset);
          program += operand;
+         register_rule (regno, val_expression, offset);
          continue;
 
        case DW_CFA_restore_extended: