[PATCH] internal error when .cfi_remember_state encountered first in a function
Jan Beulich
JBeulich@novell.com
Thu Oct 7 09:43:00 GMT 2004
When generating Dwarf unwind information, a .cfi_remember_state
encountered
prior to any advance of the location counter caused an internal error.
Built and tested on i686-pc-linux-gnu.
Jan
gas/
2004-10-07 Jan Beulich <jbeulich@novell.com>
* dw2gencfi.c (select_cie_for_fde): When separating CIE out
from
FDE, treat a DW_CFA_remember_state as we do a
DW_CFA_advance_loc.
gas/testsuite/
2004-10-07 Jan Beulich <jbeulich@novell.com>
* cfi/cfi-common-4.[ds]: New.
* cfi/cfi.exp: Run new test.
---
/home/jbeulich/src/binutils/mainline/2004-10-06.09.37/gas/dw2gencfi.c 2004-10-06
09:35:49.000000000 +0200
+++ 2004-10-06.09.37/gas/dw2gencfi.c 2004-10-07 11:27:11.726089600
+0200
@@ -341,6 +341,8 @@ cfi_add_CFA_restore_state (void)
cfa_save_stack = p->next;
free (p);
}
+ else
+ as_bad (_("CFI state restore without previous remember"));
}
@@ -933,8 +935,9 @@ select_cie_for_fde (struct fde_entry *fd
switch (i->insn)
{
case DW_CFA_advance_loc:
- /* We reached the first advance in the FDE, but did not
- reach the end of the CIE list. */
+ case DW_CFA_remember_state:
+ /* We reached the first advance/remember in the FDE, but
+ did not reach the end of the CIE list. */
goto fail;
case DW_CFA_offset:
@@ -975,11 +978,12 @@ select_cie_for_fde (struct fde_entry *fd
}
/* Success if we reached the end of the CIE list, and we've
either
- run out of FDE entries or we've encountered an advance or
- escape. */
+ run out of FDE entries or we've encountered an advance,
+ remember, or escape. */
if (i == cie->last
&& (!j
|| j->insn == DW_CFA_advance_loc
+ || j->insn == DW_CFA_remember_state
|| j->insn == CFI_escape))
{
*pfirst = j;
@@ -997,6 +1001,7 @@ select_cie_for_fde (struct fde_entry *fd
for (i = cie->first; i ; i = i->next)
if (i->insn == DW_CFA_advance_loc
+ || i->insn == DW_CFA_remember_state
|| i->insn == CFI_escape)
break;
---
/home/jbeulich/src/binutils/mainline/2004-10-06.09.37/gas/testsuite/gas/cfi/cfi-common-4.d 1970-01-01
01:00:00.000000000 +0100
+++
2004-10-06.09.37/gas/testsuite/gas/cfi/cfi-common-4.d 2004-10-07
11:15:25.000000000 +0200
@@ -0,0 +1,20 @@
+#readelf: -wf
+#name: CFI common 4
+The section .eh_frame contains:
+
+00000000 00000010 00000000 CIE
+ Version: 1
+ Augmentation: "zR"
+ Code alignment factor: .*
+ Data alignment factor: .*
+ Return address column: .*
+ Augmentation data: 1b
+#...
+00000014 00000010 00000018 FDE cie=00000000 pc=.*
+ DW_CFA_remember_state
+ DW_CFA_restore_state
+#...
+00000028 00000010 0000002c FDE cie=00000000 pc=.*
+ DW_CFA_remember_state
+ DW_CFA_restore_state
+#pass
---
/home/jbeulich/src/binutils/mainline/2004-10-06.09.37/gas/testsuite/gas/cfi/cfi-common-4.s 1970-01-01
01:00:00.000000000 +0100
+++
2004-10-06.09.37/gas/testsuite/gas/cfi/cfi-common-4.s 2004-10-07
11:16:54.000000000 +0200
@@ -0,0 +1,9 @@
+ .cfi_startproc simple
+ .cfi_remember_state
+ .cfi_restore_state
+ .cfi_endproc
+
+ .cfi_startproc simple
+ .cfi_remember_state
+ .cfi_restore_state
+ .cfi_endproc
---
/home/jbeulich/src/binutils/mainline/2004-10-06.09.37/gas/testsuite/gas/cfi/cfi.exp 2004-03-18
01:49:23.000000000 +0100
+++ 2004-10-06.09.37/gas/testsuite/gas/cfi/cfi.exp 2004-10-07
11:22:19.538508864 +0200
@@ -64,3 +64,4 @@ run_list_test "cfi-diag-1" ""
run_dump_test "cfi-common-1"
run_dump_test "cfi-common-2"
run_dump_test "cfi-common-3"
+run_dump_test "cfi-common-4"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: binutils-mainline-cfi-remember-state.patch
Type: application/octet-stream
Size: 3530 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20041007/875b4f21/attachment.obj>
More information about the Binutils
mailing list