From: Roland McGrath Date: Wed, 1 Apr 2009 22:20:03 +0000 (-0700) Subject: Handle DW_CFA_GNU_negative_offset_extended. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=89124513a684ed8ae04a65ad34e217bceb5f330c;p=thirdparty%2Felfutils.git Handle DW_CFA_GNU_negative_offset_extended. --- diff --git a/libdw/unwind.c b/libdw/unwind.c index 5d83cb4b2..2bb643982 100644 --- a/libdw/unwind.c +++ b/libdw/unwind.c @@ -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: