binutils-gdb/gdb/testsuite/gdb.opt
Keith Seitz ddfe970e6b Don't elide all inlined frames
This patch essentially causes GDB to treat inlined frames like "normal"
frames from the user's perspective.  This means, for example, that when a
user sets a breakpoint in an inlined function, GDB will now actually stop
"in" that function.

Using the test case from breakpoints/17534,

3	static inline void NVIC_EnableIRQ(int IRQn)
4	{
5	  volatile int y;
6	  y = IRQn;
7	}
8
9	__attribute__( ( always_inline ) ) static inline void __WFI(void)
10	{
11	    __asm volatile ("nop");
12	}
13
14	int main(void) {
15
16	    x= 42;
17
18	    if (x)
19	      NVIC_EnableIRQ(16);
20	    else
21	      NVIC_EnableIRQ(18);
(gdb) b NVIC_EnableIRQ
Breakpoint 1 at 0x4003e4: NVIC_EnableIRQ. (2 locations)
(gdb) r
Starting program: 17534

Breakpoint 1, main () at 17534.c:19
19	      NVIC_EnableIRQ(16);

Because skip_inline_frames currently skips every inlined frame, GDB "stops"
in the caller.  This patch adds a new parameter to skip_inline_frames
that allows us to pass in a bpstat stop chain.  The breakpoint locations
on the stop chain can be used to determine if we've stopped inside an inline
function (due to a user breakpoint).  If we have, we do not elide the frame.

With this patch, GDB now reports that the inferior has stopped inside the
inlined function:

(gdb) r
Starting program: 17534

Breakpoint 1, NVIC_EnableIRQ (IRQn=16) at 17534.c:6
6	  y = IRQn;

Many thanks to Jan and Pedro for guidance on this.

gdb/ChangeLog:

	* breakpoint.c (build_bpstat_chain): New function, moved from
	bpstat_stop_status.
	(bpstat_stop_status): Add optional parameter, `stop_chain'.
	If no stop chain is passed, call build_bpstat_chain to build it.
	* breakpoint.h (build_bpstat_chain): Declare.
	(bpstat_stop_status): Move documentation here from breakpoint.c.
	* infrun.c (handle_signal_stop): Before eliding inlined frames,
	build the stop chain and pass it to skip_inline_frames.
	Pass this stop chain to bpstat_stop_status.
	* inline-frame.c: Include breakpoint.h.
	(stopped_by_user_bp_inline_frame): New function.
	(skip_inline_frames): Add parameter `stop_chain'.
	Move documention to inline-frame.h.
	If non-NULL, use stopped_by_user_bp_inline_frame to determine
	whether the frame should be elided.
	* inline-frame.h (skip_inline_frames): Add parameter `stop_chain'.
	Add moved documentation and update for new parameter.

gdb/testsuite/ChangeLog:

	* gdb.ada/bp_inlined_func.exp: Update inlined frame locations
	in expected breakpoint stop locations.
	* gdb.dwarf2/implptr.exp (implptr_test_baz): Use up/down to
	move to proper scope to test variable values.
	* gdb.opt/inline-break.c (inline_func1, not_inline_func1)
	(inline_func2, not_inline_func2, inline_func3, not_inline_func3):
	New functions.
	(main): Call not_inline_func3.
	* gdb.opt/inline-break.exp: Start inferior and set breakpoints at
	inline_func1, inline_func2, and inline_func3.  Test that when each
	breakpoint is hit, GDB properly reports both the stop location
	and the backtrace. Repeat tests for temporary breakpoints.
2018-05-17 12:15:11 -07:00
..
clobbered-registers-O2.c Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
clobbered-registers-O2.exp Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
inline-break.c Don't elide all inlined frames 2018-05-17 12:15:11 -07:00
inline-break.exp Don't elide all inlined frames 2018-05-17 12:15:11 -07:00
inline-bt.c Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
inline-bt.exp Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
inline-cmds.c Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
inline-cmds.exp Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
inline-locals.c Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
inline-locals.exp Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
inline-markers.c Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
solib-intra-step-lib.c Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
solib-intra-step-main.c Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00
solib-intra-step.exp Update copyright year range in all GDB files 2018-01-02 07:38:06 +04:00