Correctly save and recall the CFA saved register state.
authorRomain Chastenet <romain.chastenet@free.fr>
Mon, 9 Jun 2014 14:06:58 +0000 (15:06 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 9 Jun 2014 14:09:02 +0000 (15:09 +0100)
PR binutils/16252
* dwarf.c (display_debug_frames): Remember the state of the
cfa_offset, cfa_reg, ra and cfa_exp field

binutils/ChangeLog
binutils/dwarf.c

index 0dc603acd4afc1ffb1b1cb6e84d8bf9dac3074b3..50cb6cc5b333784ccd908771eb9e2df12e83fafd 100644 (file)
@@ -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
index c8360b5d24e4446e0d7d431b19978c485b8dee07..a6986ad4045d8ef9cecb30808e8d637cc840d637 100644 (file)
@@ -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);