xref: /openbsd-src/gnu/usr.bin/binutils/gdb/language.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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