[v9,09/10] gdb, mi: Skip trampoline functions for the -stack-list-arguments command.
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gdb_build--master-arm |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-arm |
success
|
Test passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 |
success
|
Test passed
|
Commit Message
From: "Ijaz, Abdul B" <abdul.b.ijaz@intel.com>
This change skips trampoline functions for the '-stack-list-arguments'
command when the option 'skip-trampoline-functions' is set to 'on'. Before
this change, GDB prints the arguments of frames indicated by the
compiler with DIE "DW_AT_trampoline" in the backtrace for the mi command
stack-list-arguments, but for better user experience, all such frames
can be hidden from the user.
In this example the IFX compiler emits "DW_AT_trampoline" tag for the
'first' and 'second' trampoline functions like following:
function second (x, y) result(z)
integer, intent(in) :: x, y
integer :: z
z = x * y ! breakpt-args
end function second
function first (num1, num2) result(total)
integer, intent(in) :: num1, num2
integer :: total
total = second (num1 + 4, num2 * 3) ! first-breakpt
total = total + 30
end function first
Related Dwarf:
0x0000013f: DW_TAG_subprogram
DW_AT_low_pc (0x0000000000404350)
DW_AT_high_pc (0x000000000040435f)
DW_AT_frame_base (DW_OP_reg6 RBP)
DW_AT_linkage_name ("second_.t74p.t75p")
DW_AT_name ("second_.t74p.t75p")
DW_AT_trampoline ("second_")
0x0000015a: DW_TAG_subprogram
DW_AT_low_pc (0x00000000004044a0)
DW_AT_high_pc (0x00000000004044af)
DW_AT_frame_base (DW_OP_reg6 RBP)
DW_AT_linkage_name ("first_.t104p.t105p")
DW_AT_name ("first_.t104p.t105p")
DW_AT_trampoline ("first_")
Before this change, the -stack-list-arguments' command output looks like:
'''
(gdb)
-stack-list-arguments 0
^done,
stack-args=[
frame={level="0",args=[name="x",name="y"]},
frame={level="1",args=[]},
frame={level="2",args=[name="num1",name="num2"]},
frame={level="3",args=[]},
frame={level="4",args=[]}]
'''
After change:
'''
(gdb)
-stack-list-arguments 0
^done,
stack-args=[
frame={level="0",args=[name="x",name="y"]},
frame={level="1",args=[name="num1",name="num2"]},
frame={level="2",args=[]}]
'''
The test gdb.mi/mi-func-treampoline is updated for testing the change.
2024-11-24 Ijaz, Abdul B <abdul.b.ijaz@intel.com>
---
gdb/doc/gdb.texinfo | 3 +++
gdb/mi/mi-cmd-stack.c | 7 +++++++
gdb/testsuite/gdb.mi/mi-func-trampoline.exp | 13 ++++++++++---
3 files changed, 20 insertions(+), 3 deletions(-)
@@ -35237,6 +35237,9 @@ variable object is updated, @value{GDBN} makes sure that the
thread/frame combination the variable object is bound to still exists,
and re-evaluates the variable object in context of that thread/frame.
+If the option @code{skip-trampoline-functions} is set, @value{GDBN} will
+not show trampoline functions in the stack.
+
The following is the complete set of @sc{gdb/mi} operations defined to
access this functionality:
@@ -405,6 +405,13 @@ mi_cmd_stack_list_args (const char *command, const char *const *argv, int argc)
i++, fi = get_prev_frame (fi))
{
QUIT;
+ if (skip_trampoline_functions)
+ {
+ for (int j = 0; (SAFE_TRAMPOLINE_CHAIN (j, fi)
+ && in_trampoline_frame (fi)); ++j)
+ fi = get_prev_frame (fi);
+ }
+
ui_out_emit_tuple tuple_emitter (uiout, "frame");
uiout->field_signed ("level", i);
list_args_or_locals (user_frame_print_options,
@@ -13,9 +13,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/> .
-# Test -stack-list-frames command for functions with trampoline
-# calls. Also checks if trampoline frames are filtered while printing
-# stack.
+# Test -stack-list-frames and -stack-list-arguments command for functions
+# with trampoline calls. Also checks if trampoline frames are filtered
+# while printing stack.
require allow_fortran_tests
@@ -55,6 +55,10 @@ set frame1_regx "\{level=\"0\",addr=\"$hex\",func=\"second\",file=\".*func-tramp
set frame2_regx "\{level=\"2\",addr=\"$hex\",func=\"first\",.*\}"
set frame3_regx "\{level=\"4\",addr=\"$hex\",func=\"func_trampoline\",.*\}"
+set arg1_regx "\{level=\"0\",args=\\\[name=\"x\",name=\"y\"\\\]\}"
+set arg2_regx "\{level=\"1\",args=\\\[name=\"num1\",name=\"num2\"\\\]\}"
+set arg3_regx "\{level=\"2\",args=\\\[\\\]\}"
+
# Set breakpoint inside the innermost function 'second'.
mi_create_breakpoint "-t $srcfile:$inner_loc" \
"insert breakpoint at line $inner_loc " \
@@ -66,3 +70,6 @@ mi_expect_stop \
mi_gdb_test "100-stack-list-frames" \
"100\\^done,stack=\\\[frame=${frame1_regx},frame=${frame2_regx},frame=${frame3_regx}\\\]"
+
+mi_gdb_test "200-stack-list-arguments 0" \
+ "200\\^done,stack-args=\\\[frame=${arg1_regx},frame=${arg2_regx},frame=${arg3_regx}\\\]"