From e9e07ba6db5fb651b153da7bde8a6ee4509172f0 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Thu, 30 Sep 2010 10:29:00 +0000 Subject: [PATCH] gdb/ Fix printing parameters of inlined functions. * ada-lang.c (is_known_support_routine) (ada_unhandled_exception_name_addr_from_raise): Provide NULL parameter for find_frame_funname. * python/py-frame.c (frapy_name): Likewise. * stack.c (find_frame_funname): New parameter funcp. Update the function comment. Fill it in. (print_frame): New variable func. Initialize it by find_frame_funname. Print arguments only if FUNC is not NULL. Use FUNC as the parameter of print_args_stub. * stack.h (find_frame_funname): New parameter funcp. Remove the function declaration comment. gdb/testsuite/ Fix printing parameters of inlined functions. * gdb.dwarf2/dw2-inline-param.exp: New file. * gdb.dwarf2/dw2-inline-param-main.c: New file. * gdb.dwarf2/dw2-inline-param.S: New file. --- gdb/ChangeLog | 15 ++ gdb/ada-lang.c | 4 +- gdb/python/py-frame.c | 2 +- gdb/stack.c | 16 +- gdb/stack.h | 4 +- gdb/testsuite/ChangeLog | 7 + .../gdb.dwarf2/dw2-inline-param-main.c | 42 +++++ gdb/testsuite/gdb.dwarf2/dw2-inline-param.S | 152 ++++++++++++++++++ gdb/testsuite/gdb.dwarf2/dw2-inline-param.exp | 65 ++++++++ 9 files changed, 296 insertions(+), 11 deletions(-) create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-inline-param-main.c create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-inline-param.S create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-inline-param.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f7cd9cf2d31..c10ed117f64 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,18 @@ +2010-09-30 Jan Kratochvil + + Fix printing parameters of inlined functions. + * ada-lang.c (is_known_support_routine) + (ada_unhandled_exception_name_addr_from_raise): Provide NULL parameter + for find_frame_funname. + * python/py-frame.c (frapy_name): Likewise. + * stack.c (find_frame_funname): New parameter funcp. Update the + function comment. Fill it in. + (print_frame): New variable func. Initialize it by + find_frame_funname. Print arguments only if FUNC is not NULL. Use + FUNC as the parameter of print_args_stub. + * stack.h (find_frame_funname): New parameter funcp. Remove the + function declaration comment. + 2010-09-30 Jan Kratochvil PR corefiles/12071. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index fabb2728d5c..3eaf6496e7b 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -10325,7 +10325,7 @@ is_known_support_routine (struct frame_info *frame) /* Check whether the function is a GNAT-generated entity. */ - find_frame_funname (frame, &func_name, &func_lang); + find_frame_funname (frame, &func_name, &func_lang, NULL); if (func_name == NULL) return 1; @@ -10393,7 +10393,7 @@ ada_unhandled_exception_name_addr_from_raise (void) char *func_name; enum language func_lang; - find_frame_funname (fi, &func_name, &func_lang); + find_frame_funname (fi, &func_name, &func_lang, NULL); if (func_name != NULL && strcmp (func_name, exception_info->catch_exception_sym) == 0) break; /* We found the frame we were looking for... */ diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index a7df810a686..bb82903fdcc 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -126,7 +126,7 @@ frapy_name (PyObject *self, PyObject *args) { FRAPY_REQUIRE_VALID ((frame_object *) self, frame); - find_frame_funname (frame, &name, &lang); + find_frame_funname (frame, &name, &lang, NULL); } GDB_PY_HANDLE_EXCEPTION (except); diff --git a/gdb/stack.c b/gdb/stack.c index 830fd41c7cf..1e0c2e6f2cd 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -661,16 +661,19 @@ print_frame_info (struct frame_info *frame, int print_level, gdb_flush (gdb_stdout); } -/* Attempt to obtain the FUNNAME and FUNLANG of the function corresponding - to FRAME. */ +/* Attempt to obtain the FUNNAME, FUNLANG and optionally FUNCP of the function + corresponding to FRAME. */ + void find_frame_funname (struct frame_info *frame, char **funname, - enum language *funlang) + enum language *funlang, struct symbol **funcp) { struct symbol *func; *funname = NULL; *funlang = language_unknown; + if (funcp) + *funcp = NULL; func = get_frame_function (frame); if (func) @@ -715,6 +718,8 @@ find_frame_funname (struct frame_info *frame, char **funname, { *funname = SYMBOL_PRINT_NAME (func); *funlang = SYMBOL_LANGUAGE (func); + if (funcp) + *funcp = func; if (*funlang == language_cplus) { /* It seems appropriate to use SYMBOL_PRINT_NAME() here, @@ -756,11 +761,12 @@ print_frame (struct frame_info *frame, int print_level, struct ui_stream *stb; struct cleanup *old_chain, *list_chain; struct value_print_options opts; + struct symbol *func; stb = ui_out_stream_new (uiout); old_chain = make_cleanup_ui_out_stream_delete (stb); - find_frame_funname (frame, &funname, &funlang); + find_frame_funname (frame, &funname, &funlang, &func); annotate_frame_begin (print_level ? frame_relative_level (frame) : 0, gdbarch, get_frame_pc (frame)); @@ -797,7 +803,7 @@ print_frame (struct frame_info *frame, int print_level, struct cleanup *args_list_chain; args.frame = frame; - args.func = find_pc_function (get_frame_address_in_block (frame)); + args.func = func; args.stream = gdb_stdout; args_list_chain = make_cleanup_ui_out_list_begin_end (uiout, "args"); catch_errors (print_args_stub, &args, "", RETURN_MASK_ERROR); diff --git a/gdb/stack.h b/gdb/stack.h index 5e874b4fd48..16fc819c713 100644 --- a/gdb/stack.h +++ b/gdb/stack.h @@ -22,10 +22,8 @@ void select_frame_command (char *level_exp, int from_tty); -/* Attempt to obtain the FUNNAME and FUNLANG of the function corresponding - to FRAME. */ void find_frame_funname (struct frame_info *frame, char **funname, - enum language *funlang); + enum language *funlang, struct symbol **funcp); typedef void (*iterate_over_block_arg_local_vars_cb) (const char *symbol_print_name, struct symbol *sym, diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ba20ffeb18b..42e71921093 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-09-30 Jan Kratochvil + + Fix printing parameters of inlined functions. + * gdb.dwarf2/dw2-inline-param.exp: New file. + * gdb.dwarf2/dw2-inline-param-main.c: New file. + * gdb.dwarf2/dw2-inline-param.S: New file. + 2010-09-30 Jan Kratochvil PR corefiles/12071. diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-param-main.c b/gdb/testsuite/gdb.dwarf2/dw2-inline-param-main.c new file mode 100644 index 00000000000..06b78f8f8ca --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-param-main.c @@ -0,0 +1,42 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 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 . */ + +asm (".globl cu_text_start"); +asm ("cu_text_start:"); + +volatile int v; + +int +main (void) +{ + asm (".globl block_start"); + asm ("block_start:"); + + v = 1; + + asm ("break_at:"); + + v = 2; + + asm (".globl block_end"); + asm ("block_end:"); + + return 0; +} + +asm (".globl cu_text_end"); +asm ("cu_text_end:"); diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-param.S b/gdb/testsuite/gdb.dwarf2/dw2-inline-param.S new file mode 100644 index 00000000000..21a6db88a0a --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-param.S @@ -0,0 +1,152 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 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 . */ + +/* Debug information */ + + .section .debug_info +.Lcu1_begin: + /* CU header */ + .4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */ +.Lcu1_start: + .2byte 2 /* DWARF Version */ + .4byte .Labbrev1_begin /* Offset into abbrev section */ + .byte 4 /* Pointer size */ + + /* CU die */ + .uleb128 1 /* Abbrev: DW_TAG_compile_unit */ + .4byte cu_text_start /* DW_AT_low_pc */ + .4byte cu_text_end /* DW_AT_high_pc */ + .ascii "file1.txt\0" /* DW_AT_name */ + .ascii "GNU C 3.3.3\0" /* DW_AT_producer */ + .byte 1 /* DW_AT_language (C) */ + +.Ltype_int: + .uleb128 3 /* Abbrev: DW_TAG_base_type */ + .ascii "int\0" /* DW_AT_name */ + .byte 4 /* DW_AT_byte_size */ + .byte 5 /* DW_AT_encoding */ + + .uleb128 4 /* Abbrev: DW_TAG_subprogram */ + .ascii "main\0" /* DW_AT_name */ + .4byte cu_text_start /* DW_AT_low_pc */ + .4byte cu_text_end /* DW_AT_high_pc */ + .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ + .byte 1 /* DW_AT_external */ + .byte 1 /* DW_AT_prototyped */ + + .uleb128 6 /* Abbrev: DW_TAG_formal_parameter */ + .ascii "mainparam\0" /* DW_AT_name */ + + .uleb128 5 /* Abbrev: DW_TAG_inlined_subroutine */ + .ascii "func\0" /* DW_AT_name */ + .4byte block_start /* DW_AT_low_pc */ + .4byte block_end /* DW_AT_high_pc */ + .byte 3 /* DW_AT_inline (DW_INL_declared_inlined) */ + .byte 1 /* DW_AT_prototyped */ + .byte 0 /* DW_AT_call_file */ + .byte 1 /* DW_AT_call_line */ + + .uleb128 6 /* Abbrev: DW_TAG_formal_parameter */ + .ascii "funcparam\0" /* DW_AT_name */ + + .byte 0 /* End of children of func */ + + .byte 0 /* End of children of main */ + + .byte 0 /* End of children of CU */ + +.Lcu1_end: + +/* Abbrev table */ + .section .debug_abbrev +.Labbrev1_begin: + .uleb128 1 /* Abbrev code */ + .uleb128 0x11 /* DW_TAG_compile_unit */ + .byte 1 /* has_children */ + .uleb128 0x11 /* DW_AT_low_pc */ + .uleb128 0x1 /* DW_FORM_addr */ + .uleb128 0x12 /* DW_AT_high_pc */ + .uleb128 0x1 /* DW_FORM_addr */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0x25 /* DW_AT_producer */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0x13 /* DW_AT_language */ + .uleb128 0xb /* DW_FORM_data1 */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 3 /* Abbrev code */ + .uleb128 0x24 /* DW_TAG_base_type */ + .byte 0 /* has_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0xb /* DW_AT_byte_size */ + .uleb128 0xb /* DW_FORM_data1 */ + .uleb128 0x3e /* DW_AT_encoding */ + .uleb128 0xb /* DW_FORM_data1 */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 4 /* Abbrev code */ + .uleb128 0x2e /* DW_TAG_subprogram */ + .byte 1 /* has_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0x11 /* DW_AT_low_pc */ + .uleb128 0x1 /* DW_FORM_addr */ + .uleb128 0x12 /* DW_AT_high_pc */ + .uleb128 0x1 /* DW_FORM_addr */ + .uleb128 0x49 /* DW_AT_type */ + .uleb128 0x13 /* DW_FORM_ref4 */ + .uleb128 0x3f /* DW_AT_external */ + .uleb128 0xc /* DW_FORM_flag */ + .uleb128 0x27 /* DW_AT_prototyped */ + .uleb128 0xc /* DW_FORM_flag */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 5 /* Abbrev code */ + .uleb128 0x1d /* DW_TAG_inlined_subroutine */ + .byte 1 /* has_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0x11 /* DW_AT_low_pc */ + .uleb128 0x1 /* DW_FORM_addr */ + .uleb128 0x12 /* DW_AT_high_pc */ + .uleb128 0x1 /* DW_FORM_addr */ + .uleb128 0x20 /* DW_AT_inline */ + .uleb128 0xb /* DW_FORM_data1 */ + .uleb128 0x27 /* DW_AT_prototyped */ + .uleb128 0xc /* DW_FORM_flag */ + .uleb128 0x58 /* DW_AT_call_file */ + .uleb128 0xb /* DW_FORM_data1 */ + .uleb128 0x59 /* DW_AT_call_line */ + .uleb128 0xb /* DW_FORM_data1 */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .uleb128 6 /* Abbrev code */ + .uleb128 0x05 /* DW_TAG_formal_parameter */ + .byte 0 /* has_children */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-param.exp b/gdb/testsuite/gdb.dwarf2/dw2-inline-param.exp new file mode 100644 index 00000000000..e9ead8e3058 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-param.exp @@ -0,0 +1,65 @@ +# Copyright 2010 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 . + +# This test can only be run on targets which support DWARF-2 and use gas. +# For now pick a sampling of likely targets. +if {![istarget *-*-linux*] + && ![istarget *-*-gnu*] + && ![istarget *-*-elf*] + && ![istarget *-*-openbsd*] + && ![istarget arm-*-eabi*] + && ![istarget powerpc-*-eabi*]} { + return 0 +} + +set testfile dw2-inline-param +set binfile ${objdir}/${subdir}/${testfile} +if { [build_executable ${testfile}.exp "${testfile}" [list ${testfile}-main.c ${testfile}.S] {nodebug}] } { + return -1 +} + +clean_restart ${testfile} + +set break_at "" +set test "info addr break_at" +gdb_test_multiple $test $test { + -re "Symbol \"break_at\" is at (0x\[0-9a-f\]+) in .*\r\n$gdb_prompt $" { + set break_at $expect_out(1,string) + pass $test + } +} + +gdb_unload + +# Strip out any labels there as they could corrupt the `main' name. + +set objcopy_program [transform objcopy] +set result [catch "exec $objcopy_program -N block_start -N block_end -N break_at ${binfile}" output] +verbose "result is $result" +verbose "output is $output" +if {$result != 0} { + return -1 +} + +gdb_load ${binfile} +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + +if ![runto "*${break_at}"] { + return -1 +} + +gdb_test "bt" "#0 (0x\[0-9a-f\]+ in )?func \\(funcparam=\\)\r\n#1 main \\(mainparam=\\)\[^\r\n\]*" -- 2.30.2