aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/python/py-finishbreakpoint.c3
-rw-r--r--gdb/testsuite/gdb.python/py-finish-breakpoint.c14
-rw-r--r--gdb/testsuite/gdb.python/py-finish-breakpoint.exp25
3 files changed, 41 insertions, 1 deletions
diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c
index 627eb29..7f3658d 100644
--- a/gdb/python/py-finishbreakpoint.c
+++ b/gdb/python/py-finishbreakpoint.c
@@ -212,7 +212,8 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs)
"be set on a dummy frame."));
}
else
- frame_id = get_frame_id (prev_frame);
+ /* Get the real calling frame ID, ignoring inline frames. */
+ frame_id = frame_unwind_caller_id (frame);
}
}
catch (const gdb_exception &except)
diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint.c b/gdb/testsuite/gdb.python/py-finish-breakpoint.c
index 4ae2d18..76552a6 100644
--- a/gdb/testsuite/gdb.python/py-finish-breakpoint.c
+++ b/gdb/testsuite/gdb.python/py-finish-breakpoint.c
@@ -34,6 +34,19 @@ void increase (int *a)
increase_1 (a);
}
+int increase_2 (int *a)
+{
+ *a += 10;
+ return -8;
+}
+
+inline void __attribute__((always_inline))
+increase_inlined (int *a)
+{
+ increase_2 (a);
+ *a += 5;
+}
+
int
test_1 (int i, int j)
{
@@ -85,6 +98,7 @@ int main (int argc, char *argv[])
increase (&i);
increase (&i);
increase (&i);
+ increase_inlined (&i);
for (i = 0; i < 10; i++)
{
diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint.exp b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp
index e5a4687..a6efd24 100644
--- a/gdb/testsuite/gdb.python/py-finish-breakpoint.exp
+++ b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp
@@ -86,6 +86,31 @@ with_test_prefix "normal conditions" {
}
#
+# Test FinishBreakpoint returning to an inlined function
+#
+
+with_test_prefix "return to inlined function" {
+ clean_restart ${testfile}
+ gdb_load_shlib ${lib_sl}
+
+ gdb_test "source $python_file" "Python script imported.*" \
+ "import python scripts"
+
+ if {![runto_main]} {
+ return 0
+ }
+
+ gdb_breakpoint "increase_2"
+ gdb_test "continue" "Breakpoint .*at.*" "continue to the function to finish"
+
+ gdb_test "python finishbp_inline = MyFinishBreakpoint (gdb.parse_and_eval ('a'), gdb.newest_frame ())" \
+ "Temporary breakpoint.*" "set FinishBreakpoint returning to inlined frame"
+ gdb_test "continue" "MyFinishBreakpoint stop with.*return_value is: -8.*#0.*increase_inlined.*" \
+ "check MyFinishBreakpoint hit"
+ gdb_test "python print (finishbp_inline.return_value)" "-8.*" "check return_value"
+}
+
+#
# Test FinishBreakpoint with no debug symbol
#