From c239019c9f649867c686204d1ac8947a963784d8 Mon Sep 17 00:00:00 2001 From: Felix Willgerodt Date: Thu, 4 Nov 2021 15:46:45 +0100 Subject: gdb: Avoid warning for the jump command inside an inline function. When stopped inside an inline function, trying to jump to a different line of the same function currently results in a warning about jumping to another function. Fix this by taking inline functions into account. Before: Breakpoint 1, function_inline (x=510) at jump-inline.cpp:22 22 a = a + x; /* inline-funct */ (gdb) j 21 Line 21 is not in `function_inline(int)'. Jump anyway? (y or n) After: Breakpoint 2, function_inline (x=510) at jump-inline.cpp:22 22 a = a + x; /* inline-funct */ (gdb) j 21 Continuing at 0x400679. Breakpoint 1, function_inline (x=510) at jump-inline.cpp:21 21 a += 1020 + a; /* increment-funct */ This was regression-tested on X86-64 Linux. Co-Authored-by: Cristian Sandu Approved-By: Andrew Burgess --- gdb/infcmd.c | 3 ++- gdb/testsuite/gdb.base/jump-inline.c | 30 +++++++++++++++++++++++ gdb/testsuite/gdb.base/jump-inline.exp | 44 ++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.base/jump-inline.c create mode 100644 gdb/testsuite/gdb.base/jump-inline.exp (limited to 'gdb') diff --git a/gdb/infcmd.c b/gdb/infcmd.c index e42927858ba..b12b58db9cb 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1081,7 +1081,8 @@ jump_command (const char *arg, int from_tty) /* See if we are trying to jump to another function. */ fn = get_frame_function (get_current_frame ()); - sfn = find_pc_function (sal.pc); + sfn = find_pc_sect_containing_function (sal.pc, + find_pc_mapped_section (sal.pc)); if (fn != nullptr && sfn != fn) { if (!query (_("Line %d is not in `%s'. Jump anyway? "), sal.line, diff --git a/gdb/testsuite/gdb.base/jump-inline.c b/gdb/testsuite/gdb.base/jump-inline.c new file mode 100644 index 00000000000..17447c2d557 --- /dev/null +++ b/gdb/testsuite/gdb.base/jump-inline.c @@ -0,0 +1,30 @@ +/* Copyright 2021-2023 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +__attribute__((always_inline)) +static void inline +function_inline (int x) +{ + int a = x; + a += 1020 + a; /* increment-funct. */ + a = a + x; /* inline-funct. */ +} + +int +main () +{ + function_inline (510); + return 0; /* out-of-func. */ +} diff --git a/gdb/testsuite/gdb.base/jump-inline.exp b/gdb/testsuite/gdb.base/jump-inline.exp new file mode 100644 index 00000000000..ca0d4f1c56a --- /dev/null +++ b/gdb/testsuite/gdb.base/jump-inline.exp @@ -0,0 +1,44 @@ +# Copyright 2021-2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . */ +# +# Test support for jump in inline functions. + +standard_testfile + +if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } { + return -1 +} + +if { ![runto_main] } { + return -1 +} + +gdb_breakpoint [gdb_get_line_number "inline-funct"] +gdb_continue_to_breakpoint "inline-funct" ".*inline-funct.*" + +# Test jump to another function - main. +set out_func [gdb_get_line_number "out-of-func"] +gdb_test "jump $out_func" \ + "Not confirmed.*" \ + "aborted jump out of current function" \ + "Line $out_func is not in `function_inline.*'. Jump anyway.*y or n. $" \ + "n" + +# Test jump in the same inline function. +set increment [gdb_get_line_number "increment-funct"] +gdb_breakpoint $increment +gdb_test "jump $increment" "Breakpoint .* at .*:$increment.*" +gdb_test "next" ".*inline-funct.*" +gdb_test "print a" "= 5100" -- cgit v1.2.1