| Index: gdb/frame.c
|
| diff --git a/gdb/frame.c b/gdb/frame.c
|
| index 2bb843e1cae75f1356c149950e5c8dabc0293235..b7698733c2aea38d1a2b0c1329325980c5008521 100644
|
| --- a/gdb/frame.c
|
| +++ b/gdb/frame.c
|
| @@ -309,7 +309,8 @@ fprint_frame (struct ui_file *file, struct frame_info *fi)
|
| static struct frame_info *
|
| skip_inlined_frames (struct frame_info *frame)
|
| {
|
| - while (get_frame_type (frame) == INLINE_FRAME)
|
| + while (get_frame_type (frame) == INLINE_FRAME
|
| + || get_frame_type (frame) == TAILCALL_FRAME)
|
| frame = get_prev_frame (frame);
|
|
|
| return frame;
|
| @@ -814,6 +815,11 @@ frame_pop (struct frame_info *this_frame)
|
| if (!prev_frame)
|
| error (_("Cannot pop the initial frame."));
|
|
|
| + /* Ignore TAILCALL_FRAME type frames, they were executed already before
|
| + entering THISFRAME. */
|
| + while (get_frame_type (prev_frame) == TAILCALL_FRAME)
|
| + prev_frame = get_prev_frame (prev_frame);
|
| +
|
| /* Make a copy of all the register values unwound from this frame.
|
| Save them in a scratch buffer so that there isn't a race between
|
| trying to extract the old values from the current regcache while
|
| @@ -1031,6 +1037,26 @@ get_frame_register_unsigned (struct frame_info *frame, int regnum)
|
| return frame_unwind_register_unsigned (frame->next, regnum);
|
| }
|
|
|
| +int
|
| +read_frame_register_unsigned (struct frame_info *frame, int regnum,
|
| + ULONGEST *val)
|
| +{
|
| + struct value *regval = get_frame_register_value (frame, regnum);
|
| +
|
| + if (!value_optimized_out (regval)
|
| + && value_entirely_available (regval))
|
| + {
|
| + struct gdbarch *gdbarch = get_frame_arch (frame);
|
| + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
| + int size = register_size (gdbarch, VALUE_REGNUM (regval));
|
| +
|
| + *val = extract_unsigned_integer (value_contents (regval), size, byte_order);
|
| + return 1;
|
| + }
|
| +
|
| + return 0;
|
| +}
|
| +
|
| void
|
| put_frame_register (struct frame_info *frame, int regnum,
|
| const gdb_byte *buf)
|
| @@ -2096,6 +2122,8 @@ find_frame_sal (struct frame_info *frame, struct symtab_and_line *sal)
|
| we can't do much better. */
|
| sal->pc = get_frame_pc (frame);
|
|
|
| + sal->pspace = get_frame_program_space (frame);
|
| +
|
| return;
|
| }
|
|
|
|
|