diff options
author | Romain Chastenet <romain.chastenet@free.fr> | 2014-06-09 15:06:58 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2014-06-09 15:09:02 +0100 |
commit | d71ad7fcb80503e5bd2dec76fa1ad7f030e72995 (patch) | |
tree | a4ff238bc33a762ce365fac7c37fc46c2dd168aa /binutils | |
parent | 203e84589f591db087e72f02100f45858519d532 (diff) | |
download | gdb-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/ChangeLog | 6 | ||||
-rw-r--r-- | binutils/dwarf.c | 20 |
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); |