From: Tom Tromey Date: Fri, 8 Jan 2021 19:20:12 +0000 (-0700) Subject: Pass void_context_p to parse_expression X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8fc48b79618af335d6cea1d1d149668340298b81;p=binutils-gdb.git Pass void_context_p to parse_expression An earlier patch pointed out that nothing in GDB sets void_context_p when parsing an expression. This patch fixes this omission. "print" and "call" differ in that the former will print a value that has void type, while the latter will not. AdaCore has had a patch for a long time that uses this distinction to help with overload resolution. In particular, in a "call" context, a procedure will be chosen, while in a "print" context, a zero-argument function will be chosen instead. Regression tested on x86-64 Fedora 32. gdb/ChangeLog 2021-01-08 Tom Tromey * parse.c (parse_expression): Add void_context_p parameter. Use parse_exp_in_context. * printcmd.c (print_command_1): Change voidprint to bool. Pass to parse_expression. (print_command, call_command): Update. * expression.h (parse_expression): Add void_context_p parameter. gdb/testsuite/ChangeLog 2021-01-08 Tom Tromey * gdb.ada/voidctx/pck.adb: New file. * gdb.ada/voidctx/pck.ads: New file. * gdb.ada/voidctx/voidctx.adb: New file. * gdb.ada/voidctx.exp: New file. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 216057a773b..d567830b1fa 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2021-01-08 Tom Tromey + + * parse.c (parse_expression): Add void_context_p parameter. Use + parse_exp_in_context. + * printcmd.c (print_command_1): Change voidprint to bool. Pass to + parse_expression. + (print_command, call_command): Update. + * expression.h (parse_expression): Add void_context_p parameter. + 2021-01-08 Andrew Burgess * value.c (set_value_component_location): Adjust the VALUE_LVAL diff --git a/gdb/expression.h b/gdb/expression.h index 8c0bcc90f15..e70169e9b3e 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -142,7 +142,8 @@ typedef std::unique_ptr expression_up; class innermost_block_tracker; extern expression_up parse_expression (const char *, - innermost_block_tracker * = nullptr); + innermost_block_tracker * = nullptr, + bool void_context_p = false); extern expression_up parse_expression_with_language (const char *string, enum language lang); diff --git a/gdb/parse.c b/gdb/parse.c index 51e7d65ad07..b3cd91d2730 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -1158,13 +1158,20 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc, return result; } -/* Parse STRING as an expression, and complain if this fails - to use up all of the contents of STRING. */ +/* Parse STRING as an expression, and complain if this fails to use up + all of the contents of STRING. TRACKER, if non-null, will be + updated by the parser. VOID_CONTEXT_P should be true to indicate + that the expression may be expected to return a value with void + type. Parsers are free to ignore this, or to use it to help with + overload resolution decisions. */ expression_up -parse_expression (const char *string, innermost_block_tracker *tracker) +parse_expression (const char *string, innermost_block_tracker *tracker, + bool void_context_p) { - expression_up exp = parse_exp_1 (&string, 0, 0, 0, tracker); + expression_up exp = parse_exp_in_context (&string, 0, nullptr, 0, + void_context_p, nullptr, + tracker, nullptr); if (*string) error (_("Junk after end of expression.")); return exp; diff --git a/gdb/printcmd.c b/gdb/printcmd.c index a1c9af1acae..2e56d28e9f4 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -1206,7 +1206,7 @@ print_value (value *val, const value_print_options &opts) /* Implementation of the "print" and "call" commands. */ static void -print_command_1 (const char *args, int voidprint) +print_command_1 (const char *args, bool voidprint) { struct value *val; value_print_options print_opts; @@ -1223,7 +1223,9 @@ print_command_1 (const char *args, int voidprint) if (exp != nullptr && *exp) { - expression_up expr = parse_expression (exp); + /* VOIDPRINT is true to indicate that we do want to print a void + value, so invert it for parse_expression. */ + expression_up expr = parse_expression (exp, nullptr, !voidprint); val = evaluate_expression (expr.get ()); } else @@ -1321,14 +1323,14 @@ print_command_completer (struct cmd_list_element *ignore, static void print_command (const char *exp, int from_tty) { - print_command_1 (exp, 1); + print_command_1 (exp, true); } /* Same as print, except it doesn't print void results. */ static void call_command (const char *exp, int from_tty) { - print_command_1 (exp, 0); + print_command_1 (exp, false); } /* Implementation of the "output" command. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ef3e7949164..fcca04996f4 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2021-01-08 Tom Tromey + + * gdb.ada/voidctx/pck.adb: New file. + * gdb.ada/voidctx/pck.ads: New file. + * gdb.ada/voidctx/voidctx.adb: New file. + * gdb.ada/voidctx.exp: New file. + 2021-01-08 Simon Marchi PR gdb/27157 diff --git a/gdb/testsuite/gdb.ada/voidctx.exp b/gdb/testsuite/gdb.ada/voidctx.exp new file mode 100644 index 00000000000..c557c1fe8d0 --- /dev/null +++ b/gdb/testsuite/gdb.ada/voidctx.exp @@ -0,0 +1,40 @@ +# Copyright 2021 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 "ada.exp" + +if { [skip_ada_tests] } { return -1 } + +standard_ada_testfile voidctx + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/voidctx.adb] +runto "voidctx.adb:$bp_location" + +gdb_test "print pck.proc_count" " = 0" "initial proc_count" +gdb_test "print pck.func_count" " = 0" "initial func_count" + +gdb_test "print DoSomething" " = 42" +gdb_test "print pck.proc_count" " = 0" "check proc_count 1" +gdb_test "print pck.func_count" " = 1" "check func_count 1" + +gdb_test_no_output "call DoSomething" +gdb_test "print pck.proc_count" " = 1" "check proc_count 2" +gdb_test "print pck.func_count" " = 1" "check func_count 2" diff --git a/gdb/testsuite/gdb.ada/voidctx/pck.adb b/gdb/testsuite/gdb.ada/voidctx/pck.adb new file mode 100644 index 00000000000..bdd76cd4142 --- /dev/null +++ b/gdb/testsuite/gdb.ada/voidctx/pck.adb @@ -0,0 +1,27 @@ +-- Copyright 2021 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 . + +package body Pck is + function DoSomething return Integer is + begin + Func_Count := Func_Count + 1; + return 42; + end; + + procedure DoSomething is + begin + Proc_Count := Proc_Count + 1; + end; +end Pck; diff --git a/gdb/testsuite/gdb.ada/voidctx/pck.ads b/gdb/testsuite/gdb.ada/voidctx/pck.ads new file mode 100644 index 00000000000..cf7fe15e6fb --- /dev/null +++ b/gdb/testsuite/gdb.ada/voidctx/pck.ads @@ -0,0 +1,23 @@ +-- Copyright 2021 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 . + +package Pck is + -- Each count is incremented by the respective DoSomething. + Proc_Count : Integer := 0; + Func_Count : Integer := 0; + + function DoSomething return Integer; + procedure DoSomething; +end Pck; diff --git a/gdb/testsuite/gdb.ada/voidctx/voidctx.adb b/gdb/testsuite/gdb.ada/voidctx/voidctx.adb new file mode 100644 index 00000000000..f70c7f065ec --- /dev/null +++ b/gdb/testsuite/gdb.ada/voidctx/voidctx.adb @@ -0,0 +1,31 @@ +-- Copyright 2021 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 . + +with Pck; use Pck; +procedure Voidctx is + + function DoSomething return Integer is + begin + return 42; + end; + + procedure DoSomething is + begin + null; + end; + +begin + null; -- STOP +end Voidctx;