* infcall.c (call_function_by_hand): Handle language-specific
[deliverable/binutils-gdb.git] / gdb / language.c
index 654f0f498a3ca05b6b9c46adf3a25e19381fc51f..d5c6a94b095fc0c22d9c9c19bbc9d2412d95d642 100644 (file)
@@ -1,7 +1,7 @@
 /* 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.
@@ -10,7 +10,7 @@
 
    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,
@@ -19,9 +19,7 @@
    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,
@@ -77,7 +75,7 @@ static void unk_lang_print_type (struct type *, char *, struct ui_file *,
 
 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;
@@ -324,32 +322,34 @@ show_case_command (struct ui_file *file, int from_tty,
 "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);
 }
@@ -918,7 +918,7 @@ language_enum (char *str)
   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;
@@ -1003,7 +1003,7 @@ add_language (const struct language_defn *lang)
    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;
 
@@ -1011,7 +1011,7 @@ skip_language_trampoline (CORE_ADDR pc)
     {
       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;
        }
@@ -1045,6 +1045,23 @@ language_class_name_from_physname (const struct language_defn *current_language,
   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.  */
@@ -1055,6 +1072,17 @@ default_word_break_characters (void)
   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
@@ -1117,7 +1145,7 @@ unk_lang_value_print (struct value *val, struct ui_file *stream, int format,
   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;
 }
@@ -1179,6 +1207,8 @@ const struct language_defn unknown_language_defn =
   NULL,
   default_word_break_characters,
   unknown_language_arch_info,  /* la_language_arch_info.  */
+  default_print_array_index,
+  default_pass_by_reference,
   LANG_MAGIC
 };
 
@@ -1215,6 +1245,8 @@ const struct language_defn auto_language_defn =
   NULL,
   default_word_break_characters,
   unknown_language_arch_info,  /* la_language_arch_info.  */
+  default_print_array_index,
+  default_pass_by_reference,
   LANG_MAGIC
 };
 
@@ -1250,6 +1282,8 @@ const struct language_defn local_language_defn =
   NULL,
   default_word_break_characters,
   unknown_language_arch_info,  /* la_language_arch_info.  */
+  default_print_array_index,
+  default_pass_by_reference,
   LANG_MAGIC
 };
 \f
This page took 0.026838 seconds and 4 git commands to generate.