From 5d085aafc80256c43cf1229e212158cf0afb1b2b Mon Sep 17 00:00:00 2001 From: Michal Ludvig Date: Tue, 14 May 2002 08:24:26 +0000 Subject: [PATCH] 2002-05-14 Michal Ludvig * dwarf2cfi.c (context_cpy): Copy registers correctly. (update_context): Use __func__ in warnings. --- gdb/ChangeLog | 5 +++++ gdb/dwarf2cfi.c | 22 ++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 53970ab6994..70046f2803d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2002-05-14 Michal Ludvig + + * dwarf2cfi.c (context_cpy): Copy registers correctly. + (update_context): Use __func__ in warnings. + 2002-05-14 Daniel Jacobowitz * ser-tcp.c: Include . Rename tcp_open diff --git a/gdb/dwarf2cfi.c b/gdb/dwarf2cfi.c index a62a1e0f45d..0cc342fa93f 100644 --- a/gdb/dwarf2cfi.c +++ b/gdb/dwarf2cfi.c @@ -318,11 +318,25 @@ static void context_cpy (struct context *dst, struct context *src) { int regs_size = sizeof (struct context_reg) * NUM_REGS; + struct context_reg *dreg; + /* Structure dst contains a pointer to an array of + * registers of a given frame as well as src does. This + * array was already allocated before dst was passed to + * context_cpy but the pointer to it was overriden by + * '*dst = *src' and the array was lost. This led to the + * situation, that we've had a copy of src placed in dst, + * but both of them pointed to the same regs array and + * thus we've sometimes blindly rewritten it. Now we save + * the pointer before copying src to dst, return it back + * after that and copy the registers into their new place + * finally. --- mludvig@suse.cz */ + dreg = dst->reg; *dst = *src; + dst->reg = dreg; + memcpy (dst->reg, src->reg, regs_size); } - static unsigned int read_1u (bfd *abfd, char **p) @@ -1301,7 +1315,7 @@ update_context (struct context *context, struct frame_state *fs, int chain) orig_context->reg[fs->regs.reg[i].loc.reg].loc.addr; default: internal_error (__FILE__, __LINE__, - "cfi_update_context: unknown register rule"); + "%s: unknown register rule", __func__); } break; case REG_SAVED_EXP: @@ -1319,8 +1333,7 @@ update_context (struct context *context, struct frame_state *fs, int chain) break; default: internal_error (__FILE__, __LINE__, - "cfi_update_context: unknown register rule"); - + "%s: unknown register rule", __func__); } get_reg ((char *) &context->ra, context, fs->retaddr_column); unwind_tmp_obstack_free (); @@ -1578,6 +1591,7 @@ cfi_frame_chain (struct frame_info *fi) cfa = context->cfa; unwind_tmp_obstack_free (); + return cfa; }