From: Roland McGrath Date: Mon, 26 Apr 2010 18:54:36 +0000 (-0700) Subject: Revert "Handle partial-reset DW_CFA_def_cfa_* operations after DW_CFA_def_cfa_express... X-Git-Tag: elfutils-0.147~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=55195e58ba85adc5c7f4cb6902c462854093c153;p=thirdparty%2Felfutils.git Revert "Handle partial-reset DW_CFA_def_cfa_* operations after DW_CFA_def_cfa_expression." This reverts commit 3b2486c20c147b420b37a2f610912547b482ee1d. What GCC emits really is bogus. --- diff --git a/libdw/ChangeLog b/libdw/ChangeLog index f927032ec..50fba721c 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -9,10 +9,6 @@ 2010-04-22 Roland McGrath - * cfi.c (execute_cfi): Track last-set CFA regno and offset even - through DW_CFA_def_cfa_expression so DW_CFA_def_cfa_* can reset - to an offset rule and respecify only one or the other. - * cfi.c (execute_cfi): Never return without cleanup. Free FS on failure. (cie_cache_initial_state): Adjust caller to expect that free. diff --git a/libdw/cfi.c b/libdw/cfi.c index 125a1d6df..5936659a7 100644 --- a/libdw/cfi.c +++ b/libdw/cfi.c @@ -124,12 +124,6 @@ execute_cfi (Dwarf_CFI *cache, fs->regs[regno].value = (r_value); \ } while (0) - /* These are the last-set values from DW_CFA_def_cfa* operations. - They are hidden by a DW_CFA_def_cfa_expression operation but can - pop out again if DW_CFA_def_cfa_* is used afterwards. */ - Dwarf_Word last_cfa_regno = -1; - Dwarf_Word last_cfa_offset = -1; - while (program < end) { uint8_t opcode = *program++; @@ -170,47 +164,39 @@ execute_cfi (Dwarf_CFI *cache, switch block for the row-copying (LOC-moving) cases above. */ case DW_CFA_def_cfa: - get_uleb128 (last_cfa_regno, program); - get_uleb128 (last_cfa_offset, program); + get_uleb128 (operand, program); + get_uleb128 (offset, program); def_cfa: - cfi_assert (last_cfa_regno != (Dwarf_Word) -1); - cfi_assert (last_cfa_offset != (Dwarf_Word) -1); fs->cfa_rule = cfa_offset; - fs->cfa_val_reg = last_cfa_regno; - fs->cfa_val_offset = last_cfa_offset; + fs->cfa_val_reg = operand; + fs->cfa_val_offset = offset; /* Prime the rest of the Dwarf_Op so dwarf_frame_cfa can use it. */ fs->cfa_data.offset.atom = DW_OP_bregx; fs->cfa_data.offset.offset = 0; continue; case DW_CFA_def_cfa_register: - get_uleb128 (last_cfa_regno, program); - if (fs->cfa_rule == cfa_expr) - goto def_cfa; - else - cfi_assert (fs->cfa_rule == cfa_offset); - fs->cfa_val_reg = last_cfa_regno; + get_uleb128 (regno, program); + cfi_assert (fs->cfa_rule == cfa_offset); + fs->cfa_val_reg = regno; continue; case DW_CFA_def_cfa_sf: - get_uleb128 (last_cfa_regno, program); + get_uleb128 (operand, program); get_sleb128 (sf_offset, program); offset = sf_offset * cie->data_alignment_factor; goto def_cfa; case DW_CFA_def_cfa_offset: - get_uleb128 (last_cfa_offset, program); + get_uleb128 (offset, program); def_cfa_offset: - if (fs->cfa_rule == cfa_expr) - goto def_cfa; - else - cfi_assert (fs->cfa_rule == cfa_offset); - fs->cfa_val_offset = last_cfa_offset; + cfi_assert (fs->cfa_rule == cfa_offset); + fs->cfa_val_offset = offset; continue; case DW_CFA_def_cfa_offset_sf: get_sleb128 (sf_offset, program); - last_cfa_offset = sf_offset * cie->data_alignment_factor; + offset = sf_offset * cie->data_alignment_factor; goto def_cfa_offset; case DW_CFA_def_cfa_expression: