This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [rfc, frame] Always check for unsaved PC
- From: Andreas Schwab <schwab at suse dot de>
- To: gdb-patches at sourceware dot org
- Date: Thu, 11 Jan 2007 17:34:22 +0100
- Subject: Re: [rfc, frame] Always check for unsaved PC
- References: <20060819161139.GC25238@nevyn.them.org> <200608201427.k7KERnD0001824@elgar.sibelius.xs4all.nl> <20061110201548.GA1115@nevyn.them.org>
Daniel Jacobowitz <drow@false.org> writes:
> @@ -1111,6 +1141,42 @@ get_prev_frame_1 (struct frame_info *thi
> return NULL;
> }
>
> + /* Check that this and the next frame do not unwind the PC register
> + to the same memory location. If they do, then even though they
> + have different frame IDs, the new frame will be bogus; two
> + functions can't share a register save slot for the PC. This can
> + happen when the prologue analyzer finds a stack adjustment, but
> + no PC save. This check does assume that the "PC register" is
> + roughly a traditional PC, even if the gdbarch_unwind_pc method
> + frobs it. */
> + if (this_frame->level > 0
> + && get_frame_type (this_frame) == NORMAL_FRAME
> + && get_frame_type (this_frame->next) == NORMAL_FRAME)
> + {
> + int optimized, realnum;
> + enum lval_type lval, nlval;
> + CORE_ADDR addr, naddr;
> +
> + frame_register_unwind_location (this_frame, PC_REGNUM, &optimized,
> + &lval, &addr, &realnum);
> + frame_register_unwind_location (get_next_frame (this_frame), PC_REGNUM,
> + &optimized, &nlval, &naddr, &realnum);
> +
This is broken. You can't use PC_REGNUM unconditionally without checking
whether that register actually exists. The ia64 does not have such a
register.
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
PGP key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."