From: Joel Brobecker <brobecker@adacore.com>
To: gdb-patches@sourceware.org
Subject: [RFA] Fix "set lang auto" oddity when inferior not started yet
Date: Wed, 02 Jan 2008 13:38:00 -0000 [thread overview]
Message-ID: <20080102133132.GD15903@adacore.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1145 bytes --]
Consider the following scenario:
(gdb) file my_c_program
(gdb) show lang
The current source language is "auto; currently c".
(gdb) set lang ada
Now, try to set the language_mode back to "auto", and see what
the language is:
(gdb) set lang auto
(gdb) show lang
The current source language is "auto".
We forgot to set the language! This was reported to us a while ago
by the GPS team (GPS is an IDE that contains a frontend to GDB),
because they rely in some occasions on GDB to tell them what the
language is.
The attached patch fixes the problem.
2008-01-02 Joel Brobecker <brobecker@adacore.com>
* symfile.c (set_initial_language): Make non-static.
* symfile.h (set_initial_language): Add declaration.
* language.c: #include "symfile.h".
(set_language): Call set_initial_language if the frame language
could not be determined.
I also wrote a tiny testcase:
2008-01-02 Joel Brobecker <brobecker@adacore.com>
* gdb.base/set_lang_auto.exp: New testcase.
All tested on x86-linux, no regression.
OK to commit?
Thanks,
--
Joel
[-- Attachment #2: set_lang_auto.diff --]
[-- Type: text/plain, Size: 2753 bytes --]
Index: symfile.c
===================================================================
--- symfile.c (revision 45)
+++ symfile.c (revision 46)
@@ -87,8 +87,6 @@ static int simple_read_overlay_region_ta
static void simple_free_overlay_region_table (void);
#endif
-static void set_initial_language (void);
-
static void load_command (char *, int);
static void symbol_file_add_main_1 (char *args, int from_tty, int flags);
@@ -1576,7 +1574,7 @@ symbol_file_command (char *args, int fro
stabs we find, but we can't do that until later when we read in
full symbols. */
-static void
+void
set_initial_language (void)
{
struct partial_symtab *pst;
Index: symfile.h
===================================================================
--- symfile.h (revision 45)
+++ symfile.h (revision 46)
@@ -292,6 +292,8 @@ extern int auto_solib_limit;
/* From symfile.c */
+extern void set_initial_language (void);
+
extern struct partial_symtab *allocate_psymtab (char *, struct objfile *);
extern void discard_psymtab (struct partial_symtab *);
Index: language.c
===================================================================
--- language.c (revision 45)
+++ language.c (revision 46)
@@ -43,6 +43,7 @@
#include "parser-defs.h"
#include "jv-lang.h"
#include "demangle.h"
+#include "symfile.h"
extern void _initialize_language (void);
@@ -185,11 +186,14 @@ local or auto Automatic setting based
/* Found it! Go into manual mode, and use this language. */
if (languages[i]->la_language == language_auto)
{
- /* Enter auto mode. Set to the current frame's language, if known. */
+ /* Enter auto mode. Set to the current frame's language, if
+ known, or fallback to the initial language. */
language_mode = language_mode_auto;
flang = get_frame_language ();
if (flang != language_unknown)
set_language (flang);
+ else
+ set_initial_language ();
expected_language = current_language;
return;
}
Index: Makefile.in
===================================================================
--- Makefile.in (revision 45)
+++ Makefile.in (revision 46)
@@ -2323,7 +2323,7 @@ jv-valprint.o: jv-valprint.c $(defs_h) $
$(language_h) $(jv_lang_h) $(c_lang_h) $(annotate_h) $(gdb_string_h)
language.o: language.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \
$(value_h) $(gdbcmd_h) $(expression_h) $(language_h) $(target_h) \
- $(parser_defs_h) $(jv_lang_h) $(demangle_h)
+ $(parser_defs_h) $(jv_lang_h) $(demangle_h) $(symfile_h)
libunwind-frame.o: libunwind-frame.c $(defs_h) $(inferior_h) $(frame_h) \
$(frame_base_h) $(frame_unwind_h) $(gdbcore_h) $(gdbtypes_h) \
$(symtab_h) $(objfiles_h) $(regcache_h) $(gdb_assert_h) \
[-- Attachment #3: set_lang_auto-testcase.diff --]
[-- Type: text/plain, Size: 2458 bytes --]
Index: gdb.base/set_lang_auto.exp
===================================================================
--- gdb.base/set_lang_auto.exp (revision 0)
+++ gdb.base/set_lang_auto.exp (revision 47)
@@ -0,0 +1,70 @@
+# Copyright 2008 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 <http://www.gnu.org/licenses/>.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+set prms_id 0
+set bug_id 0
+
+set testfile start
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ untested "Couldn't compile test program"
+ return -1
+}
+
+# Get things started.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+# Do not run the inferior as the purpose of this testcase is to test
+# the behavior of the "set language" command when there is no inferior.
+
+# Check the language after the binary has been loaded. It should be
+# "auto; currently c".
+gdb_test "show lang" \
+ "The current source language is \"auto; currently c\"\\." \
+ "show lang after loading binary"
+
+# Now, switch the language to a specific language, instead of leaving it
+# on auto.
+gdb_test "set lang ada" \
+ "" \
+ "forcing the language to ada"
+
+# Verify that the language is now "ada".
+gdb_test "show lang" \
+ "The current source language is \"ada\"\\." \
+ "show lang after switching language to ada"
+
+# Then, switch back to auto...
+gdb_test "set lang auto" \
+ "" \
+ "switching the language back to auto"
+
+# ... And verify that the language mode is back to auto *and* that
+# the selected language is C.
+
+gdb_test "show lang" \
+ "The current source language is \"auto; currently c\"\\." \
+ "show lang after having switched back to auto"
+
+
next reply other threads:[~2008-01-02 13:38 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-02 13:38 Joel Brobecker [this message]
2008-01-02 14:01 ` Daniel Jacobowitz
2008-01-03 4:30 ` Joel Brobecker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080102133132.GD15903@adacore.com \
--to=brobecker@adacore.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox