From b99b5f66e1d6f80624e8a28b8ebbf9235d50041e Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Thu, 8 Sep 2011 15:24:25 +0000 Subject: [PATCH] gdb/ * stack.c (print_frame_args): New variable except. Wrap read_var_value and common_val_print into TRY_CATCH. gdb/testsuite/ * gdb.dwarf2/dw2-param-error-main.c: New file. * gdb.dwarf2/dw2-param-error.S: New file. * gdb.dwarf2/dw2-param-error.exp: New file. --- gdb/ChangeLog | 5 + gdb/stack.c | 64 ++++++----- gdb/testsuite/ChangeLog | 6 + .../gdb.dwarf2/dw2-param-error-main.c | 37 ++++++ gdb/testsuite/gdb.dwarf2/dw2-param-error.S | 108 ++++++++++++++++++ gdb/testsuite/gdb.dwarf2/dw2-param-error.exp | 33 ++++++ 6 files changed, 227 insertions(+), 26 deletions(-) create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-param-error-main.c create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-param-error.S create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-param-error.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 84a5193d9a..e7f3da7e40 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2011-09-08 Jan Kratochvil + + * stack.c (print_frame_args): New variable except. Wrap + read_var_value and common_val_print into TRY_CATCH. + 2011-09-08 Jan Kratochvil * eval.c (evaluate_subexp_standard) : Update the value_of_this diff --git a/gdb/stack.c b/gdb/stack.c index 4e050fc989..3147f3e72f 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -326,37 +326,49 @@ print_frame_args (struct symbol *func, struct frame_info *frame, if (print_args) { - /* Avoid value_print because it will deref ref parameters. - We just want to print their addresses. Print ??? for - args whose address we do not know. We pass 2 as - "recurse" to val_print because our standard indentation - here is 4 spaces, and val_print indents 2 for each - recurse. */ - val = read_var_value (sym, frame); + volatile struct gdb_exception except; - annotate_arg_value (val == NULL ? NULL : value_type (val)); + TRY_CATCH (except, RETURN_MASK_ERROR) + { + /* Avoid value_print because it will deref ref parameters. + We just want to print their addresses. Print ??? for + args whose address we do not know. We pass 2 as + "recurse" to val_print because our standard indentation + here is 4 spaces, and val_print indents 2 for each + recurse. */ + val = read_var_value (sym, frame); - if (val) - { - const struct language_defn *language; - struct value_print_options opts; + annotate_arg_value (val == NULL ? NULL : value_type (val)); - /* Use the appropriate language to display our symbol, - unless the user forced the language to a specific - language. */ - if (language_mode == language_mode_auto) - language = language_def (SYMBOL_LANGUAGE (sym)); - else - language = current_language; + if (val) + { + const struct language_defn *language; + struct value_print_options opts; - get_raw_print_options (&opts); - opts.deref_ref = 0; - opts.summary = summary; - common_val_print (val, stb->stream, 2, &opts, language); + /* Use the appropriate language to display our symbol, + unless the user forced the language to a specific + language. */ + if (language_mode == language_mode_auto) + language = language_def (SYMBOL_LANGUAGE (sym)); + else + language = current_language; + + get_raw_print_options (&opts); + opts.deref_ref = 0; + opts.summary = summary; + common_val_print (val, stb->stream, 2, &opts, language); + ui_out_field_stream (uiout, "value", stb); + } + else + ui_out_text (uiout, "???"); + } + if (except.reason < 0) + { + fprintf_filtered (stb->stream, + _(""), + except.message); ui_out_field_stream (uiout, "value", stb); - } - else - ui_out_text (uiout, "???"); + } } else ui_out_text (uiout, "..."); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index e9191ad459..98dc2b30a3 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-09-08 Jan Kratochvil + + * gdb.dwarf2/dw2-param-error-main.c: New file. + * gdb.dwarf2/dw2-param-error.S: New file. + * gdb.dwarf2/dw2-param-error.exp: New file. + 2011-09-08 Pedro Alves * gdb.base/annota1.exp, gdb.base/annota3.exp: Extract the diff --git a/gdb/testsuite/gdb.dwarf2/dw2-param-error-main.c b/gdb/testsuite/gdb.dwarf2/dw2-param-error-main.c new file mode 100644 index 0000000000..ad3e42a06f --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-param-error-main.c @@ -0,0 +1,37 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 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 f_start"); +asm ("f_start:"); + +volatile int v; + +void +f (int x) +{ + v++; +} + +asm (".globl f_end"); +asm ("f_end:"); + +int +main (void) +{ + f (1); + return 0; +} diff --git a/gdb/testsuite/gdb.dwarf2/dw2-param-error.S b/gdb/testsuite/gdb.dwarf2/dw2-param-error.S new file mode 100644 index 0000000000..c10be1e324 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-param-error.S @@ -0,0 +1,108 @@ +/* Copyright 2011 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 . */ + + .text +var: .4byte 23 + + .section .debug_info +debug_start: + .long debug_end - 1f /* Length of Compilation Unit Info */ +1: + .2byte 0x3 /* DWARF version number */ + .long .Ldebug_abbrev0 /* Offset Into Abbrev. Section */ + .byte 0x4 /* Pointer Size (in bytes) */ + .uleb128 0x1 /* (DIE (0xb) DW_TAG_compile_unit) */ + .ascii "GNU C 4.4.3\0" /* DW_AT_producer */ + .byte 0x1 /* DW_AT_language */ + .ascii "1.c\0" /* DW_AT_name */ + .uleb128 0x4 /* (DIE (0x3c) DW_TAG_subprogram) */ + .ascii "f\0" /* DW_AT_name */ + .long f_start /* DW_AT_low_pc */ + .long f_end /* DW_AT_high_pc */ + .byte 0x1 /* DW_AT_prototyped */ + + .uleb128 0x5 /* (DIE (0x42) DW_TAG_formal_parameter) */ + .ascii "bad\0" /* DW_AT_name */ + .long type - debug_start /* DW_AT_type */ + .byte 2f - 1f /* DW_AT_location */ +1: .byte 0x06 /* DW_OP_deref */ +2: + .uleb128 0x5 /* (DIE (0x??) DW_TAG_formal_parameter) */ + .ascii "good\0" /* DW_AT_name */ + .long type - debug_start /* DW_AT_type */ + .byte 2f - 1f /* DW_AT_location */ +1: .byte 0x03 /* DW_OP_addr */ + .4byte var +2: + + .byte 0x0 /* end of children of DIE 0x3c */ +type: + .uleb128 3 /* Abbrev: DW_TAG_base_type */ + .ascii "int\0" /* DW_AT_name */ + .byte 4 /* DW_AT_byte_size */ + .byte 5 /* DW_AT_encoding */ + + .byte 0x0 /* end of children of DIE 0xb */ +debug_end: + + .section .debug_abbrev +.Ldebug_abbrev0: + .uleb128 0x1 /* (abbrev code) */ + .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */ + .byte 0x1 /* DW_children_yes */ + .uleb128 0x25 /* (DW_AT_producer) */ + .uleb128 0x8 /* (DW_FORM_string) */ + .uleb128 0x13 /* (DW_AT_language) */ + .uleb128 0xb /* (DW_FORM_data1) */ + .uleb128 0x3 /* (DW_AT_name) */ + .uleb128 0x8 /* (DW_FORM_string) */ + .byte 0x0 + .byte 0x0 + .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 0x4 /* (abbrev code) */ + .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */ + .byte 0x1 /* DW_children_yes */ + .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 0x27 /* (DW_AT_prototyped) */ + .uleb128 0xc /* (DW_FORM_flag) */ + .byte 0x0 + .byte 0x0 + .uleb128 0x5 /* (abbrev code) */ + .uleb128 0x5 /* (TAG: DW_TAG_formal_parameter) */ + .byte 0x0 /* DW_children_no */ + .uleb128 0x3 /* DW_AT_name */ + .uleb128 0x8 /* DW_FORM_string */ + .uleb128 0x49 /* (DW_AT_type) */ + .uleb128 0x13 /* (DW_FORM_ref4) */ + .uleb128 0x02 /* (DW_AT_location) */ + .uleb128 0x0a /* (DW_FORM_block1) */ + .byte 0x0 + .byte 0x0 + .byte 0x0 diff --git a/gdb/testsuite/gdb.dwarf2/dw2-param-error.exp b/gdb/testsuite/gdb.dwarf2/dw2-param-error.exp new file mode 100644 index 0000000000..791799c9e7 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-param-error.exp @@ -0,0 +1,33 @@ +# Copyright 2011 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 . +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +set testfile dw2-param-error +if { [prepare_for_testing ${testfile}.exp "${testfile}" "${testfile}-main.c ${testfile}.S" {nodebug}] } { + return -1 +} + +if ![runto f] { + return -1 +} + +# FAIL was printing: +# [...] in f (bad=) +gdb_test "frame" { f \(bad=, good=23\)}