aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorRomain Chastenet <romain.chastenet@free.fr>2014-06-09 15:06:58 +0100
committerNick Clifton <nickc@redhat.com>2014-06-09 15:09:02 +0100
commitd71ad7fcb80503e5bd2dec76fa1ad7f030e72995 (patch)
treea4ff238bc33a762ce365fac7c37fc46c2dd168aa /binutils
parent203e84589f591db087e72f02100f45858519d532 (diff)
downloadgdb-d71ad7fcb80503e5bd2dec76fa1ad7f030e72995.zip
gdb-d71ad7fcb80503e5bd2dec76fa1ad7f030e72995.tar.gz
gdb-d71ad7fcb80503e5bd2dec76fa1ad7f030e72995.tar.bz2
Correctly save and recall the CFA saved register state.
PR binutils/16252 * dwarf.c (display_debug_frames): Remember the state of the cfa_offset, cfa_reg, ra and cfa_exp field
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog6
-rw-r--r--binutils/dwarf.c20
2 files changed, 20 insertions, 6 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 0dc603a..50cb6cc 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2014-06-09 Romain Chastenet <romain.chastenet@free.fr>
+
+ PR binutils/16252
+ * dwarf.c (display_debug_frames): Remember the state of the
+ cfa_offset, cfa_reg, ra and cfa_exp field
+
2014-06-05 Joel Brobecker <brobecker@adacore.com>
* Makefile.am (CONFIG_STATUS_DEPENDENCIES): Add dependency on
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index c8360b5..a6986ad 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -5829,12 +5829,16 @@ display_debug_frames (struct dwarf_section *section,
if (! do_debug_frames_interp)
printf (" DW_CFA_remember_state\n");
rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
+ rs->cfa_offset = fc->cfa_offset;
+ rs->cfa_reg = fc->cfa_reg;
+ rs->ra = fc->ra;
+ rs->cfa_exp = fc->cfa_exp;
rs->ncols = fc->ncols;
rs->col_type = (short int *) xcmalloc (rs->ncols,
- sizeof (short int));
- rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (int));
- memcpy (rs->col_type, fc->col_type, rs->ncols);
- memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (int));
+ sizeof (* rs->col_type));
+ rs->col_offset = (int *) xcmalloc (rs->ncols, sizeof (* rs->col_offset));
+ memcpy (rs->col_type, fc->col_type, rs->ncols * sizeof (* fc->col_type));
+ memcpy (rs->col_offset, fc->col_offset, rs->ncols * sizeof (* fc->col_offset));
rs->next = remembered_state;
remembered_state = rs;
break;
@@ -5846,10 +5850,14 @@ display_debug_frames (struct dwarf_section *section,
if (rs)
{
remembered_state = rs->next;
+ fc->cfa_offset = rs->cfa_offset;
+ fc->cfa_reg = rs->cfa_reg;
+ fc->ra = rs->ra;
+ fc->cfa_exp = rs->cfa_exp;
frame_need_space (fc, rs->ncols - 1);
- memcpy (fc->col_type, rs->col_type, rs->ncols);
+ memcpy (fc->col_type, rs->col_type, rs->ncols * sizeof (* rs->col_type));
memcpy (fc->col_offset, rs->col_offset,
- rs->ncols * sizeof (int));
+ rs->ncols * sizeof (* rs->col_offset));
free (rs->col_type);
free (rs->col_offset);
free (rs);