/* Multiple source language support for GDB.
- Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+ 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
Contributed by the Department of Computer Science at the State University
of New York at Buffalo.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* This file contains functions that return things that are specific
to languages. Each function should examine current_language if necessary,
static int unk_lang_value_print (struct value *, struct ui_file *, int, enum val_prettyprint);
-static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc);
+static CORE_ADDR unk_lang_trampoline (struct frame_info *, CORE_ADDR pc);
/* Forward declaration */
extern const struct language_defn unknown_language_defn;
"Warning: the current case sensitivity setting does not match the language.\n");
}
-/* Set command. Change the setting for case sensitivity. */
+/* Set command. Change the setting for case sensitivity. */
+
static void
set_case_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
- if (DEPRECATED_STREQ (case_sensitive, "on"))
- {
- case_sensitivity = case_sensitive_on;
- case_mode = case_mode_manual;
- }
- else if (DEPRECATED_STREQ (case_sensitive, "off"))
- {
- case_sensitivity = case_sensitive_off;
- case_mode = case_mode_manual;
- }
- else if (DEPRECATED_STREQ (case_sensitive, "auto"))
- {
- case_mode = case_mode_auto;
- set_type_range_case ();
- /* Avoid hitting the set_case_str call below. We
- did it in set_type_range_case. */
- return;
- }
+ if (strcmp (case_sensitive, "on") == 0)
+ {
+ case_sensitivity = case_sensitive_on;
+ case_mode = case_mode_manual;
+ }
+ else if (strcmp (case_sensitive, "off") == 0)
+ {
+ case_sensitivity = case_sensitive_off;
+ case_mode = case_mode_manual;
+ }
+ else if (strcmp (case_sensitive, "auto") == 0)
+ {
+ case_mode = case_mode_auto;
+ set_type_range_case ();
+ /* Avoid hitting the set_case_str call below. We did it in
+ set_type_range_case. */
+ return;
+ }
else
- {
- warning (_("Unrecognized case-sensitive setting: \"%s\""), case_sensitive);
- }
+ {
+ warning (_("Unrecognized case-sensitive setting: \"%s\""),
+ case_sensitive);
+ }
set_case_str();
show_case_command (NULL, from_tty, NULL, NULL);
}
if (language_mode == language_mode_auto)
prefix = "auto; currently ";
- language = concat (prefix, current_language->la_name, NULL);
+ language = concat (prefix, current_language->la_name, (char *)NULL);
}
static void
error (_("Unrecognized type check setting."));
}
- type = concat (prefix, tmp, NULL);
+ type = concat (prefix, tmp, (char *)NULL);
}
static void
if (range)
xfree (range);
- range = concat (pref, tmp, NULL);
+ range = concat (pref, tmp, (char *)NULL);
}
static void
}
xfree (case_sensitive);
- case_sensitive = concat (prefix, tmp, NULL);
+ case_sensitive = concat (prefix, tmp, (char *)NULL);
}
/* Print out the current language settings: language, range and
int i;
for (i = 0; i < languages_size; i++)
- if (DEPRECATED_STREQ (languages[i]->la_name, str))
+ if (strcmp (languages[i]->la_name, str) == 0)
return languages[i]->la_language;
return language_unknown;
Return the result from the first that returns non-zero, or 0 if all
`fail'. */
CORE_ADDR
-skip_language_trampoline (CORE_ADDR pc)
+skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc)
{
int i;
{
if (languages[i]->skip_trampoline)
{
- CORE_ADDR real_pc = (languages[i]->skip_trampoline) (pc);
+ CORE_ADDR real_pc = (languages[i]->skip_trampoline) (frame, pc);
if (real_pc)
return real_pc;
}
return NULL;
}
+/* Return non-zero if TYPE should be passed (and returned) by
+ reference at the language level. */
+int
+language_pass_by_reference (struct type *type)
+{
+ return current_language->la_pass_by_reference (type);
+}
+
+/* Return zero; by default, types are passed by value at the language
+ level. The target ABI may pass or return some structs by reference
+ independent of this. */
+int
+default_pass_by_reference (struct type *type)
+{
+ return 0;
+}
+
/* Return the default string containing the list of characters
delimiting words. This is a reasonable default value that
most languages should be able to use. */
return " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-";
}
+/* Print the index of array elements using the C99 syntax. */
+
+void
+default_print_array_index (struct value *index_value, struct ui_file *stream,
+ int format, enum val_prettyprint pretty)
+{
+ fprintf_filtered (stream, "[");
+ LA_VALUE_PRINT (index_value, stream, format, pretty);
+ fprintf_filtered (stream, "] = ");
+}
+
/* Define the language that is no language. */
static int
error (_("internal error - unimplemented function unk_lang_value_print called."));
}
-static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc)
+static CORE_ADDR unk_lang_trampoline (struct frame_info *frame, CORE_ADDR pc)
{
return 0;
}
{
"unknown",
language_unknown,
- NULL,
range_check_off,
type_check_off,
array_row_major,
unk_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
- NULL,
default_word_break_characters,
unknown_language_arch_info, /* la_language_arch_info. */
+ default_print_array_index,
+ default_pass_by_reference,
LANG_MAGIC
};
{
"auto",
language_auto,
- NULL,
range_check_off,
type_check_off,
array_row_major,
unk_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
- NULL,
default_word_break_characters,
unknown_language_arch_info, /* la_language_arch_info. */
+ default_print_array_index,
+ default_pass_by_reference,
LANG_MAGIC
};
{
"local",
language_auto,
- NULL,
range_check_off,
type_check_off,
case_sensitive_on,
unk_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
- NULL,
default_word_break_characters,
unknown_language_arch_info, /* la_language_arch_info. */
+ default_print_array_index,
+ default_pass_by_reference,
LANG_MAGIC
};
\f
{
struct language_gdbarch *ld = gdbarch_data (gdbarch,
language_gdbarch_data);
- if (ld->arch_info[la->la_language].string_char_type != NULL)
- return ld->arch_info[la->la_language].string_char_type;
- else
- return (*la->string_char_type);
+ return ld->arch_info[la->la_language].string_char_type;
}
struct type *
{
struct language_gdbarch *ld = gdbarch_data (gdbarch,
language_gdbarch_data);
- if (ld->arch_info[la->la_language].primitive_type_vector != NULL)
- {
- struct type *const *p;
- for (p = ld->arch_info[la->la_language].primitive_type_vector;
- (*p) != NULL;
- p++)
- {
- if (strcmp (TYPE_NAME (*p), name) == 0)
- return (*p);
- }
- }
- else
+ struct type *const *p;
+ for (p = ld->arch_info[la->la_language].primitive_type_vector;
+ (*p) != NULL;
+ p++)
{
- struct type **const *p;
- for (p = current_language->la_builtin_type_vector; *p != NULL; p++)
- {
- if (strcmp (TYPE_NAME (**p), name) == 0)
- return (**p);
- }
+ if (strcmp (TYPE_NAME (*p), name) == 0)
+ return (*p);
}
return (NULL);
}