2007-11-12 Markus Deuling <deuling@de.ibm.com>
[deliverable/binutils-gdb.git] / gdb / language.c
index 3cc513f3e6e46e9f8d5988f3b97d437b19c788c3..fe2939e31f32439df11e91e00e184dbd0992d54a 100644 (file)
@@ -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.  */
@@ -1162,7 +1179,6 @@ const struct language_defn unknown_language_defn =
 {
   "unknown",
   language_unknown,
-  NULL,
   range_check_off,
   type_check_off,
   array_row_major,
@@ -1187,10 +1203,10 @@ const struct language_defn unknown_language_defn =
   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
 };
 
@@ -1199,7 +1215,6 @@ const struct language_defn auto_language_defn =
 {
   "auto",
   language_auto,
-  NULL,
   range_check_off,
   type_check_off,
   array_row_major,
@@ -1224,10 +1239,10 @@ const struct language_defn auto_language_defn =
   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
 };
 
@@ -1235,7 +1250,6 @@ const struct language_defn local_language_defn =
 {
   "local",
   language_auto,
-  NULL,
   range_check_off,
   type_check_off,
   case_sensitive_on,
@@ -1260,10 +1274,10 @@ const struct language_defn local_language_defn =
   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
@@ -1301,10 +1315,7 @@ language_string_char_type (const struct language_defn *la,
 {
   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 *
@@ -1314,25 +1325,13 @@ language_lookup_primitive_type_by_name (const struct language_defn *la,
 {
   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);
 }
This page took 0.024533 seconds and 4 git commands to generate.