X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fdwarf2cfi.c;h=81fa207130727a8a29c7037b07fdec9c58369401;hb=20a0e81d7ad1d99add65f1787c8791ba6d360eea;hp=8d9567f4af72729270a035b84e3abeec58beb132;hpb=9b94f7bfd5f81a59fcd02bdbc6d330c4c86f79fc;p=binutils-gdb.git diff --git a/gdb/dwarf2cfi.c b/gdb/dwarf2cfi.c index 8d9567f4af7..81fa2071307 100644 --- a/gdb/dwarf2cfi.c +++ b/gdb/dwarf2cfi.c @@ -1,5 +1,7 @@ /* Stack unwinding code based on dwarf2 frame info for GDB, the GNU debugger. - Copyright 2001, 2002 Free Software Foundation, Inc. + + Copyright 2001, 2002, 2003 Free Software Foundation, Inc. + Contributed by Jiri Smid, SuSE Labs. Based on code written by Daniel Berlin (dan@dberlin.org). @@ -30,6 +32,7 @@ #include "inferior.h" #include "regcache.h" #include "dwarf2cfi.h" +#include "gdb_assert.h" /* Common Information Entry - holds information that is shared among many Frame Descriptors. */ @@ -89,37 +92,6 @@ struct fde_array int array_size; }; -struct context_reg -{ - union - { - unsigned int reg; - long offset; - CORE_ADDR addr; - } - loc; - enum - { - REG_CTX_UNSAVED, - REG_CTX_SAVED_OFFSET, - REG_CTX_SAVED_REG, - REG_CTX_SAVED_ADDR, - REG_CTX_VALUE, - } - how; -}; - -/* This is the register and unwind state for a particular frame. */ -struct context -{ - struct context_reg *reg; - - CORE_ADDR cfa; - CORE_ADDR ra; - void *lsda; - int args_size; -}; - struct frame_state_reg { union @@ -186,7 +158,7 @@ enum ptr_encoding PE_funcrel = DW_EH_PE_funcrel }; -#define UNWIND_CONTEXT(fi) ((struct context *) (fi->context)) +#define UNWIND_CONTEXT(fi) ((struct context *) (deprecated_get_frame_context (fi))) static struct cie_unit *cie_chunks; @@ -198,39 +170,40 @@ extern file_ptr dwarf_frame_offset; extern unsigned int dwarf_frame_size; extern file_ptr dwarf_eh_frame_offset; extern unsigned int dwarf_eh_frame_size; +extern asection *dwarf_frame_section; +extern asection *dwarf_eh_frame_section; + extern char *dwarf2_read_section (struct objfile *objfile, file_ptr offset, - unsigned int size); + unsigned int size, asection *sectp); static struct fde_unit *fde_unit_alloc (void); static struct cie_unit *cie_unit_alloc (void); static void fde_chunks_need_space (); -static struct context *context_alloc (); -static struct frame_state *frame_state_alloc (); static void unwind_tmp_obstack_init (); static void unwind_tmp_obstack_free (); -static void context_cpy (struct context *dst, struct context *src); - -static unsigned int read_1u (bfd * abfd, char **p); -static int read_1s (bfd * abfd, char **p); -static unsigned int read_2u (bfd * abfd, char **p); -static int read_2s (bfd * abfd, char **p); -static unsigned int read_4u (bfd * abfd, char **p); -static int read_4s (bfd * abfd, char **p); -static ULONGEST read_8u (bfd * abfd, char **p); -static LONGEST read_8s (bfd * abfd, char **p); - -static ULONGEST read_uleb128 (bfd * abfd, char **p); -static LONGEST read_sleb128 (bfd * abfd, char **p); -static CORE_ADDR read_pointer (bfd * abfd, char **p); -static CORE_ADDR read_encoded_pointer (bfd * abfd, char **p, + +static unsigned int read_1u (bfd *abfd, char **p); +static int read_1s (bfd *abfd, char **p); +static unsigned int read_2u (bfd *abfd, char **p); +static int read_2s (bfd *abfd, char **p); +static unsigned int read_4u (bfd *abfd, char **p); +static int read_4s (bfd *abfd, char **p); +static ULONGEST read_8u (bfd *abfd, char **p); +static LONGEST read_8s (bfd *abfd, char **p); + +static ULONGEST read_uleb128 (bfd *abfd, char **p); +static LONGEST read_sleb128 (bfd *abfd, char **p); +static CORE_ADDR read_pointer (bfd *abfd, char **p); +static CORE_ADDR read_encoded_pointer (bfd *abfd, char **p, unsigned char encoding); -static enum ptr_encoding pointer_encoding (unsigned char encoding); +static enum ptr_encoding pointer_encoding (unsigned char encoding, + struct objfile *objfile); -static LONGEST read_initial_length (bfd * abfd, char *buf, int *bytes_read); -static ULONGEST read_length (bfd * abfd, char *buf, int *bytes_read, +static LONGEST read_initial_length (bfd *abfd, char *buf, int *bytes_read); +static ULONGEST read_length (bfd *abfd, char *buf, int *bytes_read, int dwarf64); static int is_cie (ULONGEST cie_id, int dwarf64); @@ -273,7 +246,7 @@ cie_unit_alloc (void) } static void -fde_chunks_need_space () +fde_chunks_need_space (void) { if (fde_chunks.elems < fde_chunks.array_size) return; @@ -285,8 +258,8 @@ fde_chunks_need_space () } /* Alocate a new `struct context' on temporary obstack. */ -static struct context * -context_alloc () +struct context * +context_alloc (void) { struct context *context; @@ -302,8 +275,8 @@ context_alloc () } /* Alocate a new `struct frame_state' on temporary obstack. */ -static struct frame_state * -frame_state_alloc () +struct frame_state * +frame_state_alloc (void) { struct frame_state *fs; @@ -319,44 +292,35 @@ frame_state_alloc () } static void -unwind_tmp_obstack_init () +unwind_tmp_obstack_init (void) { obstack_init (&unwind_tmp_obstack); } static void -unwind_tmp_obstack_free () +unwind_tmp_obstack_free (void) { obstack_free (&unwind_tmp_obstack, NULL); unwind_tmp_obstack_init (); } -static void +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 */ + /* Since `struct context' contains a pointer to an array with + register values, make sure we end up with a copy of that array, + and not with a copy of the pointer to that array. */ dreg = dst->reg; *dst = *src; dst->reg = dreg; - memcpy (dst->reg, src->reg, regs_size); } static unsigned int -read_1u (bfd * abfd, char **p) +read_1u (bfd *abfd, char **p) { unsigned ret; @@ -366,7 +330,7 @@ read_1u (bfd * abfd, char **p) } static int -read_1s (bfd * abfd, char **p) +read_1s (bfd *abfd, char **p) { int ret; @@ -376,17 +340,17 @@ read_1s (bfd * abfd, char **p) } static unsigned int -read_2u (bfd * abfd, char **p) +read_2u (bfd *abfd, char **p) { unsigned ret; ret = bfd_get_16 (abfd, (bfd_byte *) * p); - (*p)++; + (*p) += 2; return ret; } static int -read_2s (bfd * abfd, char **p) +read_2s (bfd *abfd, char **p) { int ret; @@ -396,7 +360,7 @@ read_2s (bfd * abfd, char **p) } static unsigned int -read_4u (bfd * abfd, char **p) +read_4u (bfd *abfd, char **p) { unsigned int ret; @@ -406,7 +370,7 @@ read_4u (bfd * abfd, char **p) } static int -read_4s (bfd * abfd, char **p) +read_4s (bfd *abfd, char **p) { int ret; @@ -416,7 +380,7 @@ read_4s (bfd * abfd, char **p) } static ULONGEST -read_8u (bfd * abfd, char **p) +read_8u (bfd *abfd, char **p) { ULONGEST ret; @@ -426,7 +390,7 @@ read_8u (bfd * abfd, char **p) } static LONGEST -read_8s (bfd * abfd, char **p) +read_8s (bfd *abfd, char **p) { LONGEST ret; @@ -436,7 +400,7 @@ read_8s (bfd * abfd, char **p) } static ULONGEST -read_uleb128 (bfd * abfd, char **p) +read_uleb128 (bfd *abfd, char **p) { ULONGEST ret; int i, shift; @@ -460,7 +424,7 @@ read_uleb128 (bfd * abfd, char **p) } static LONGEST -read_sleb128 (bfd * abfd, char **p) +read_sleb128 (bfd *abfd, char **p) { LONGEST ret; int i, shift, size, num_read; @@ -490,7 +454,7 @@ read_sleb128 (bfd * abfd, char **p) } static CORE_ADDR -read_pointer (bfd * abfd, char **p) +read_pointer (bfd *abfd, char **p) { switch (TARGET_ADDR_BIT / TARGET_CHAR_BIT) { @@ -499,15 +463,17 @@ read_pointer (bfd * abfd, char **p) case 8: return read_8u (abfd, p); default: - error ("dwarf cfi error: unsupported target address length."); + error + ("dwarf cfi error: unsupported target address length [in module %s]", + bfd_get_filename (abfd)); } } -/* This functions only reads appropriate amount of data from *p - * and returns the resulting value. Calling function must handle - * different encoding possibilities itself! */ +/* Read the appropriate amount of data from *P and return the + resulting value based on ENCODING, which the calling function must + provide. */ static CORE_ADDR -read_encoded_pointer (bfd * abfd, char **p, unsigned char encoding) +read_encoded_pointer (bfd *abfd, char **p, unsigned char encoding) { CORE_ADDR ret; @@ -546,23 +512,26 @@ read_encoded_pointer (bfd * abfd, char **p, unsigned char encoding) default: internal_error (__FILE__, __LINE__, - "read_encoded_pointer: unknown pointer encoding"); + "read_encoded_pointer: unknown pointer encoding [in module %s]", + bfd_get_filename (abfd)); } return ret; } -/* Variable 'encoding' carries 3 different flags: - * - encoding & 0x0f : size of the address (handled in read_encoded_pointer()) - * - encoding & 0x70 : type (absolute, relative, ...) - * - encoding & 0x80 : indirect flag (DW_EH_PE_indirect == 0x80). */ +/* The variable 'encoding' carries three different flags: + - encoding & 0x0f : size of the address (handled in read_encoded_pointer()) + - encoding & 0x70 : type (absolute, relative, ...) + - encoding & 0x80 : indirect flag (DW_EH_PE_indirect == 0x80). */ enum ptr_encoding -pointer_encoding (unsigned char encoding) +pointer_encoding (unsigned char encoding, struct objfile *objfile) { int ret; if (encoding & DW_EH_PE_indirect) - warning ("CFI: Unsupported pointer encoding: DW_EH_PE_indirect"); + warning + ("CFI: Unsupported pointer encoding: DW_EH_PE_indirect [in module %s]", + objfile->name); switch (encoding & 0x70) { @@ -574,13 +543,15 @@ pointer_encoding (unsigned char encoding) ret = encoding & 0x70; break; default: - internal_error (__FILE__, __LINE__, "CFI: unknown pointer encoding"); + internal_error (__FILE__, __LINE__, + "CFI: unknown pointer encoding [in module %s]", + objfile->name); } return ret; } static LONGEST -read_initial_length (bfd * abfd, char *buf, int *bytes_read) +read_initial_length (bfd *abfd, char *buf, int *bytes_read) { LONGEST ret = 0; @@ -600,7 +571,7 @@ read_initial_length (bfd * abfd, char *buf, int *bytes_read) } static ULONGEST -read_length (bfd * abfd, char *buf, int *bytes_read, int dwarf64) +read_length (bfd *abfd, char *buf, int *bytes_read, int dwarf64) { if (dwarf64) { @@ -651,8 +622,10 @@ execute_cfa_program (struct objfile *objfile, char *insn_ptr, char *insn_end, fs->pc = read_encoded_pointer (objfile->obfd, &insn_ptr, fs->addr_encoding); - if (pointer_encoding (fs->addr_encoding) != PE_absptr) - warning ("CFI: DW_CFA_set_loc uses relative addressing"); + if (pointer_encoding (fs->addr_encoding, objfile) != PE_absptr) + warning + ("CFI: DW_CFA_set_loc uses relative addressing [in module %s]", + objfile->name); break; @@ -801,7 +774,9 @@ execute_cfa_program (struct objfile *objfile, char *insn_ptr, char *insn_end, break; default: - error ("dwarf cfi error: unknown cfa instruction %d.", insn); + error + ("dwarf cfi error: unknown cfa instruction %d [in module %s]", + insn, objfile->name); } } } @@ -844,24 +819,20 @@ frame_state_for (struct context *context, struct frame_state *fs) fs->pc = fde->initial_location; - if (fde->cie_ptr) - { - cie = fde->cie_ptr; - - fs->code_align = cie->code_align; - fs->data_align = cie->data_align; - fs->retaddr_column = cie->ra; - fs->addr_encoding = cie->addr_encoding; - fs->objfile = cie->objfile; - - execute_cfa_program (cie->objfile, cie->data, - cie->data + cie->data_length, context, fs); - execute_cfa_program (cie->objfile, fde->data, - fde->data + fde->data_length, context, fs); - } - else - internal_error (__FILE__, __LINE__, - "%s(): Internal error: fde->cie_ptr==NULL !", __func__); + gdb_assert (fde->cie_ptr != NULL); + + cie = fde->cie_ptr; + + fs->code_align = cie->code_align; + fs->data_align = cie->data_align; + fs->retaddr_column = cie->ra; + fs->addr_encoding = cie->addr_encoding; + fs->objfile = cie->objfile; + + execute_cfa_program (cie->objfile, cie->data, + cie->data + cie->data_length, context, fs); + execute_cfa_program (cie->objfile, fde->data, + fde->data + fde->data_length, context, fs); } static void @@ -870,14 +841,14 @@ get_reg (char *reg, struct context *context, int regnum) switch (context->reg[regnum].how) { case REG_CTX_UNSAVED: - read_register_gen (regnum, reg); + deprecated_read_register_gen (regnum, reg); break; case REG_CTX_SAVED_OFFSET: target_read_memory (context->cfa + context->reg[regnum].loc.offset, reg, REGISTER_RAW_SIZE (regnum)); break; case REG_CTX_SAVED_REG: - read_register_gen (context->reg[regnum].loc.reg, reg); + deprecated_read_register_gen (context->reg[regnum].loc.reg, reg); break; case REG_CTX_SAVED_ADDR: target_read_memory (context->reg[regnum].loc.addr, @@ -1068,25 +1039,33 @@ execute_stack_op (struct objfile *objfile, case DW_OP_dup: if (stack_elt < 1) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); result = stack[stack_elt - 1]; break; case DW_OP_drop: if (--stack_elt < 0) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); goto no_push; case DW_OP_pick: offset = *op_ptr++; if (offset >= stack_elt - 1) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); result = stack[stack_elt - 1 - offset]; break; case DW_OP_over: if (stack_elt < 2) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); result = stack[stack_elt - 2]; break; @@ -1095,7 +1074,9 @@ execute_stack_op (struct objfile *objfile, CORE_ADDR t1, t2, t3; if (stack_elt < 3) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); t1 = stack[stack_elt - 1]; t2 = stack[stack_elt - 2]; t3 = stack[stack_elt - 3]; @@ -1113,7 +1094,9 @@ execute_stack_op (struct objfile *objfile, case DW_OP_plus_uconst: /* Unary operations. */ if (--stack_elt < 0) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); result = stack[stack_elt]; switch (op) @@ -1123,7 +1106,8 @@ execute_stack_op (struct objfile *objfile, int len = TARGET_ADDR_BIT / TARGET_CHAR_BIT; if (len != 4 && len != 8) internal_error (__FILE__, __LINE__, - "execute_stack_op error"); + "execute_stack_op error [in module %s]", + objfile->name); result = read_memory_unsigned_integer (result, len); } break; @@ -1131,9 +1115,10 @@ execute_stack_op (struct objfile *objfile, case DW_OP_deref_size: { int len = *op_ptr++; - if (len != 1 && len != 2 && len != 4 && len !=8) + if (len != 1 && len != 2 && len != 4 && len != 8) internal_error (__FILE__, __LINE__, - "execute_stack_op error"); + "execute_stack_op error [in module %s]", + objfile->name); result = read_memory_unsigned_integer (result, len); } break; @@ -1173,7 +1158,9 @@ execute_stack_op (struct objfile *objfile, /* Binary operations. */ CORE_ADDR first, second; if ((stack_elt -= 2) < 0) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); second = stack[stack_elt]; first = stack[stack_elt + 1]; @@ -1230,7 +1217,10 @@ execute_stack_op (struct objfile *objfile, case DW_OP_ne: result = (LONGEST) first != (LONGEST) second; break; - default: /* This label is here just to avoid warning. */ + default: + error + ("execute_stack_op: Unknown DW_OP_ value [in module %s]", + objfile->name); break; } } @@ -1243,7 +1233,9 @@ execute_stack_op (struct objfile *objfile, case DW_OP_bra: if (--stack_elt < 0) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); offset = read_2s (objfile->obfd, &op_ptr); if (stack[stack_elt] != 0) op_ptr += offset; @@ -1253,12 +1245,16 @@ execute_stack_op (struct objfile *objfile, goto no_push; default: - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); } /* Most things push a result value. */ if ((size_t) stack_elt >= sizeof (stack) / sizeof (*stack)) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", + objfile->name); stack[++stack_elt] = result; no_push:; } @@ -1266,7 +1262,8 @@ execute_stack_op (struct objfile *objfile, /* We were executing this program to get a value. It should be at top of stack. */ if (--stack_elt < 0) - internal_error (__FILE__, __LINE__, "execute_stack_op error"); + internal_error (__FILE__, __LINE__, + "execute_stack_op error [in module %s]", objfile->name); return stack[stack_elt]; } @@ -1274,7 +1271,7 @@ static void update_context (struct context *context, struct frame_state *fs, int chain) { struct context *orig_context; - CORE_ADDR cfa; + CORE_ADDR cfa = 0; long i; unwind_tmp_obstack_init (); @@ -1349,9 +1346,10 @@ update_context (struct context *context, struct frame_state *fs, int chain) context->reg[i].how = REG_CTX_SAVED_ADDR; context->reg[i].loc.addr = orig_context->reg[fs->regs.reg[i].loc.reg].loc.addr; + break; default: - internal_error (__FILE__, __LINE__, - "%s: unknown register rule", __func__); + internal_error (__FILE__, __LINE__, "bad switch 0x%02X", + orig_context->reg[fs->regs.reg[i].loc.reg].how); } break; case REG_SAVED_EXP: @@ -1368,8 +1366,8 @@ update_context (struct context *context, struct frame_state *fs, int chain) } break; default: - internal_error (__FILE__, __LINE__, - "%s: unknown register rule", __func__); + internal_error (__FILE__, __LINE__, "bad switch 0x%02X", + fs->regs.reg[i].how); } get_reg ((char *) &context->ra, context, fs->retaddr_column); unwind_tmp_obstack_free (); @@ -1412,7 +1410,8 @@ compare_fde_unit (const void *a, const void *b) -- mludvig */ static void parse_frame_info (struct objfile *objfile, file_ptr frame_offset, - unsigned int frame_size, int eh_frame) + unsigned int frame_size, asection *frame_section, + int eh_frame) { bfd *abfd = objfile->obfd; asection *curr_section_ptr; @@ -1427,7 +1426,8 @@ parse_frame_info (struct objfile *objfile, file_ptr frame_offset, unwind_tmp_obstack_init (); - frame_buffer = dwarf2_read_section (objfile, frame_offset, frame_size); + frame_buffer = dwarf2_read_section (objfile, frame_offset, frame_size, + frame_section); start = frame_buffer; end = frame_buffer + frame_size; @@ -1579,13 +1579,14 @@ parse_frame_info (struct objfile *objfile, file_ptr frame_offset, cie = cie->next; } if (!cie) - error ("CFI: can't find CIE pointer"); + error ("CFI: can't find CIE pointer [in module %s]", + bfd_get_filename (abfd)); } init_loc = read_encoded_pointer (abfd, &start, cie->addr_encoding); - switch (pointer_encoding (cie->addr_encoding)) + switch (pointer_encoding (cie->addr_encoding, objfile)) { case PE_absptr: break; @@ -1595,7 +1596,8 @@ parse_frame_info (struct objfile *objfile, file_ptr frame_offset, init_loc += curr_section_vma + start - frame_buffer; break; default: - warning ("CFI: Unsupported pointer encoding\n"); + warning ("CFI: Unsupported pointer encoding [in module %s]", + bfd_get_filename (abfd)); } /* For relocatable objects we must add an offset telling @@ -1680,18 +1682,20 @@ dwarf2_build_frame_info (struct objfile *objfile) if (dwarf_frame_offset) { parse_frame_info (objfile, dwarf_frame_offset, - dwarf_frame_size, 0 /* = debug_frame */ ); + dwarf_frame_size, dwarf_frame_section, + 0 /* = debug_frame */ ); after_debug_frame = 1; } if (dwarf_eh_frame_offset) parse_frame_info (objfile, dwarf_eh_frame_offset, dwarf_eh_frame_size, + dwarf_eh_frame_section, 1 /* = eh_frame */ + after_debug_frame); } /* Return the frame address. */ CORE_ADDR -cfi_read_fp () +cfi_read_fp (void) { struct context *context; struct frame_state *fs; @@ -1734,7 +1738,7 @@ cfi_write_fp (CORE_ADDR val) if (fs->cfa_how == CFA_REG_OFFSET) { val -= fs->cfa_offset; - write_register_gen (fs->cfa_reg, (char *) &val); + deprecated_write_register_gen (fs->cfa_reg, (char *) &val); } else warning ("Can't write fp."); @@ -1753,8 +1757,8 @@ cfi_pop_frame (struct frame_info *fi) for (regnum = 0; regnum < NUM_REGS; regnum++) { get_reg (regbuf, UNWIND_CONTEXT (fi), regnum); - write_register_bytes (REGISTER_BYTE (regnum), regbuf, - REGISTER_RAW_SIZE (regnum)); + deprecated_write_register_bytes (REGISTER_BYTE (regnum), regbuf, + REGISTER_RAW_SIZE (regnum)); } write_register (PC_REGNUM, UNWIND_CONTEXT (fi)->ra); @@ -1792,13 +1796,19 @@ cfi_frame_chain (struct frame_info *fi) } /* Sets the pc of the frame. */ -void +CORE_ADDR cfi_init_frame_pc (int fromleaf, struct frame_info *fi) { - if (fi->next) - get_reg ((char *) &(fi->pc), UNWIND_CONTEXT (fi->next), PC_REGNUM); + if (get_next_frame (fi)) + { + CORE_ADDR pc; + /* FIXME: cagney/2002-12-04: This is straight wrong. It's + assuming that the PC is CORE_ADDR (a host quantity) in size. */ + get_reg ((void *) &pc, UNWIND_CONTEXT (get_next_frame (fi)), PC_REGNUM); + return pc; + } else - fi->pc = read_pc (); + return read_pc (); } /* Initialize unwind context informations of the frame. */ @@ -1810,21 +1820,23 @@ cfi_init_extra_frame_info (int fromleaf, struct frame_info *fi) unwind_tmp_obstack_init (); fs = frame_state_alloc (); - fi->context = frame_obstack_alloc (sizeof (struct context)); + deprecated_set_frame_context (fi, + frame_obstack_zalloc (sizeof + (struct context))); UNWIND_CONTEXT (fi)->reg = - frame_obstack_alloc (sizeof (struct context_reg) * NUM_REGS); + frame_obstack_zalloc (sizeof (struct context_reg) * NUM_REGS); memset (UNWIND_CONTEXT (fi)->reg, 0, sizeof (struct context_reg) * NUM_REGS); - if (fi->next) + if (get_next_frame (fi)) { - context_cpy (UNWIND_CONTEXT (fi), UNWIND_CONTEXT (fi->next)); + context_cpy (UNWIND_CONTEXT (fi), UNWIND_CONTEXT (get_next_frame (fi))); frame_state_for (UNWIND_CONTEXT (fi), fs); update_context (UNWIND_CONTEXT (fi), fs, 1); } else { - UNWIND_CONTEXT (fi)->ra = fi->pc + 1; + UNWIND_CONTEXT (fi)->ra = get_frame_pc (fi) + 1; frame_state_for (UNWIND_CONTEXT (fi), fs); update_context (UNWIND_CONTEXT (fi), fs, 0); } @@ -1863,9 +1875,9 @@ cfi_get_saved_register (char *raw_buffer, if (addrp) /* default assumption: not found in memory */ *addrp = 0; - if (!frame->next) + if (!get_next_frame (frame)) { - read_register_gen (regnum, raw_buffer); + deprecated_read_register_gen (regnum, raw_buffer); if (lval != NULL) *lval = lval_register; if (addrp != NULL) @@ -1873,11 +1885,11 @@ cfi_get_saved_register (char *raw_buffer, } else { - frame = frame->next; + frame = get_next_frame (frame); switch (UNWIND_CONTEXT (frame)->reg[regnum].how) { case REG_CTX_UNSAVED: - read_register_gen (regnum, raw_buffer); + deprecated_read_register_gen (regnum, raw_buffer); if (lval != NULL) *lval = not_lval; if (optimized != NULL) @@ -1895,8 +1907,8 @@ cfi_get_saved_register (char *raw_buffer, UNWIND_CONTEXT (frame)->reg[regnum].loc.offset; break; case REG_CTX_SAVED_REG: - read_register_gen (UNWIND_CONTEXT (frame)->reg[regnum].loc.reg, - raw_buffer); + deprecated_read_register_gen (UNWIND_CONTEXT (frame)->reg[regnum]. + loc.reg, raw_buffer); if (lval != NULL) *lval = lval_register; if (addrp != NULL) @@ -1921,7 +1933,8 @@ cfi_get_saved_register (char *raw_buffer, break; default: internal_error (__FILE__, __LINE__, - "cfi_get_saved_register: unknown register rule"); + "cfi_get_saved_register: unknown register rule 0x%02X", + UNWIND_CONTEXT (frame)->reg[regnum].how); } } }