From 0dce428051fd2cf07f9d38e9efe2dbb5d8f7fbef Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Wed, 26 Feb 2020 14:52:00 +0100 Subject: [PATCH] [gdb] Don't set initial language if set manually Initially, gdb sets the language to auto/c: ... $ gdb -q (gdb) show language The current source language is "auto; currently c". ... And after loading a c++ executable, that changes to auto/c++: ... (gdb) file a.out Reading symbols from a.out... (gdb) show language The current source language is "auto; currently c++". ... Now consider setting the language manually to c: ... $ gdb -q (gdb) show language The current source language is "auto; currently c". (gdb) set language c (gdb) show language The current source language is "c". ... The resulting language is manual/c. Surprisingly, a subsequent load of the c++ executable: ... (gdb) file a.out Reading symbols from a.out... (gdb) show language The current source language is "c++". ... gets us language manual/c++. Loading the file should get us either: - auto/c++, or - manual/c. That is, either the manual setting should be reset by loading, or the manual setting should persist. Fix this in the manual/c fashion. [ Though we could make some gdb setting to choose one or the other. ] Build and reg-tested on x86_64-linux. [ Note: In PR23710 comment 1 a cc1 binary is attached for which gdb is slow when loading and settting a breakpoint on do_rpo_vn: ... $ time.sh gdb cc1 -batch -ex "b do_rpo_vn" Breakpoint 1 at 0xd40e30: do_rpo_vn. (2 locations) maxmem: 1463496 real: 8.88 user: 8.59 system: 0.35 ... This fix enables a speedup by manually setting the language before loading, reducing executing time with ~17%, due to not having to load the full symtab containing main: ... $ time.sh gdb -iex "set language c++" cc1 -batch -ex "b do_rpo_vn" Breakpoint 1 at 0xd40e30: do_rpo_vn. (2 locations) maxmem: 1067308 real: 7.36 user: 7.14 system: 0.28 ... ] gdb/ChangeLog: 2020-02-26 Tom de Vries PR gdb/25603 * symfile.c (set_initial_language): Exit-early if language_mode == language_mode_manual. gdb/testsuite/ChangeLog: 2020-02-26 Tom de Vries PR gdb/25603 * gdb.base/persistent-lang.cc: New test. * gdb.base/persistent-lang.exp: New file. --- gdb/ChangeLog | 6 ++++ gdb/symfile.c | 2 ++ gdb/testsuite/ChangeLog | 6 ++++ gdb/testsuite/gdb.base/persistent-lang.cc | 22 ++++++++++++ gdb/testsuite/gdb.base/persistent-lang.exp | 39 ++++++++++++++++++++++ 5 files changed, 75 insertions(+) create mode 100644 gdb/testsuite/gdb.base/persistent-lang.cc create mode 100644 gdb/testsuite/gdb.base/persistent-lang.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aa4b01bac3b..fb4cc033a90 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2020-02-26 Tom de Vries + + PR gdb/25603 + * symfile.c (set_initial_language): Exit-early if + language_mode == language_mode_manual. + 2020-02-25 Simon Marchi * dwarf2/loc.h (dwarf2_read_addr_index): Move... diff --git a/gdb/symfile.c b/gdb/symfile.c index f7bada75f35..f1edf2dca5d 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1681,6 +1681,8 @@ symbol_file_command (const char *args, int from_tty) void set_initial_language (void) { + if (language_mode == language_mode_manual) + return; enum language lang = main_language (); if (lang == language_unknown) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 720febb65cc..a352c74f0f8 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2020-02-26 Tom de Vries + + PR gdb/25603 + * gdb.base/persistent-lang.cc: New test. + * gdb.base/persistent-lang.exp: New file. + 2020-02-25 Andrew Burgess * gdb.fortran/derived-type-striding.exp: Add a new test. diff --git a/gdb/testsuite/gdb.base/persistent-lang.cc b/gdb/testsuite/gdb.base/persistent-lang.cc new file mode 100644 index 00000000000..f4825c8a7c1 --- /dev/null +++ b/gdb/testsuite/gdb.base/persistent-lang.cc @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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 . */ + +int +main () +{ + return 0; +} diff --git a/gdb/testsuite/gdb.base/persistent-lang.exp b/gdb/testsuite/gdb.base/persistent-lang.exp new file mode 100644 index 00000000000..bcc4ef74698 --- /dev/null +++ b/gdb/testsuite/gdb.base/persistent-lang.exp @@ -0,0 +1,39 @@ +# Copyright 2020 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 . + +standard_testfile .cc + +if {[build_executable "failed to prepare" $testfile $srcfile debug]} { + return -1 +} + +clean_restart + +set auto_c \ + "The current source language is \"auto; currently c\"\." +set manual_c \ + "The current source language is \"c\"\." + +gdb_test "show language" $auto_c \ + "initial language is auto/c" + +gdb_test_no_output "set language c" +gdb_test "show language" $manual_c \ + "language updated to manual/c after set" + +set binfile [standard_output_file ${testfile}] +gdb_load ${binfile} +gdb_test "show language" $manual_c \ + "language still manual/c after load" -- 2.30.2