1e93f7393Sniklas /* Multiple source language support for GDB.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
4b725ae77Skettenis 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5b725ae77Skettenis
6e93f7393Sniklas Contributed by the Department of Computer Science at the State University
7e93f7393Sniklas of New York at Buffalo.
8e93f7393Sniklas
9e93f7393Sniklas This file is part of GDB.
10e93f7393Sniklas
11e93f7393Sniklas This program is free software; you can redistribute it and/or modify
12e93f7393Sniklas it under the terms of the GNU General Public License as published by
13e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
14e93f7393Sniklas (at your option) any later version.
15e93f7393Sniklas
16e93f7393Sniklas This program is distributed in the hope that it will be useful,
17e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
18e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19e93f7393Sniklas GNU General Public License for more details.
20e93f7393Sniklas
21e93f7393Sniklas You should have received a copy of the GNU General Public License
22e93f7393Sniklas along with this program; if not, write to the Free Software
23b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
24b725ae77Skettenis Boston, MA 02111-1307, USA. */
25e93f7393Sniklas
26e93f7393Sniklas /* This file contains functions that return things that are specific
27e93f7393Sniklas to languages. Each function should examine current_language if necessary,
28e93f7393Sniklas and return the appropriate result. */
29e93f7393Sniklas
30e93f7393Sniklas /* FIXME: Most of these would be better organized as macros which
31e93f7393Sniklas return data out of a "language-specific" struct pointer that is set
32e93f7393Sniklas whenever the working language changes. That would be a lot faster. */
33e93f7393Sniklas
34e93f7393Sniklas #include "defs.h"
35e93f7393Sniklas #include <ctype.h>
36e93f7393Sniklas #include "gdb_string.h"
37e93f7393Sniklas
38e93f7393Sniklas #include "symtab.h"
39e93f7393Sniklas #include "gdbtypes.h"
40e93f7393Sniklas #include "value.h"
41e93f7393Sniklas #include "gdbcmd.h"
42e93f7393Sniklas #include "expression.h"
43e93f7393Sniklas #include "language.h"
44e93f7393Sniklas #include "target.h"
45e93f7393Sniklas #include "parser-defs.h"
46b725ae77Skettenis #include "jv-lang.h"
47b725ae77Skettenis #include "demangle.h"
48e93f7393Sniklas
49b725ae77Skettenis extern void _initialize_language (void);
50e93f7393Sniklas
51b725ae77Skettenis static void show_language_command (char *, int);
52e93f7393Sniklas
53b725ae77Skettenis static void set_language_command (char *, int);
54e93f7393Sniklas
55b725ae77Skettenis static void show_type_command (char *, int);
56e93f7393Sniklas
57b725ae77Skettenis static void set_type_command (char *, int);
58e93f7393Sniklas
59b725ae77Skettenis static void show_range_command (char *, int);
60e93f7393Sniklas
61b725ae77Skettenis static void set_range_command (char *, int);
62e93f7393Sniklas
63b725ae77Skettenis static void show_case_command (char *, int);
64e93f7393Sniklas
65b725ae77Skettenis static void set_case_command (char *, int);
66e93f7393Sniklas
67b725ae77Skettenis static void set_case_str (void);
68e93f7393Sniklas
69b725ae77Skettenis static void set_range_str (void);
70e93f7393Sniklas
71b725ae77Skettenis static void set_type_str (void);
72e93f7393Sniklas
73b725ae77Skettenis static void set_lang_str (void);
74e93f7393Sniklas
75b725ae77Skettenis static void unk_lang_error (char *);
76e93f7393Sniklas
77b725ae77Skettenis static int unk_lang_parser (void);
78e93f7393Sniklas
79b725ae77Skettenis static void show_check (char *, int);
80e93f7393Sniklas
81b725ae77Skettenis static void set_check (char *, int);
82e93f7393Sniklas
83b725ae77Skettenis static void set_type_range_case (void);
84e93f7393Sniklas
85b725ae77Skettenis static void unk_lang_emit_char (int c, struct ui_file *stream, int quoter);
86e93f7393Sniklas
87b725ae77Skettenis static void unk_lang_printchar (int c, struct ui_file *stream);
88b725ae77Skettenis
89b725ae77Skettenis static void unk_lang_printstr (struct ui_file * stream, char *string,
90b725ae77Skettenis unsigned int length, int width,
91b725ae77Skettenis int force_ellipses);
92b725ae77Skettenis
93b725ae77Skettenis static struct type *unk_lang_create_fundamental_type (struct objfile *, int);
94b725ae77Skettenis
95b725ae77Skettenis static void unk_lang_print_type (struct type *, char *, struct ui_file *,
96b725ae77Skettenis int, int);
97b725ae77Skettenis
98b725ae77Skettenis static int unk_lang_val_print (struct type *, char *, int, CORE_ADDR,
99b725ae77Skettenis struct ui_file *, int, int, int,
100b725ae77Skettenis enum val_prettyprint);
101b725ae77Skettenis
102b725ae77Skettenis static int unk_lang_value_print (struct value *, struct ui_file *, int, enum val_prettyprint);
103b725ae77Skettenis
104b725ae77Skettenis static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc);
105e93f7393Sniklas
106e93f7393Sniklas /* Forward declaration */
107e93f7393Sniklas extern const struct language_defn unknown_language_defn;
108e93f7393Sniklas
109e93f7393Sniklas /* The current (default at startup) state of type and range checking.
110e93f7393Sniklas (If the modes are set to "auto", though, these are changed based
111e93f7393Sniklas on the default language at startup, and then again based on the
112e93f7393Sniklas language of the first source file. */
113e93f7393Sniklas
114e93f7393Sniklas enum range_mode range_mode = range_mode_auto;
115e93f7393Sniklas enum range_check range_check = range_check_off;
116e93f7393Sniklas enum type_mode type_mode = type_mode_auto;
117e93f7393Sniklas enum type_check type_check = type_check_off;
118b725ae77Skettenis enum case_mode case_mode = case_mode_auto;
119b725ae77Skettenis enum case_sensitivity case_sensitivity = case_sensitive_on;
120e93f7393Sniklas
121e93f7393Sniklas /* The current language and language_mode (see language.h) */
122e93f7393Sniklas
123e93f7393Sniklas const struct language_defn *current_language = &unknown_language_defn;
124e93f7393Sniklas enum language_mode language_mode = language_mode_auto;
125e93f7393Sniklas
126e93f7393Sniklas /* The language that the user expects to be typing in (the language
127e93f7393Sniklas of main(), or the last language we notified them about, or C). */
128e93f7393Sniklas
129e93f7393Sniklas const struct language_defn *expected_language;
130e93f7393Sniklas
131e93f7393Sniklas /* The list of supported languages. The list itself is malloc'd. */
132e93f7393Sniklas
133e93f7393Sniklas static const struct language_defn **languages;
134e93f7393Sniklas static unsigned languages_size;
135e93f7393Sniklas static unsigned languages_allocsize;
136e93f7393Sniklas #define DEFAULT_ALLOCSIZE 4
137e93f7393Sniklas
138e93f7393Sniklas /* The "set language/type/range" commands all put stuff in these
139e93f7393Sniklas buffers. This is to make them work as set/show commands. The
140e93f7393Sniklas user's string is copied here, then the set_* commands look at
141e93f7393Sniklas them and update them to something that looks nice when it is
142e93f7393Sniklas printed out. */
143e93f7393Sniklas
144e93f7393Sniklas static char *language;
145e93f7393Sniklas static char *type;
146e93f7393Sniklas static char *range;
147b725ae77Skettenis static char *case_sensitive;
148e93f7393Sniklas
149e93f7393Sniklas /* Warning issued when current_language and the language of the current
150e93f7393Sniklas frame do not match. */
151e93f7393Sniklas char lang_frame_mismatch_warn[] =
152e93f7393Sniklas "Warning: the current language does not match this frame.";
153e93f7393Sniklas
154e93f7393Sniklas /* This page contains the functions corresponding to GDB commands
155e93f7393Sniklas and their helpers. */
156e93f7393Sniklas
157e93f7393Sniklas /* Show command. Display a warning if the language set
158e93f7393Sniklas does not match the frame. */
159e93f7393Sniklas static void
show_language_command(char * ignore,int from_tty)160b725ae77Skettenis show_language_command (char *ignore, int from_tty)
161e93f7393Sniklas {
162e93f7393Sniklas enum language flang; /* The language of the current frame */
163e93f7393Sniklas
164e93f7393Sniklas flang = get_frame_language ();
165e93f7393Sniklas if (flang != language_unknown &&
166e93f7393Sniklas language_mode == language_mode_manual &&
167e93f7393Sniklas current_language->la_language != flang)
168e93f7393Sniklas printf_filtered ("%s\n", lang_frame_mismatch_warn);
169e93f7393Sniklas }
170e93f7393Sniklas
171e93f7393Sniklas /* Set command. Change the current working language. */
172e93f7393Sniklas static void
set_language_command(char * ignore,int from_tty)173b725ae77Skettenis set_language_command (char *ignore, int from_tty)
174e93f7393Sniklas {
175e93f7393Sniklas int i;
176e93f7393Sniklas enum language flang;
177e93f7393Sniklas char *err_lang;
178e93f7393Sniklas
179e93f7393Sniklas if (!language || !language[0])
180e93f7393Sniklas {
181e93f7393Sniklas printf_unfiltered ("The currently understood settings are:\n\n");
182e93f7393Sniklas printf_unfiltered ("local or auto Automatic setting based on source file\n");
183e93f7393Sniklas
184e93f7393Sniklas for (i = 0; i < languages_size; ++i)
185e93f7393Sniklas {
186e93f7393Sniklas /* Already dealt with these above. */
187e93f7393Sniklas if (languages[i]->la_language == language_unknown
188e93f7393Sniklas || languages[i]->la_language == language_auto)
189e93f7393Sniklas continue;
190e93f7393Sniklas
191e93f7393Sniklas /* FIXME for now assume that the human-readable name is just
192e93f7393Sniklas a capitalization of the internal name. */
193e93f7393Sniklas printf_unfiltered ("%-16s Use the %c%s language\n",
194e93f7393Sniklas languages[i]->la_name,
195e93f7393Sniklas /* Capitalize first letter of language
196e93f7393Sniklas name. */
197e93f7393Sniklas toupper (languages[i]->la_name[0]),
198e93f7393Sniklas languages[i]->la_name + 1);
199e93f7393Sniklas }
200e93f7393Sniklas /* Restore the silly string. */
201e93f7393Sniklas set_language (current_language->la_language);
202e93f7393Sniklas return;
203e93f7393Sniklas }
204e93f7393Sniklas
205e93f7393Sniklas /* Search the list of languages for a match. */
206b725ae77Skettenis for (i = 0; i < languages_size; i++)
207b725ae77Skettenis {
208b725ae77Skettenis if (strcmp (languages[i]->la_name, language) == 0)
209b725ae77Skettenis {
210e93f7393Sniklas /* Found it! Go into manual mode, and use this language. */
211b725ae77Skettenis if (languages[i]->la_language == language_auto)
212b725ae77Skettenis {
213e93f7393Sniklas /* Enter auto mode. Set to the current frame's language, if known. */
214e93f7393Sniklas language_mode = language_mode_auto;
215e93f7393Sniklas flang = get_frame_language ();
216e93f7393Sniklas if (flang != language_unknown)
217e93f7393Sniklas set_language (flang);
218e93f7393Sniklas expected_language = current_language;
219e93f7393Sniklas return;
220b725ae77Skettenis }
221b725ae77Skettenis else
222b725ae77Skettenis {
223e93f7393Sniklas /* Enter manual mode. Set the specified language. */
224e93f7393Sniklas language_mode = language_mode_manual;
225e93f7393Sniklas current_language = languages[i];
226b725ae77Skettenis set_type_range_case ();
227e93f7393Sniklas set_lang_str ();
228e93f7393Sniklas expected_language = current_language;
229e93f7393Sniklas return;
230e93f7393Sniklas }
231e93f7393Sniklas }
232e93f7393Sniklas }
233e93f7393Sniklas
234e93f7393Sniklas /* Reset the language (esp. the global string "language") to the
235e93f7393Sniklas correct values. */
236e93f7393Sniklas err_lang = savestring (language, strlen (language));
237b725ae77Skettenis make_cleanup (xfree, err_lang); /* Free it after error */
238e93f7393Sniklas set_language (current_language->la_language);
239e93f7393Sniklas error ("Unknown language `%s'.", err_lang);
240e93f7393Sniklas }
241e93f7393Sniklas
242e93f7393Sniklas /* Show command. Display a warning if the type setting does
243e93f7393Sniklas not match the current language. */
244e93f7393Sniklas static void
show_type_command(char * ignore,int from_tty)245b725ae77Skettenis show_type_command (char *ignore, int from_tty)
246e93f7393Sniklas {
247e93f7393Sniklas if (type_check != current_language->la_type_check)
248e93f7393Sniklas printf_unfiltered (
249e93f7393Sniklas "Warning: the current type check setting does not match the language.\n");
250e93f7393Sniklas }
251e93f7393Sniklas
252e93f7393Sniklas /* Set command. Change the setting for type checking. */
253e93f7393Sniklas static void
set_type_command(char * ignore,int from_tty)254b725ae77Skettenis set_type_command (char *ignore, int from_tty)
255e93f7393Sniklas {
256b725ae77Skettenis if (strcmp (type, "on") == 0)
257e93f7393Sniklas {
258e93f7393Sniklas type_check = type_check_on;
259e93f7393Sniklas type_mode = type_mode_manual;
260e93f7393Sniklas }
261b725ae77Skettenis else if (strcmp (type, "warn") == 0)
262e93f7393Sniklas {
263e93f7393Sniklas type_check = type_check_warn;
264e93f7393Sniklas type_mode = type_mode_manual;
265e93f7393Sniklas }
266b725ae77Skettenis else if (strcmp (type, "off") == 0)
267e93f7393Sniklas {
268e93f7393Sniklas type_check = type_check_off;
269e93f7393Sniklas type_mode = type_mode_manual;
270e93f7393Sniklas }
271b725ae77Skettenis else if (strcmp (type, "auto") == 0)
272e93f7393Sniklas {
273e93f7393Sniklas type_mode = type_mode_auto;
274b725ae77Skettenis set_type_range_case ();
275e93f7393Sniklas /* Avoid hitting the set_type_str call below. We
276b725ae77Skettenis did it in set_type_range_case. */
277e93f7393Sniklas return;
278e93f7393Sniklas }
279b725ae77Skettenis else
280b725ae77Skettenis {
281b725ae77Skettenis warning ("Unrecognized type check setting: \"%s\"", type);
282b725ae77Skettenis }
283e93f7393Sniklas set_type_str ();
284e93f7393Sniklas show_type_command ((char *) NULL, from_tty);
285e93f7393Sniklas }
286e93f7393Sniklas
287e93f7393Sniklas /* Show command. Display a warning if the range setting does
288e93f7393Sniklas not match the current language. */
289e93f7393Sniklas static void
show_range_command(char * ignore,int from_tty)290b725ae77Skettenis show_range_command (char *ignore, int from_tty)
291e93f7393Sniklas {
292e93f7393Sniklas
293e93f7393Sniklas if (range_check != current_language->la_range_check)
294e93f7393Sniklas printf_unfiltered (
295e93f7393Sniklas "Warning: the current range check setting does not match the language.\n");
296e93f7393Sniklas }
297e93f7393Sniklas
298e93f7393Sniklas /* Set command. Change the setting for range checking. */
299e93f7393Sniklas static void
set_range_command(char * ignore,int from_tty)300b725ae77Skettenis set_range_command (char *ignore, int from_tty)
301e93f7393Sniklas {
302b725ae77Skettenis if (strcmp (range, "on") == 0)
303e93f7393Sniklas {
304e93f7393Sniklas range_check = range_check_on;
305e93f7393Sniklas range_mode = range_mode_manual;
306e93f7393Sniklas }
307b725ae77Skettenis else if (strcmp (range, "warn") == 0)
308e93f7393Sniklas {
309e93f7393Sniklas range_check = range_check_warn;
310e93f7393Sniklas range_mode = range_mode_manual;
311e93f7393Sniklas }
312b725ae77Skettenis else if (strcmp (range, "off") == 0)
313e93f7393Sniklas {
314e93f7393Sniklas range_check = range_check_off;
315e93f7393Sniklas range_mode = range_mode_manual;
316e93f7393Sniklas }
317b725ae77Skettenis else if (strcmp (range, "auto") == 0)
318e93f7393Sniklas {
319e93f7393Sniklas range_mode = range_mode_auto;
320b725ae77Skettenis set_type_range_case ();
321e93f7393Sniklas /* Avoid hitting the set_range_str call below. We
322b725ae77Skettenis did it in set_type_range_case. */
323e93f7393Sniklas return;
324e93f7393Sniklas }
325b725ae77Skettenis else
326b725ae77Skettenis {
327b725ae77Skettenis warning ("Unrecognized range check setting: \"%s\"", range);
328b725ae77Skettenis }
329e93f7393Sniklas set_range_str ();
330e93f7393Sniklas show_range_command ((char *) 0, from_tty);
331e93f7393Sniklas }
332e93f7393Sniklas
333b725ae77Skettenis /* Show command. Display a warning if the case sensitivity setting does
334b725ae77Skettenis not match the current language. */
335b725ae77Skettenis static void
show_case_command(char * ignore,int from_tty)336b725ae77Skettenis show_case_command (char *ignore, int from_tty)
337b725ae77Skettenis {
338b725ae77Skettenis if (case_sensitivity != current_language->la_case_sensitivity)
339b725ae77Skettenis printf_unfiltered(
340b725ae77Skettenis "Warning: the current case sensitivity setting does not match the language.\n");
341b725ae77Skettenis }
342b725ae77Skettenis
343b725ae77Skettenis /* Set command. Change the setting for case sensitivity. */
344b725ae77Skettenis static void
set_case_command(char * ignore,int from_tty)345b725ae77Skettenis set_case_command (char *ignore, int from_tty)
346b725ae77Skettenis {
347b725ae77Skettenis if (DEPRECATED_STREQ (case_sensitive, "on"))
348b725ae77Skettenis {
349b725ae77Skettenis case_sensitivity = case_sensitive_on;
350b725ae77Skettenis case_mode = case_mode_manual;
351b725ae77Skettenis }
352b725ae77Skettenis else if (DEPRECATED_STREQ (case_sensitive, "off"))
353b725ae77Skettenis {
354b725ae77Skettenis case_sensitivity = case_sensitive_off;
355b725ae77Skettenis case_mode = case_mode_manual;
356b725ae77Skettenis }
357b725ae77Skettenis else if (DEPRECATED_STREQ (case_sensitive, "auto"))
358b725ae77Skettenis {
359b725ae77Skettenis case_mode = case_mode_auto;
360b725ae77Skettenis set_type_range_case ();
361b725ae77Skettenis /* Avoid hitting the set_case_str call below. We
362b725ae77Skettenis did it in set_type_range_case. */
363b725ae77Skettenis return;
364b725ae77Skettenis }
365b725ae77Skettenis else
366b725ae77Skettenis {
367b725ae77Skettenis warning ("Unrecognized case-sensitive setting: \"%s\"", case_sensitive);
368b725ae77Skettenis }
369b725ae77Skettenis set_case_str();
370b725ae77Skettenis show_case_command ((char *) NULL, from_tty);
371b725ae77Skettenis }
372b725ae77Skettenis
373b725ae77Skettenis /* Set the status of range and type checking and case sensitivity based on
374e93f7393Sniklas the current modes and the current language.
375e93f7393Sniklas If SHOW is non-zero, then print out the current language,
376e93f7393Sniklas type and range checking status. */
377e93f7393Sniklas static void
set_type_range_case(void)378b725ae77Skettenis set_type_range_case (void)
379e93f7393Sniklas {
380e93f7393Sniklas
381e93f7393Sniklas if (range_mode == range_mode_auto)
382e93f7393Sniklas range_check = current_language->la_range_check;
383e93f7393Sniklas
384e93f7393Sniklas if (type_mode == type_mode_auto)
385e93f7393Sniklas type_check = current_language->la_type_check;
386e93f7393Sniklas
387b725ae77Skettenis if (case_mode == case_mode_auto)
388b725ae77Skettenis case_sensitivity = current_language->la_case_sensitivity;
389b725ae77Skettenis
390e93f7393Sniklas set_type_str ();
391e93f7393Sniklas set_range_str ();
392b725ae77Skettenis set_case_str ();
393e93f7393Sniklas }
394e93f7393Sniklas
395b725ae77Skettenis /* Set current language to (enum language) LANG. Returns previous language. */
396e93f7393Sniklas
397b725ae77Skettenis enum language
set_language(enum language lang)398b725ae77Skettenis set_language (enum language lang)
399e93f7393Sniklas {
400e93f7393Sniklas int i;
401b725ae77Skettenis enum language prev_language;
402e93f7393Sniklas
403b725ae77Skettenis prev_language = current_language->la_language;
404b725ae77Skettenis
405b725ae77Skettenis for (i = 0; i < languages_size; i++)
406b725ae77Skettenis {
407b725ae77Skettenis if (languages[i]->la_language == lang)
408b725ae77Skettenis {
409e93f7393Sniklas current_language = languages[i];
410b725ae77Skettenis set_type_range_case ();
411e93f7393Sniklas set_lang_str ();
412e93f7393Sniklas break;
413e93f7393Sniklas }
414e93f7393Sniklas }
415b725ae77Skettenis
416b725ae77Skettenis return prev_language;
417e93f7393Sniklas }
418e93f7393Sniklas
419e93f7393Sniklas /* This page contains functions that update the global vars
420e93f7393Sniklas language, type and range. */
421e93f7393Sniklas static void
set_lang_str(void)422b725ae77Skettenis set_lang_str (void)
423e93f7393Sniklas {
424e93f7393Sniklas char *prefix = "";
425e93f7393Sniklas
426b725ae77Skettenis if (language)
427b725ae77Skettenis xfree (language);
428e93f7393Sniklas if (language_mode == language_mode_auto)
429e93f7393Sniklas prefix = "auto; currently ";
430e93f7393Sniklas
431e93f7393Sniklas language = concat (prefix, current_language->la_name, NULL);
432e93f7393Sniklas }
433e93f7393Sniklas
434e93f7393Sniklas static void
set_type_str(void)435b725ae77Skettenis set_type_str (void)
436e93f7393Sniklas {
437b725ae77Skettenis char *tmp = NULL, *prefix = "";
438e93f7393Sniklas
439b725ae77Skettenis if (type)
440b725ae77Skettenis xfree (type);
441e93f7393Sniklas if (type_mode == type_mode_auto)
442e93f7393Sniklas prefix = "auto; currently ";
443e93f7393Sniklas
444e93f7393Sniklas switch (type_check)
445e93f7393Sniklas {
446e93f7393Sniklas case type_check_on:
447e93f7393Sniklas tmp = "on";
448e93f7393Sniklas break;
449e93f7393Sniklas case type_check_off:
450e93f7393Sniklas tmp = "off";
451e93f7393Sniklas break;
452e93f7393Sniklas case type_check_warn:
453e93f7393Sniklas tmp = "warn";
454e93f7393Sniklas break;
455e93f7393Sniklas default:
456e93f7393Sniklas error ("Unrecognized type check setting.");
457e93f7393Sniklas }
458e93f7393Sniklas
459e93f7393Sniklas type = concat (prefix, tmp, NULL);
460e93f7393Sniklas }
461e93f7393Sniklas
462e93f7393Sniklas static void
set_range_str(void)463b725ae77Skettenis set_range_str (void)
464e93f7393Sniklas {
465e93f7393Sniklas char *tmp, *pref = "";
466e93f7393Sniklas
467e93f7393Sniklas if (range_mode == range_mode_auto)
468e93f7393Sniklas pref = "auto; currently ";
469e93f7393Sniklas
470e93f7393Sniklas switch (range_check)
471e93f7393Sniklas {
472e93f7393Sniklas case range_check_on:
473e93f7393Sniklas tmp = "on";
474e93f7393Sniklas break;
475e93f7393Sniklas case range_check_off:
476e93f7393Sniklas tmp = "off";
477e93f7393Sniklas break;
478e93f7393Sniklas case range_check_warn:
479e93f7393Sniklas tmp = "warn";
480e93f7393Sniklas break;
481e93f7393Sniklas default:
482e93f7393Sniklas error ("Unrecognized range check setting.");
483e93f7393Sniklas }
484e93f7393Sniklas
485b725ae77Skettenis if (range)
486b725ae77Skettenis xfree (range);
487e93f7393Sniklas range = concat (pref, tmp, NULL);
488e93f7393Sniklas }
489e93f7393Sniklas
490b725ae77Skettenis static void
set_case_str(void)491b725ae77Skettenis set_case_str (void)
492b725ae77Skettenis {
493b725ae77Skettenis char *tmp = NULL, *prefix = "";
494b725ae77Skettenis
495b725ae77Skettenis if (case_mode==case_mode_auto)
496b725ae77Skettenis prefix = "auto; currently ";
497b725ae77Skettenis
498b725ae77Skettenis switch (case_sensitivity)
499b725ae77Skettenis {
500b725ae77Skettenis case case_sensitive_on:
501b725ae77Skettenis tmp = "on";
502b725ae77Skettenis break;
503b725ae77Skettenis case case_sensitive_off:
504b725ae77Skettenis tmp = "off";
505b725ae77Skettenis break;
506b725ae77Skettenis default:
507b725ae77Skettenis error ("Unrecognized case-sensitive setting.");
508b725ae77Skettenis }
509b725ae77Skettenis
510b725ae77Skettenis xfree (case_sensitive);
511b725ae77Skettenis case_sensitive = concat (prefix, tmp, NULL);
512b725ae77Skettenis }
513e93f7393Sniklas
514e93f7393Sniklas /* Print out the current language settings: language, range and
515e93f7393Sniklas type checking. If QUIETLY, print only what has changed. */
516e93f7393Sniklas
517e93f7393Sniklas void
language_info(int quietly)518b725ae77Skettenis language_info (int quietly)
519e93f7393Sniklas {
520e93f7393Sniklas if (quietly && expected_language == current_language)
521e93f7393Sniklas return;
522e93f7393Sniklas
523e93f7393Sniklas expected_language = current_language;
524e93f7393Sniklas printf_unfiltered ("Current language: %s\n", language);
525e93f7393Sniklas show_language_command ((char *) 0, 1);
526e93f7393Sniklas
527e93f7393Sniklas if (!quietly)
528e93f7393Sniklas {
529e93f7393Sniklas printf_unfiltered ("Type checking: %s\n", type);
530e93f7393Sniklas show_type_command ((char *) 0, 1);
531e93f7393Sniklas printf_unfiltered ("Range checking: %s\n", range);
532e93f7393Sniklas show_range_command ((char *) 0, 1);
533b725ae77Skettenis printf_unfiltered ("Case sensitivity: %s\n", case_sensitive);
534b725ae77Skettenis show_case_command ((char *) 0, 1);
535e93f7393Sniklas }
536e93f7393Sniklas }
537e93f7393Sniklas
538e93f7393Sniklas /* Return the result of a binary operation. */
539e93f7393Sniklas
540e93f7393Sniklas #if 0 /* Currently unused */
541e93f7393Sniklas
542e93f7393Sniklas struct type *
543b725ae77Skettenis binop_result_type (struct value *v1, struct value *v2)
544e93f7393Sniklas {
545e93f7393Sniklas int size, uns;
546e93f7393Sniklas struct type *t1 = check_typedef (VALUE_TYPE (v1));
547e93f7393Sniklas struct type *t2 = check_typedef (VALUE_TYPE (v2));
548e93f7393Sniklas
549e93f7393Sniklas int l1 = TYPE_LENGTH (t1);
550e93f7393Sniklas int l2 = TYPE_LENGTH (t2);
551e93f7393Sniklas
552e93f7393Sniklas switch (current_language->la_language)
553e93f7393Sniklas {
554e93f7393Sniklas case language_c:
555e93f7393Sniklas case language_cplus:
556b725ae77Skettenis case language_objc:
557e93f7393Sniklas if (TYPE_CODE (t1) == TYPE_CODE_FLT)
558e93f7393Sniklas return TYPE_CODE (t2) == TYPE_CODE_FLT && l2 > l1 ?
559e93f7393Sniklas VALUE_TYPE (v2) : VALUE_TYPE (v1);
560e93f7393Sniklas else if (TYPE_CODE (t2) == TYPE_CODE_FLT)
561b725ae77Skettenis return TYPE_CODE (t1) == TYPE_CODE_FLT && l1 > l2 ?
562e93f7393Sniklas VALUE_TYPE (v1) : VALUE_TYPE (v2);
563e93f7393Sniklas else if (TYPE_UNSIGNED (t1) && l1 > l2)
564e93f7393Sniklas return VALUE_TYPE (v1);
565e93f7393Sniklas else if (TYPE_UNSIGNED (t2) && l2 > l1)
566e93f7393Sniklas return VALUE_TYPE (v2);
567e93f7393Sniklas else /* Both are signed. Result is the longer type */
568e93f7393Sniklas return l1 > l2 ? VALUE_TYPE (v1) : VALUE_TYPE (v2);
569e93f7393Sniklas break;
570e93f7393Sniklas case language_m2:
571e93f7393Sniklas /* If we are doing type-checking, l1 should equal l2, so this is
572e93f7393Sniklas not needed. */
573e93f7393Sniklas return l1 > l2 ? VALUE_TYPE (v1) : VALUE_TYPE (v2);
574e93f7393Sniklas break;
575e93f7393Sniklas }
576b725ae77Skettenis internal_error (__FILE__, __LINE__, "failed internal consistency check");
577e93f7393Sniklas return (struct type *) 0; /* For lint */
578e93f7393Sniklas }
579e93f7393Sniklas
580e93f7393Sniklas #endif /* 0 */
581e93f7393Sniklas #if 0
582e93f7393Sniklas /* This page contains functions that are used in type/range checking.
583e93f7393Sniklas They all return zero if the type/range check fails.
584e93f7393Sniklas
585e93f7393Sniklas It is hoped that these will make extending GDB to parse different
586e93f7393Sniklas languages a little easier. These are primarily used in eval.c when
587e93f7393Sniklas evaluating expressions and making sure that their types are correct.
588e93f7393Sniklas Instead of having a mess of conjucted/disjuncted expressions in an "if",
589e93f7393Sniklas the ideas of type can be wrapped up in the following functions.
590e93f7393Sniklas
591e93f7393Sniklas Note that some of them are not currently dependent upon which language
592e93f7393Sniklas is currently being parsed. For example, floats are the same in
593e93f7393Sniklas C and Modula-2 (ie. the only floating point type has TYPE_CODE of
594e93f7393Sniklas TYPE_CODE_FLT), while booleans are different. */
595e93f7393Sniklas
596e93f7393Sniklas /* Returns non-zero if its argument is a simple type. This is the same for
597e93f7393Sniklas both Modula-2 and for C. In the C case, TYPE_CODE_CHAR will never occur,
598e93f7393Sniklas and thus will never cause the failure of the test. */
599e93f7393Sniklas int
600b725ae77Skettenis simple_type (struct type *type)
601e93f7393Sniklas {
602e93f7393Sniklas CHECK_TYPEDEF (type);
603b725ae77Skettenis switch (TYPE_CODE (type))
604b725ae77Skettenis {
605e93f7393Sniklas case TYPE_CODE_INT:
606e93f7393Sniklas case TYPE_CODE_CHAR:
607e93f7393Sniklas case TYPE_CODE_ENUM:
608e93f7393Sniklas case TYPE_CODE_FLT:
609e93f7393Sniklas case TYPE_CODE_RANGE:
610e93f7393Sniklas case TYPE_CODE_BOOL:
611e93f7393Sniklas return 1;
612e93f7393Sniklas
613e93f7393Sniklas default:
614e93f7393Sniklas return 0;
615e93f7393Sniklas }
616e93f7393Sniklas }
617e93f7393Sniklas
618e93f7393Sniklas /* Returns non-zero if its argument is of an ordered type.
619e93f7393Sniklas An ordered type is one in which the elements can be tested for the
620e93f7393Sniklas properties of "greater than", "less than", etc, or for which the
621e93f7393Sniklas operations "increment" or "decrement" make sense. */
622e93f7393Sniklas int
623b725ae77Skettenis ordered_type (struct type *type)
624e93f7393Sniklas {
625e93f7393Sniklas CHECK_TYPEDEF (type);
626b725ae77Skettenis switch (TYPE_CODE (type))
627b725ae77Skettenis {
628e93f7393Sniklas case TYPE_CODE_INT:
629e93f7393Sniklas case TYPE_CODE_CHAR:
630e93f7393Sniklas case TYPE_CODE_ENUM:
631e93f7393Sniklas case TYPE_CODE_FLT:
632e93f7393Sniklas case TYPE_CODE_RANGE:
633e93f7393Sniklas return 1;
634e93f7393Sniklas
635e93f7393Sniklas default:
636e93f7393Sniklas return 0;
637e93f7393Sniklas }
638e93f7393Sniklas }
639e93f7393Sniklas
640e93f7393Sniklas /* Returns non-zero if the two types are the same */
641e93f7393Sniklas int
642b725ae77Skettenis same_type (struct type *arg1, struct type *arg2)
643e93f7393Sniklas {
644e93f7393Sniklas CHECK_TYPEDEF (type);
645e93f7393Sniklas if (structured_type (arg1) ? !structured_type (arg2) : structured_type (arg2))
646e93f7393Sniklas /* One is structured and one isn't */
647e93f7393Sniklas return 0;
648e93f7393Sniklas else if (structured_type (arg1) && structured_type (arg2))
649e93f7393Sniklas return arg1 == arg2;
650e93f7393Sniklas else if (numeric_type (arg1) && numeric_type (arg2))
651e93f7393Sniklas return (TYPE_CODE (arg2) == TYPE_CODE (arg1)) &&
652e93f7393Sniklas (TYPE_UNSIGNED (arg1) == TYPE_UNSIGNED (arg2))
653e93f7393Sniklas ? 1 : 0;
654e93f7393Sniklas else
655e93f7393Sniklas return arg1 == arg2;
656e93f7393Sniklas }
657e93f7393Sniklas
658e93f7393Sniklas /* Returns non-zero if the type is integral */
659e93f7393Sniklas int
660b725ae77Skettenis integral_type (struct type *type)
661e93f7393Sniklas {
662e93f7393Sniklas CHECK_TYPEDEF (type);
663e93f7393Sniklas switch (current_language->la_language)
664e93f7393Sniklas {
665e93f7393Sniklas case language_c:
666e93f7393Sniklas case language_cplus:
667b725ae77Skettenis case language_objc:
668e93f7393Sniklas return (TYPE_CODE (type) != TYPE_CODE_INT) &&
669e93f7393Sniklas (TYPE_CODE (type) != TYPE_CODE_ENUM) ? 0 : 1;
670e93f7393Sniklas case language_m2:
671b725ae77Skettenis case language_pascal:
672e93f7393Sniklas return TYPE_CODE (type) != TYPE_CODE_INT ? 0 : 1;
673e93f7393Sniklas default:
674e93f7393Sniklas error ("Language not supported.");
675e93f7393Sniklas }
676e93f7393Sniklas }
677e93f7393Sniklas
678e93f7393Sniklas /* Returns non-zero if the value is numeric */
679e93f7393Sniklas int
680b725ae77Skettenis numeric_type (struct type *type)
681e93f7393Sniklas {
682e93f7393Sniklas CHECK_TYPEDEF (type);
683b725ae77Skettenis switch (TYPE_CODE (type))
684b725ae77Skettenis {
685e93f7393Sniklas case TYPE_CODE_INT:
686e93f7393Sniklas case TYPE_CODE_FLT:
687e93f7393Sniklas return 1;
688e93f7393Sniklas
689e93f7393Sniklas default:
690e93f7393Sniklas return 0;
691e93f7393Sniklas }
692e93f7393Sniklas }
693e93f7393Sniklas
694e93f7393Sniklas /* Returns non-zero if the value is a character type */
695e93f7393Sniklas int
696b725ae77Skettenis character_type (struct type *type)
697e93f7393Sniklas {
698e93f7393Sniklas CHECK_TYPEDEF (type);
699e93f7393Sniklas switch (current_language->la_language)
700e93f7393Sniklas {
701e93f7393Sniklas case language_m2:
702b725ae77Skettenis case language_pascal:
703e93f7393Sniklas return TYPE_CODE (type) != TYPE_CODE_CHAR ? 0 : 1;
704e93f7393Sniklas
705e93f7393Sniklas case language_c:
706e93f7393Sniklas case language_cplus:
707b725ae77Skettenis case language_objc:
708e93f7393Sniklas return (TYPE_CODE (type) == TYPE_CODE_INT) &&
709e93f7393Sniklas TYPE_LENGTH (type) == sizeof (char)
710e93f7393Sniklas ? 1 : 0;
711e93f7393Sniklas default:
712e93f7393Sniklas return (0);
713e93f7393Sniklas }
714e93f7393Sniklas }
715e93f7393Sniklas
716e93f7393Sniklas /* Returns non-zero if the value is a string type */
717e93f7393Sniklas int
718b725ae77Skettenis string_type (struct type *type)
719e93f7393Sniklas {
720e93f7393Sniklas CHECK_TYPEDEF (type);
721e93f7393Sniklas switch (current_language->la_language)
722e93f7393Sniklas {
723e93f7393Sniklas case language_m2:
724b725ae77Skettenis case language_pascal:
725e93f7393Sniklas return TYPE_CODE (type) != TYPE_CODE_STRING ? 0 : 1;
726e93f7393Sniklas
727e93f7393Sniklas case language_c:
728e93f7393Sniklas case language_cplus:
729b725ae77Skettenis case language_objc:
730e93f7393Sniklas /* C does not have distinct string type. */
731e93f7393Sniklas return (0);
732e93f7393Sniklas default:
733e93f7393Sniklas return (0);
734e93f7393Sniklas }
735e93f7393Sniklas }
736e93f7393Sniklas
737e93f7393Sniklas /* Returns non-zero if the value is a boolean type */
738e93f7393Sniklas int
739b725ae77Skettenis boolean_type (struct type *type)
740e93f7393Sniklas {
741e93f7393Sniklas CHECK_TYPEDEF (type);
742e93f7393Sniklas if (TYPE_CODE (type) == TYPE_CODE_BOOL)
743e93f7393Sniklas return 1;
744e93f7393Sniklas switch (current_language->la_language)
745e93f7393Sniklas {
746e93f7393Sniklas case language_c:
747e93f7393Sniklas case language_cplus:
748b725ae77Skettenis case language_objc:
749b725ae77Skettenis /* Might be more cleanly handled by having a
750b725ae77Skettenis TYPE_CODE_INT_NOT_BOOL for (the deleted) CHILL and such
751b725ae77Skettenis languages, or a TYPE_CODE_INT_OR_BOOL for C. */
752e93f7393Sniklas if (TYPE_CODE (type) == TYPE_CODE_INT)
753e93f7393Sniklas return 1;
754e93f7393Sniklas default:
755e93f7393Sniklas break;
756e93f7393Sniklas }
757e93f7393Sniklas return 0;
758e93f7393Sniklas }
759e93f7393Sniklas
760e93f7393Sniklas /* Returns non-zero if the value is a floating-point type */
761e93f7393Sniklas int
762b725ae77Skettenis float_type (struct type *type)
763e93f7393Sniklas {
764e93f7393Sniklas CHECK_TYPEDEF (type);
765e93f7393Sniklas return TYPE_CODE (type) == TYPE_CODE_FLT;
766e93f7393Sniklas }
767e93f7393Sniklas
768e93f7393Sniklas /* Returns non-zero if the value is a pointer type */
769e93f7393Sniklas int
770b725ae77Skettenis pointer_type (struct type *type)
771e93f7393Sniklas {
772e93f7393Sniklas return TYPE_CODE (type) == TYPE_CODE_PTR ||
773e93f7393Sniklas TYPE_CODE (type) == TYPE_CODE_REF;
774e93f7393Sniklas }
775e93f7393Sniklas
776e93f7393Sniklas /* Returns non-zero if the value is a structured type */
777e93f7393Sniklas int
778b725ae77Skettenis structured_type (struct type *type)
779e93f7393Sniklas {
780e93f7393Sniklas CHECK_TYPEDEF (type);
781e93f7393Sniklas switch (current_language->la_language)
782e93f7393Sniklas {
783e93f7393Sniklas case language_c:
784e93f7393Sniklas case language_cplus:
785b725ae77Skettenis case language_objc:
786e93f7393Sniklas return (TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
787e93f7393Sniklas (TYPE_CODE (type) == TYPE_CODE_UNION) ||
788e93f7393Sniklas (TYPE_CODE (type) == TYPE_CODE_ARRAY);
789b725ae77Skettenis case language_pascal:
790b725ae77Skettenis return (TYPE_CODE(type) == TYPE_CODE_STRUCT) ||
791b725ae77Skettenis (TYPE_CODE(type) == TYPE_CODE_UNION) ||
792b725ae77Skettenis (TYPE_CODE(type) == TYPE_CODE_SET) ||
793b725ae77Skettenis (TYPE_CODE(type) == TYPE_CODE_ARRAY);
794e93f7393Sniklas case language_m2:
795e93f7393Sniklas return (TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
796e93f7393Sniklas (TYPE_CODE (type) == TYPE_CODE_SET) ||
797e93f7393Sniklas (TYPE_CODE (type) == TYPE_CODE_ARRAY);
798e93f7393Sniklas default:
799e93f7393Sniklas return (0);
800e93f7393Sniklas }
801e93f7393Sniklas }
802e93f7393Sniklas #endif
803e93f7393Sniklas
804e93f7393Sniklas struct type *
lang_bool_type(void)805b725ae77Skettenis lang_bool_type (void)
806e93f7393Sniklas {
807e93f7393Sniklas struct symbol *sym;
808e93f7393Sniklas struct type *type;
809e93f7393Sniklas switch (current_language->la_language)
810e93f7393Sniklas {
811e93f7393Sniklas case language_fortran:
812b725ae77Skettenis sym = lookup_symbol ("logical", NULL, VAR_DOMAIN, NULL, NULL);
813e93f7393Sniklas if (sym)
814e93f7393Sniklas {
815e93f7393Sniklas type = SYMBOL_TYPE (sym);
816e93f7393Sniklas if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
817e93f7393Sniklas return type;
818e93f7393Sniklas }
819e93f7393Sniklas return builtin_type_f_logical_s2;
820e93f7393Sniklas case language_cplus:
821b725ae77Skettenis case language_pascal:
822b725ae77Skettenis if (current_language->la_language==language_cplus)
823b725ae77Skettenis {sym = lookup_symbol ("bool", NULL, VAR_DOMAIN, NULL, NULL);}
824b725ae77Skettenis else
825b725ae77Skettenis {sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);}
826e93f7393Sniklas if (sym)
827e93f7393Sniklas {
828e93f7393Sniklas type = SYMBOL_TYPE (sym);
829e93f7393Sniklas if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
830e93f7393Sniklas return type;
831e93f7393Sniklas }
832b725ae77Skettenis return builtin_type_bool;
833b725ae77Skettenis case language_java:
834b725ae77Skettenis sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);
835b725ae77Skettenis if (sym)
836b725ae77Skettenis {
837b725ae77Skettenis type = SYMBOL_TYPE (sym);
838b725ae77Skettenis if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
839b725ae77Skettenis return type;
840b725ae77Skettenis }
841b725ae77Skettenis return java_boolean_type;
842e93f7393Sniklas default:
843e93f7393Sniklas return builtin_type_int;
844e93f7393Sniklas }
845e93f7393Sniklas }
846e93f7393Sniklas
847e93f7393Sniklas /* This page contains functions that return info about
848e93f7393Sniklas (struct value) values used in GDB. */
849e93f7393Sniklas
850e93f7393Sniklas /* Returns non-zero if the value VAL represents a true value. */
851e93f7393Sniklas int
value_true(struct value * val)852b725ae77Skettenis value_true (struct value *val)
853e93f7393Sniklas {
854e93f7393Sniklas /* It is possible that we should have some sort of error if a non-boolean
855e93f7393Sniklas value is used in this context. Possibly dependent on some kind of
856e93f7393Sniklas "boolean-checking" option like range checking. But it should probably
857e93f7393Sniklas not depend on the language except insofar as is necessary to identify
858e93f7393Sniklas a "boolean" value (i.e. in C using a float, pointer, etc., as a boolean
859e93f7393Sniklas should be an error, probably). */
860e93f7393Sniklas return !value_logical_not (val);
861e93f7393Sniklas }
862e93f7393Sniklas
863e93f7393Sniklas /* This page contains functions for the printing out of
864e93f7393Sniklas error messages that occur during type- and range-
865e93f7393Sniklas checking. */
866e93f7393Sniklas
867b725ae77Skettenis /* These are called when a language fails a type- or range-check. The
868b725ae77Skettenis first argument should be a printf()-style format string, and the
869b725ae77Skettenis rest of the arguments should be its arguments. If
870b725ae77Skettenis [type|range]_check is [type|range]_check_on, an error is printed;
871b725ae77Skettenis if [type|range]_check_warn, a warning; otherwise just the
872b725ae77Skettenis message. */
873e93f7393Sniklas
874e93f7393Sniklas void
type_error(const char * string,...)875b725ae77Skettenis type_error (const char *string,...)
876e93f7393Sniklas {
877e93f7393Sniklas va_list args;
878e93f7393Sniklas va_start (args, string);
879e93f7393Sniklas
880b725ae77Skettenis switch (type_check)
881b725ae77Skettenis {
882b725ae77Skettenis case type_check_warn:
883b725ae77Skettenis vwarning (string, args);
884b725ae77Skettenis break;
885b725ae77Skettenis case type_check_on:
886b725ae77Skettenis verror (string, args);
887b725ae77Skettenis break;
888b725ae77Skettenis case type_check_off:
889b725ae77Skettenis /* FIXME: cagney/2002-01-30: Should this function print anything
890b725ae77Skettenis when type error is off? */
891e93f7393Sniklas vfprintf_filtered (gdb_stderr, string, args);
892e93f7393Sniklas fprintf_filtered (gdb_stderr, "\n");
893b725ae77Skettenis break;
894b725ae77Skettenis default:
895b725ae77Skettenis internal_error (__FILE__, __LINE__, "bad switch");
896b725ae77Skettenis }
897e93f7393Sniklas va_end (args);
898e93f7393Sniklas }
899e93f7393Sniklas
900e93f7393Sniklas void
range_error(const char * string,...)901b725ae77Skettenis range_error (const char *string,...)
902e93f7393Sniklas {
903e93f7393Sniklas va_list args;
904e93f7393Sniklas va_start (args, string);
905e93f7393Sniklas
906b725ae77Skettenis switch (range_check)
907b725ae77Skettenis {
908b725ae77Skettenis case range_check_warn:
909b725ae77Skettenis vwarning (string, args);
910b725ae77Skettenis break;
911b725ae77Skettenis case range_check_on:
912b725ae77Skettenis verror (string, args);
913b725ae77Skettenis break;
914b725ae77Skettenis case range_check_off:
915b725ae77Skettenis /* FIXME: cagney/2002-01-30: Should this function print anything
916b725ae77Skettenis when range error is off? */
917e93f7393Sniklas vfprintf_filtered (gdb_stderr, string, args);
918e93f7393Sniklas fprintf_filtered (gdb_stderr, "\n");
919b725ae77Skettenis break;
920b725ae77Skettenis default:
921b725ae77Skettenis internal_error (__FILE__, __LINE__, "bad switch");
922e93f7393Sniklas }
923b725ae77Skettenis va_end (args);
924b725ae77Skettenis }
925e93f7393Sniklas
926b725ae77Skettenis
927e93f7393Sniklas /* This page contains miscellaneous functions */
928e93f7393Sniklas
929b725ae77Skettenis /* Return the language enum for a given language string. */
930b725ae77Skettenis
931b725ae77Skettenis enum language
language_enum(char * str)932b725ae77Skettenis language_enum (char *str)
933b725ae77Skettenis {
934b725ae77Skettenis int i;
935b725ae77Skettenis
936b725ae77Skettenis for (i = 0; i < languages_size; i++)
937b725ae77Skettenis if (DEPRECATED_STREQ (languages[i]->la_name, str))
938b725ae77Skettenis return languages[i]->la_language;
939b725ae77Skettenis
940b725ae77Skettenis return language_unknown;
941b725ae77Skettenis }
942b725ae77Skettenis
943e93f7393Sniklas /* Return the language struct for a given language enum. */
944e93f7393Sniklas
945e93f7393Sniklas const struct language_defn *
language_def(enum language lang)946b725ae77Skettenis language_def (enum language lang)
947e93f7393Sniklas {
948e93f7393Sniklas int i;
949e93f7393Sniklas
950b725ae77Skettenis for (i = 0; i < languages_size; i++)
951b725ae77Skettenis {
952b725ae77Skettenis if (languages[i]->la_language == lang)
953b725ae77Skettenis {
954e93f7393Sniklas return languages[i];
955e93f7393Sniklas }
956e93f7393Sniklas }
957e93f7393Sniklas return NULL;
958e93f7393Sniklas }
959e93f7393Sniklas
960e93f7393Sniklas /* Return the language as a string */
961e93f7393Sniklas char *
language_str(enum language lang)962b725ae77Skettenis language_str (enum language lang)
963e93f7393Sniklas {
964e93f7393Sniklas int i;
965e93f7393Sniklas
966b725ae77Skettenis for (i = 0; i < languages_size; i++)
967b725ae77Skettenis {
968b725ae77Skettenis if (languages[i]->la_language == lang)
969b725ae77Skettenis {
970e93f7393Sniklas return languages[i]->la_name;
971e93f7393Sniklas }
972e93f7393Sniklas }
973e93f7393Sniklas return "Unknown";
974e93f7393Sniklas }
975e93f7393Sniklas
976e93f7393Sniklas static void
set_check(char * ignore,int from_tty)977b725ae77Skettenis set_check (char *ignore, int from_tty)
978e93f7393Sniklas {
979e93f7393Sniklas printf_unfiltered (
980e93f7393Sniklas "\"set check\" must be followed by the name of a check subcommand.\n");
981e93f7393Sniklas help_list (setchecklist, "set check ", -1, gdb_stdout);
982e93f7393Sniklas }
983e93f7393Sniklas
984e93f7393Sniklas static void
show_check(char * ignore,int from_tty)985b725ae77Skettenis show_check (char *ignore, int from_tty)
986e93f7393Sniklas {
987e93f7393Sniklas cmd_show_list (showchecklist, from_tty, "");
988e93f7393Sniklas }
989e93f7393Sniklas
990e93f7393Sniklas /* Add a language to the set of known languages. */
991e93f7393Sniklas
992e93f7393Sniklas void
add_language(const struct language_defn * lang)993b725ae77Skettenis add_language (const struct language_defn *lang)
994e93f7393Sniklas {
995e93f7393Sniklas if (lang->la_magic != LANG_MAGIC)
996e93f7393Sniklas {
997e93f7393Sniklas fprintf_unfiltered (gdb_stderr, "Magic number of %s language struct wrong\n",
998e93f7393Sniklas lang->la_name);
999b725ae77Skettenis internal_error (__FILE__, __LINE__, "failed internal consistency check");
1000e93f7393Sniklas }
1001e93f7393Sniklas
1002e93f7393Sniklas if (!languages)
1003e93f7393Sniklas {
1004e93f7393Sniklas languages_allocsize = DEFAULT_ALLOCSIZE;
1005e93f7393Sniklas languages = (const struct language_defn **) xmalloc
1006e93f7393Sniklas (languages_allocsize * sizeof (*languages));
1007e93f7393Sniklas }
1008e93f7393Sniklas if (languages_size >= languages_allocsize)
1009e93f7393Sniklas {
1010e93f7393Sniklas languages_allocsize *= 2;
1011e93f7393Sniklas languages = (const struct language_defn **) xrealloc ((char *) languages,
1012e93f7393Sniklas languages_allocsize * sizeof (*languages));
1013e93f7393Sniklas }
1014e93f7393Sniklas languages[languages_size++] = lang;
1015e93f7393Sniklas }
1016e93f7393Sniklas
1017b725ae77Skettenis /* Iterate through all registered languages looking for and calling
1018b725ae77Skettenis any non-NULL struct language_defn.skip_trampoline() functions.
1019b725ae77Skettenis Return the result from the first that returns non-zero, or 0 if all
1020b725ae77Skettenis `fail'. */
1021b725ae77Skettenis CORE_ADDR
skip_language_trampoline(CORE_ADDR pc)1022b725ae77Skettenis skip_language_trampoline (CORE_ADDR pc)
1023b725ae77Skettenis {
1024b725ae77Skettenis int i;
1025b725ae77Skettenis
1026b725ae77Skettenis for (i = 0; i < languages_size; i++)
1027b725ae77Skettenis {
1028b725ae77Skettenis if (languages[i]->skip_trampoline)
1029b725ae77Skettenis {
1030b725ae77Skettenis CORE_ADDR real_pc = (languages[i]->skip_trampoline) (pc);
1031b725ae77Skettenis if (real_pc)
1032b725ae77Skettenis return real_pc;
1033b725ae77Skettenis }
1034b725ae77Skettenis }
1035b725ae77Skettenis
1036b725ae77Skettenis return 0;
1037b725ae77Skettenis }
1038b725ae77Skettenis
1039b725ae77Skettenis /* Return demangled language symbol, or NULL.
1040b725ae77Skettenis FIXME: Options are only useful for certain languages and ignored
1041b725ae77Skettenis by others, so it would be better to remove them here and have a
1042b725ae77Skettenis more flexible demangler for the languages that need it.
1043b725ae77Skettenis FIXME: Sometimes the demangler is invoked when we don't know the
1044b725ae77Skettenis language, so we can't use this everywhere. */
1045b725ae77Skettenis char *
language_demangle(const struct language_defn * current_language,const char * mangled,int options)1046b725ae77Skettenis language_demangle (const struct language_defn *current_language,
1047b725ae77Skettenis const char *mangled, int options)
1048b725ae77Skettenis {
1049b725ae77Skettenis if (current_language != NULL && current_language->la_demangle)
1050b725ae77Skettenis return current_language->la_demangle (mangled, options);
1051b725ae77Skettenis return NULL;
1052b725ae77Skettenis }
1053b725ae77Skettenis
1054*63addd46Skettenis /* Return class name from physname or NULL. */
1055*63addd46Skettenis char *
language_class_name_from_physname(const struct language_defn * current_language,const char * physname)1056*63addd46Skettenis language_class_name_from_physname (const struct language_defn *current_language,
1057*63addd46Skettenis const char *physname)
1058*63addd46Skettenis {
1059*63addd46Skettenis if (current_language != NULL && current_language->la_class_name_from_physname)
1060*63addd46Skettenis return current_language->la_class_name_from_physname (physname);
1061*63addd46Skettenis return NULL;
1062*63addd46Skettenis }
1063*63addd46Skettenis
1064b725ae77Skettenis /* Return the default string containing the list of characters
1065b725ae77Skettenis delimiting words. This is a reasonable default value that
1066b725ae77Skettenis most languages should be able to use. */
1067b725ae77Skettenis
1068b725ae77Skettenis char *
default_word_break_characters(void)1069b725ae77Skettenis default_word_break_characters (void)
1070b725ae77Skettenis {
1071b725ae77Skettenis return " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-";
1072b725ae77Skettenis }
1073b725ae77Skettenis
1074e93f7393Sniklas /* Define the language that is no language. */
1075e93f7393Sniklas
1076e93f7393Sniklas static int
unk_lang_parser(void)1077b725ae77Skettenis unk_lang_parser (void)
1078e93f7393Sniklas {
1079e93f7393Sniklas return 1;
1080e93f7393Sniklas }
1081e93f7393Sniklas
1082e93f7393Sniklas static void
unk_lang_error(char * msg)1083b725ae77Skettenis unk_lang_error (char *msg)
1084e93f7393Sniklas {
1085e93f7393Sniklas error ("Attempted to parse an expression with unknown language");
1086e93f7393Sniklas }
1087e93f7393Sniklas
1088e93f7393Sniklas static void
unk_lang_emit_char(int c,struct ui_file * stream,int quoter)1089b725ae77Skettenis unk_lang_emit_char (int c, struct ui_file *stream, int quoter)
1090b725ae77Skettenis {
1091b725ae77Skettenis error ("internal error - unimplemented function unk_lang_emit_char called.");
1092b725ae77Skettenis }
1093b725ae77Skettenis
1094b725ae77Skettenis static void
unk_lang_printchar(int c,struct ui_file * stream)1095b725ae77Skettenis unk_lang_printchar (int c, struct ui_file *stream)
1096e93f7393Sniklas {
1097e93f7393Sniklas error ("internal error - unimplemented function unk_lang_printchar called.");
1098e93f7393Sniklas }
1099e93f7393Sniklas
1100e93f7393Sniklas static void
unk_lang_printstr(struct ui_file * stream,char * string,unsigned int length,int width,int force_ellipses)1101b725ae77Skettenis unk_lang_printstr (struct ui_file *stream, char *string, unsigned int length,
1102b725ae77Skettenis int width, int force_ellipses)
1103e93f7393Sniklas {
1104e93f7393Sniklas error ("internal error - unimplemented function unk_lang_printstr called.");
1105e93f7393Sniklas }
1106e93f7393Sniklas
1107e93f7393Sniklas static struct type *
unk_lang_create_fundamental_type(struct objfile * objfile,int typeid)1108b725ae77Skettenis unk_lang_create_fundamental_type (struct objfile *objfile, int typeid)
1109e93f7393Sniklas {
1110e93f7393Sniklas error ("internal error - unimplemented function unk_lang_create_fundamental_type called.");
1111e93f7393Sniklas }
1112e93f7393Sniklas
1113e93f7393Sniklas static void
unk_lang_print_type(struct type * type,char * varstring,struct ui_file * stream,int show,int level)1114b725ae77Skettenis unk_lang_print_type (struct type *type, char *varstring, struct ui_file *stream,
1115b725ae77Skettenis int show, int level)
1116e93f7393Sniklas {
1117e93f7393Sniklas error ("internal error - unimplemented function unk_lang_print_type called.");
1118e93f7393Sniklas }
1119e93f7393Sniklas
1120e93f7393Sniklas static int
unk_lang_val_print(struct type * type,char * valaddr,int embedded_offset,CORE_ADDR address,struct ui_file * stream,int format,int deref_ref,int recurse,enum val_prettyprint pretty)1121b725ae77Skettenis unk_lang_val_print (struct type *type, char *valaddr, int embedded_offset,
1122b725ae77Skettenis CORE_ADDR address, struct ui_file *stream, int format,
1123b725ae77Skettenis int deref_ref, int recurse, enum val_prettyprint pretty)
1124e93f7393Sniklas {
1125e93f7393Sniklas error ("internal error - unimplemented function unk_lang_val_print called.");
1126e93f7393Sniklas }
1127e93f7393Sniklas
1128e93f7393Sniklas static int
unk_lang_value_print(struct value * val,struct ui_file * stream,int format,enum val_prettyprint pretty)1129b725ae77Skettenis unk_lang_value_print (struct value *val, struct ui_file *stream, int format,
1130b725ae77Skettenis enum val_prettyprint pretty)
1131e93f7393Sniklas {
1132e93f7393Sniklas error ("internal error - unimplemented function unk_lang_value_print called.");
1133e93f7393Sniklas }
1134e93f7393Sniklas
unk_lang_trampoline(CORE_ADDR pc)1135b725ae77Skettenis static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc)
1136b725ae77Skettenis {
1137b725ae77Skettenis return 0;
1138b725ae77Skettenis }
1139b725ae77Skettenis
1140b725ae77Skettenis /* Unknown languages just use the cplus demangler. */
unk_lang_demangle(const char * mangled,int options)1141b725ae77Skettenis static char *unk_lang_demangle (const char *mangled, int options)
1142b725ae77Skettenis {
1143b725ae77Skettenis return cplus_demangle (mangled, options);
1144b725ae77Skettenis }
1145b725ae77Skettenis
unk_lang_class_name(const char * mangled)1146*63addd46Skettenis static char *unk_lang_class_name (const char *mangled)
1147b725ae77Skettenis {
1148*63addd46Skettenis return NULL;
1149*63addd46Skettenis }
1150*63addd46Skettenis
1151b725ae77Skettenis static const struct op_print unk_op_print_tab[] =
1152b725ae77Skettenis {
1153e93f7393Sniklas {NULL, OP_NULL, PREC_NULL, 0}
1154e93f7393Sniklas };
1155e93f7393Sniklas
1156*63addd46Skettenis static void
unknown_language_arch_info(struct gdbarch * gdbarch,struct language_arch_info * lai)1157*63addd46Skettenis unknown_language_arch_info (struct gdbarch *gdbarch,
1158*63addd46Skettenis struct language_arch_info *lai)
1159*63addd46Skettenis {
1160*63addd46Skettenis lai->string_char_type = builtin_type (gdbarch)->builtin_char;
1161*63addd46Skettenis lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1,
1162*63addd46Skettenis struct type *);
1163*63addd46Skettenis }
1164*63addd46Skettenis
1165b725ae77Skettenis const struct language_defn unknown_language_defn =
1166b725ae77Skettenis {
1167e93f7393Sniklas "unknown",
1168e93f7393Sniklas language_unknown,
1169*63addd46Skettenis NULL,
1170e93f7393Sniklas range_check_off,
1171e93f7393Sniklas type_check_off,
1172*63addd46Skettenis array_row_major,
1173b725ae77Skettenis case_sensitive_on,
1174b725ae77Skettenis &exp_descriptor_standard,
1175e93f7393Sniklas unk_lang_parser,
1176e93f7393Sniklas unk_lang_error,
1177*63addd46Skettenis null_post_parser,
1178e93f7393Sniklas unk_lang_printchar, /* Print character constant */
1179e93f7393Sniklas unk_lang_printstr,
1180b725ae77Skettenis unk_lang_emit_char,
1181e93f7393Sniklas unk_lang_create_fundamental_type,
1182e93f7393Sniklas unk_lang_print_type, /* Print a type using appropriate syntax */
1183e93f7393Sniklas unk_lang_val_print, /* Print a value using appropriate syntax */
1184e93f7393Sniklas unk_lang_value_print, /* Print a top-level value */
1185b725ae77Skettenis unk_lang_trampoline, /* Language specific skip_trampoline */
1186b725ae77Skettenis value_of_this, /* value_of_this */
1187b725ae77Skettenis basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
1188b725ae77Skettenis basic_lookup_transparent_type,/* lookup_transparent_type */
1189b725ae77Skettenis unk_lang_demangle, /* Language specific symbol demangler */
1190*63addd46Skettenis unk_lang_class_name, /* Language specific class_name_from_physname */
1191e93f7393Sniklas unk_op_print_tab, /* expression operators for printing */
1192e93f7393Sniklas 1, /* c-style arrays */
1193e93f7393Sniklas 0, /* String lower bound */
1194*63addd46Skettenis NULL,
1195b725ae77Skettenis default_word_break_characters,
1196*63addd46Skettenis unknown_language_arch_info, /* la_language_arch_info. */
1197e93f7393Sniklas LANG_MAGIC
1198e93f7393Sniklas };
1199e93f7393Sniklas
1200e93f7393Sniklas /* These two structs define fake entries for the "local" and "auto" options. */
1201b725ae77Skettenis const struct language_defn auto_language_defn =
1202b725ae77Skettenis {
1203e93f7393Sniklas "auto",
1204e93f7393Sniklas language_auto,
1205*63addd46Skettenis NULL,
1206e93f7393Sniklas range_check_off,
1207e93f7393Sniklas type_check_off,
1208*63addd46Skettenis array_row_major,
1209b725ae77Skettenis case_sensitive_on,
1210b725ae77Skettenis &exp_descriptor_standard,
1211e93f7393Sniklas unk_lang_parser,
1212e93f7393Sniklas unk_lang_error,
1213*63addd46Skettenis null_post_parser,
1214e93f7393Sniklas unk_lang_printchar, /* Print character constant */
1215e93f7393Sniklas unk_lang_printstr,
1216b725ae77Skettenis unk_lang_emit_char,
1217e93f7393Sniklas unk_lang_create_fundamental_type,
1218e93f7393Sniklas unk_lang_print_type, /* Print a type using appropriate syntax */
1219e93f7393Sniklas unk_lang_val_print, /* Print a value using appropriate syntax */
1220e93f7393Sniklas unk_lang_value_print, /* Print a top-level value */
1221b725ae77Skettenis unk_lang_trampoline, /* Language specific skip_trampoline */
1222b725ae77Skettenis value_of_this, /* value_of_this */
1223b725ae77Skettenis basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
1224b725ae77Skettenis basic_lookup_transparent_type,/* lookup_transparent_type */
1225b725ae77Skettenis unk_lang_demangle, /* Language specific symbol demangler */
1226*63addd46Skettenis unk_lang_class_name, /* Language specific class_name_from_physname */
1227e93f7393Sniklas unk_op_print_tab, /* expression operators for printing */
1228e93f7393Sniklas 1, /* c-style arrays */
1229e93f7393Sniklas 0, /* String lower bound */
1230*63addd46Skettenis NULL,
1231b725ae77Skettenis default_word_break_characters,
1232*63addd46Skettenis unknown_language_arch_info, /* la_language_arch_info. */
1233e93f7393Sniklas LANG_MAGIC
1234e93f7393Sniklas };
1235e93f7393Sniklas
1236b725ae77Skettenis const struct language_defn local_language_defn =
1237b725ae77Skettenis {
1238e93f7393Sniklas "local",
1239e93f7393Sniklas language_auto,
1240*63addd46Skettenis NULL,
1241e93f7393Sniklas range_check_off,
1242e93f7393Sniklas type_check_off,
1243b725ae77Skettenis case_sensitive_on,
1244*63addd46Skettenis array_row_major,
1245b725ae77Skettenis &exp_descriptor_standard,
1246e93f7393Sniklas unk_lang_parser,
1247e93f7393Sniklas unk_lang_error,
1248*63addd46Skettenis null_post_parser,
1249e93f7393Sniklas unk_lang_printchar, /* Print character constant */
1250e93f7393Sniklas unk_lang_printstr,
1251b725ae77Skettenis unk_lang_emit_char,
1252e93f7393Sniklas unk_lang_create_fundamental_type,
1253e93f7393Sniklas unk_lang_print_type, /* Print a type using appropriate syntax */
1254e93f7393Sniklas unk_lang_val_print, /* Print a value using appropriate syntax */
1255e93f7393Sniklas unk_lang_value_print, /* Print a top-level value */
1256b725ae77Skettenis unk_lang_trampoline, /* Language specific skip_trampoline */
1257b725ae77Skettenis value_of_this, /* value_of_this */
1258b725ae77Skettenis basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
1259b725ae77Skettenis basic_lookup_transparent_type,/* lookup_transparent_type */
1260b725ae77Skettenis unk_lang_demangle, /* Language specific symbol demangler */
1261*63addd46Skettenis unk_lang_class_name, /* Language specific class_name_from_physname */
1262e93f7393Sniklas unk_op_print_tab, /* expression operators for printing */
1263e93f7393Sniklas 1, /* c-style arrays */
1264e93f7393Sniklas 0, /* String lower bound */
1265*63addd46Skettenis NULL,
1266b725ae77Skettenis default_word_break_characters,
1267*63addd46Skettenis unknown_language_arch_info, /* la_language_arch_info. */
1268e93f7393Sniklas LANG_MAGIC
1269e93f7393Sniklas };
1270e93f7393Sniklas
1271*63addd46Skettenis /* Per-architecture language information. */
1272*63addd46Skettenis
1273*63addd46Skettenis static struct gdbarch_data *language_gdbarch_data;
1274*63addd46Skettenis
1275*63addd46Skettenis struct language_gdbarch
1276*63addd46Skettenis {
1277*63addd46Skettenis /* A vector of per-language per-architecture info. Indexed by "enum
1278*63addd46Skettenis language". */
1279*63addd46Skettenis struct language_arch_info arch_info[nr_languages];
1280*63addd46Skettenis };
1281*63addd46Skettenis
1282*63addd46Skettenis static void *
language_gdbarch_post_init(struct gdbarch * gdbarch)1283*63addd46Skettenis language_gdbarch_post_init (struct gdbarch *gdbarch)
1284*63addd46Skettenis {
1285*63addd46Skettenis struct language_gdbarch *l;
1286*63addd46Skettenis int i;
1287*63addd46Skettenis
1288*63addd46Skettenis l = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct language_gdbarch);
1289*63addd46Skettenis for (i = 0; i < languages_size; i++)
1290*63addd46Skettenis {
1291*63addd46Skettenis if (languages[i] != NULL
1292*63addd46Skettenis && languages[i]->la_language_arch_info != NULL)
1293*63addd46Skettenis languages[i]->la_language_arch_info
1294*63addd46Skettenis (gdbarch, l->arch_info + languages[i]->la_language);
1295*63addd46Skettenis }
1296*63addd46Skettenis return l;
1297*63addd46Skettenis }
1298*63addd46Skettenis
1299*63addd46Skettenis struct type *
language_string_char_type(const struct language_defn * la,struct gdbarch * gdbarch)1300*63addd46Skettenis language_string_char_type (const struct language_defn *la,
1301*63addd46Skettenis struct gdbarch *gdbarch)
1302*63addd46Skettenis {
1303*63addd46Skettenis struct language_gdbarch *ld = gdbarch_data (gdbarch,
1304*63addd46Skettenis language_gdbarch_data);
1305*63addd46Skettenis if (ld->arch_info[la->la_language].string_char_type != NULL)
1306*63addd46Skettenis return ld->arch_info[la->la_language].string_char_type;
1307*63addd46Skettenis else
1308*63addd46Skettenis return (*la->string_char_type);
1309*63addd46Skettenis }
1310*63addd46Skettenis
1311*63addd46Skettenis struct type *
language_lookup_primitive_type_by_name(const struct language_defn * la,struct gdbarch * gdbarch,const char * name)1312*63addd46Skettenis language_lookup_primitive_type_by_name (const struct language_defn *la,
1313*63addd46Skettenis struct gdbarch *gdbarch,
1314*63addd46Skettenis const char *name)
1315*63addd46Skettenis {
1316*63addd46Skettenis struct language_gdbarch *ld = gdbarch_data (gdbarch,
1317*63addd46Skettenis language_gdbarch_data);
1318*63addd46Skettenis if (ld->arch_info[la->la_language].primitive_type_vector != NULL)
1319*63addd46Skettenis {
1320*63addd46Skettenis struct type *const *p;
1321*63addd46Skettenis for (p = ld->arch_info[la->la_language].primitive_type_vector;
1322*63addd46Skettenis (*p) != NULL;
1323*63addd46Skettenis p++)
1324*63addd46Skettenis {
1325*63addd46Skettenis if (strcmp (TYPE_NAME (*p), name) == 0)
1326*63addd46Skettenis return (*p);
1327*63addd46Skettenis }
1328*63addd46Skettenis }
1329*63addd46Skettenis else
1330*63addd46Skettenis {
1331*63addd46Skettenis struct type **const *p;
1332*63addd46Skettenis for (p = current_language->la_builtin_type_vector; *p != NULL; p++)
1333*63addd46Skettenis {
1334*63addd46Skettenis if (strcmp (TYPE_NAME (**p), name) == 0)
1335*63addd46Skettenis return (**p);
1336*63addd46Skettenis }
1337*63addd46Skettenis }
1338*63addd46Skettenis return (NULL);
1339*63addd46Skettenis }
1340*63addd46Skettenis
1341e93f7393Sniklas /* Initialize the language routines */
1342e93f7393Sniklas
1343e93f7393Sniklas void
_initialize_language(void)1344b725ae77Skettenis _initialize_language (void)
1345e93f7393Sniklas {
1346e93f7393Sniklas struct cmd_list_element *set, *show;
1347e93f7393Sniklas
1348*63addd46Skettenis language_gdbarch_data
1349*63addd46Skettenis = gdbarch_data_register_post_init (language_gdbarch_post_init);
1350*63addd46Skettenis
1351e93f7393Sniklas /* GDB commands for language specific stuff */
1352e93f7393Sniklas
1353e93f7393Sniklas set = add_set_cmd ("language", class_support, var_string_noescape,
1354e93f7393Sniklas (char *) &language,
1355e93f7393Sniklas "Set the current source language.",
1356e93f7393Sniklas &setlist);
1357*63addd46Skettenis show = deprecated_add_show_from_set (set, &showlist);
1358b725ae77Skettenis set_cmd_cfunc (set, set_language_command);
1359b725ae77Skettenis set_cmd_cfunc (show, show_language_command);
1360e93f7393Sniklas
1361e93f7393Sniklas add_prefix_cmd ("check", no_class, set_check,
1362b725ae77Skettenis "Set the status of the type/range checker.",
1363e93f7393Sniklas &setchecklist, "set check ", 0, &setlist);
1364e93f7393Sniklas add_alias_cmd ("c", "check", no_class, 1, &setlist);
1365e93f7393Sniklas add_alias_cmd ("ch", "check", no_class, 1, &setlist);
1366e93f7393Sniklas
1367e93f7393Sniklas add_prefix_cmd ("check", no_class, show_check,
1368b725ae77Skettenis "Show the status of the type/range checker.",
1369e93f7393Sniklas &showchecklist, "show check ", 0, &showlist);
1370e93f7393Sniklas add_alias_cmd ("c", "check", no_class, 1, &showlist);
1371e93f7393Sniklas add_alias_cmd ("ch", "check", no_class, 1, &showlist);
1372e93f7393Sniklas
1373e93f7393Sniklas set = add_set_cmd ("type", class_support, var_string_noescape,
1374e93f7393Sniklas (char *) &type,
1375e93f7393Sniklas "Set type checking. (on/warn/off/auto)",
1376e93f7393Sniklas &setchecklist);
1377*63addd46Skettenis show = deprecated_add_show_from_set (set, &showchecklist);
1378b725ae77Skettenis set_cmd_cfunc (set, set_type_command);
1379b725ae77Skettenis set_cmd_cfunc (show, show_type_command);
1380e93f7393Sniklas
1381e93f7393Sniklas set = add_set_cmd ("range", class_support, var_string_noescape,
1382e93f7393Sniklas (char *) &range,
1383e93f7393Sniklas "Set range checking. (on/warn/off/auto)",
1384e93f7393Sniklas &setchecklist);
1385*63addd46Skettenis show = deprecated_add_show_from_set (set, &showchecklist);
1386b725ae77Skettenis set_cmd_cfunc (set, set_range_command);
1387b725ae77Skettenis set_cmd_cfunc (show, show_range_command);
1388b725ae77Skettenis
1389b725ae77Skettenis set = add_set_cmd ("case-sensitive", class_support, var_string_noescape,
1390b725ae77Skettenis (char *) &case_sensitive,
1391b725ae77Skettenis "Set case sensitivity in name search. (on/off/auto)\n\
1392b725ae77Skettenis For Fortran the default is off; for other languages the default is on.",
1393b725ae77Skettenis &setlist);
1394*63addd46Skettenis show = deprecated_add_show_from_set (set, &showlist);
1395b725ae77Skettenis set_cmd_cfunc (set, set_case_command);
1396b725ae77Skettenis set_cmd_cfunc (show, show_case_command);
1397e93f7393Sniklas
1398e93f7393Sniklas add_language (&unknown_language_defn);
1399e93f7393Sniklas add_language (&local_language_defn);
1400e93f7393Sniklas add_language (&auto_language_defn);
1401e93f7393Sniklas
1402e93f7393Sniklas language = savestring ("auto", strlen ("auto"));
1403e93f7393Sniklas type = savestring ("auto", strlen ("auto"));
1404b725ae77Skettenis range = savestring ("auto", strlen ("auto"));
1405b725ae77Skettenis case_sensitive = savestring ("auto",strlen ("auto"));
1406e93f7393Sniklas
1407e93f7393Sniklas /* Have the above take effect */
1408b725ae77Skettenis set_language (language_auto);
1409e93f7393Sniklas }
1410