This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch rfc] Add the frame's type to the unwinder


Hello,

The attached patch, moves the frame's type into `struct frame_unwind' and in doing so makes it possible to combine the sequence:

    prev->type = frame_type_from_pc()
    prev->unwind = frame_unwind_find_by_pc()

into a single:

    prev->unwind = frame_unwind_find_by_pc();
    // prev->type == prev->unwind->type;

and hence eliminate the the call to frame_type_from_pc().


Fine print:


While the above is true for new code, old code continues to use the same confused combination of frame_type_from_pc(), frame_unwind_find_by_pc(), deprecated_set_frame_type(), and legacy_get_prev_frame(). A legacy frame's type is initialized to UNKNOWN_FRAME, and then zero or more of those functions will override it. get_frame_type() mapping an UNKNOWN_FRAME onto a NORMAL_FRAME.

Importantly, if a legacy frame's unwinder returns a known frame type (!UNKNOWN_FRAME) then that will be used in preference to any other value. This should make it possible for old architectures to incrementally implement new unwinders.


Tested on d10v, ppc, and i386. I'll commit in a few days,

I've checked this in.


Andrew


2003-04-02 Andrew Cagney <cagney at redhat dot com>

	* frame.c (get_prev_frame): Do not call frame_type_from_pc.  Set
	the frame's type from the unwinder.
	(get_frame_type): Map UNKNOWN_FRAME onto NORMAL_FRAME.
	(create_new_frame, legacy_get_prev_frame): When the unwinder's
	type isn't UNKNOWN_FRAME, initalize "type" from the unwinder.
	(get_frame_base_address): Use get_frame_type.
	(get_frame_locals_address, get_frame_args_address): Ditto.
	(legacy_saved_regs_unwinder): Set the type to UNKNOWN_TYPE.
	* frame.h (enum frame_type): Add UNKNOWN_FRAME.
	(struct frame_info): Add comment explaining why the frame contains
	a "type" field.
	* dummy-frame.c (dummy_frame_unwind): Set the type to DUMMY_FRAME.
	* d10v-tdep.c (d10v_frame_unwind): Set the type to NORMAL_FRAME.
	* sentinel-frame.c (sentinel_frame_unwinder): Set the type to
	NORMAL_FRAME.
	* frame-unwind.h: Include "frame.h".
	(struct frame_unwind): Add "type" field.
	* Makefile.in (frame_unwind_h): Add $(frame_h).
	
Inde



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]