From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30015 invoked by alias); 26 Feb 2020 12:49:25 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 29810 invoked by uid 89); 26 Feb 2020 12:49:08 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_PASS autolearn=ham version=3.3.1 spammy=cc1 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 26 Feb 2020 12:48:58 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 93952AE3A for ; Wed, 26 Feb 2020 12:48:53 +0000 (UTC) Date: Wed, 26 Feb 2020 12:49:00 -0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH][gdb] Don't set initial language if set manually Message-ID: <20200226124850.GA8450@delia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-IsSubscribed: yes X-SW-Source: 2020-02/txt/msg00974.txt.bz2 Hi, 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. ] [ 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%: ... $ 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 ... ] OK for trunk? Thanks, - Tom [gdb] Don't set initial language if set manually 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/symfile.c | 2 ++ gdb/testsuite/gdb.base/persistent-lang.cc | 22 +++++++++++++++++ gdb/testsuite/gdb.base/persistent-lang.exp | 39 ++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/gdb/symfile.c b/gdb/symfile.c index f7bada75f3..f1edf2dca5 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/gdb.base/persistent-lang.cc b/gdb/testsuite/gdb.base/persistent-lang.cc new file mode 100644 index 0000000000..f4825c8a7c --- /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 0000000000..bcc4ef7469 --- /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"