diff options
-rw-r--r-- | gdb/python/py-finishbreakpoint.c | 3 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-finish-breakpoint.c | 14 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-finish-breakpoint.exp | 25 |
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 # |