}
/* Loop over the stop chain and determine if execution stopped in an
- inlined frame because of a user breakpoint. THIS_PC is the current
- frame's PC. */
+ inlined frame because of a user breakpoint set at FRAME_BLOCK. */
static bool
-stopped_by_user_bp_inline_frame (CORE_ADDR this_pc, bpstat stop_chain)
+stopped_by_user_bp_inline_frame (const block *frame_block, bpstat stop_chain)
{
for (bpstat s = stop_chain; s != NULL; s = s->next)
{
bp_location *loc = s->bp_location_at;
enum bp_loc_type t = loc->loc_type;
- if (loc->address == this_pc
- && (t == bp_loc_software_breakpoint
- || t == bp_loc_hardware_breakpoint))
+ if ((t == bp_loc_software_breakpoint
+ || t == bp_loc_hardware_breakpoint)
+ && frame_block == SYMBOL_BLOCK_VALUE (loc->symbol))
return true;
}
}
{
/* Do not skip the inlined frame if execution
stopped in an inlined frame because of a user
- breakpoint. */
- if (!stopped_by_user_bp_inline_frame (this_pc, stop_chain))
- {
- skip_count++;
- last_sym = BLOCK_FUNCTION (cur_block);
- }
+ breakpoint for this inline function. */
+ if (stopped_by_user_bp_inline_frame (cur_block, stop_chain))
+ break;
+
+ skip_count++;
+ last_sym = BLOCK_FUNCTION (cur_block);
}
else
break;
return y + inline_func3 (x);
}
+/* A static inlined function that is called by another static inlined
+ function. */
+
+static inline ATTR int
+func_callee (int x)
+{
+ return x * 23;
+}
+
+/* A static inlined function that calls another static inlined
+ function. The body of the function is as simple as possible so
+ that both functions are inlined to the same PC address. */
+
+static int
+func_caller (int x)
+{
+ return func_callee (x);
+}
+
/* Entry point. */
int
x = not_inline_func3 (-21);
+ func_caller (1);
+
return x;
}
}
}
+# func_caller and func_callee are both inline functions, and one calls
+# the other. Test that setting a breakpoint on the caller reports the
+# stop at the caller, and that setting a breakpoint at the callee
+# reports a stop at the callee.
+foreach_with_prefix func {"func_callee" "func_caller"} {
+ clean_restart $binfile
+
+ if {![runto main]} {
+ untested "could not run to main"
+ continue
+ }
+
+ gdb_breakpoint $func
+ gdb_test "continue" "Breakpoint .* $func .*at .*$srcfile.*" \
+ "continue to inline function"
+}
+
unset -nocomplain results