This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 1/5] New la_return_by_reference.


This patch adds a new language hook 'la_return_by_reference', and NULL-ified
in each instance of struct language_defn.  When 'la_return_by_reference' is
NULL, we'll use 'la_pass_by_reference', because mostly, they are the same.

No functionality is changed.  If a certain language (on a certain arch) has
some different behavior on 'return_by_reference', it can be overridden
easily.  This is what next patch does.

gdb:

2012-05-23  Yao Qi  <yao@codesourcery.com>

	* language.h (struct language_defn) <la_return_by_reference>: New field.
	* ada-lang.c (ada_language_defn): Set field 'la_return_by_reference'
	to NULL.
	* c-lang.c (c_language_defn, asm_language_defn): Likewise.
	(cplus_language_defn, minimal_language_defn): Likewise.
	* d-lang.c (d_language_defn): Likewise.
	* f-lang.c (f_language_defn): Likewise.
	* go-lang.c (go_language_defn): Likewise.
	* jv-lang.c (java_language_defn): Likewise.
	* language.c (language_return_by_reference): New.
	(unknown_language_defn): Set field 'la_return_by_reference' to NULL.
	(auto_language_defn): Likewise.
	(local_language_defn): Likewise.
	* m2-lang.c (m2_language_defn): Likewise.
	* objc-lang.c (objc_language_defn): Likewise.
	* opencl-lang.c (opencl_language_defn): Likewise.
	* p-lang.c (pascal_language_defn): Likewise.

	* infcall.c (call_function_by_hand): Call language_return_by_reference
	instead of language_pass_by_reference.
---
 gdb/ada-lang.c    |    1 +
 gdb/c-lang.c      |    4 ++++
 gdb/d-lang.c      |    1 +
 gdb/f-lang.c      |    1 +
 gdb/go-lang.c     |    1 +
 gdb/infcall.c     |    2 +-
 gdb/jv-lang.c     |    1 +
 gdb/language.c    |   14 ++++++++++++++
 gdb/language.h    |   14 ++++++++++----
 gdb/m2-lang.c     |    1 +
 gdb/objc-lang.c   |    1 +
 gdb/opencl-lang.c |    1 +
 gdb/p-lang.c      |    1 +
 13 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 72d4768..9aeed11 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -12548,6 +12548,7 @@ const struct language_defn ada_language_defn = {
   ada_language_arch_info,
   ada_print_array_index,
   default_pass_by_reference,
+  NULL,                         /* la_return_by_reference */
   c_get_string,
   ada_get_symbol_name_cmp,	/* la_get_symbol_name_cmp */
   ada_iterate_over_symbols,
diff --git a/gdb/c-lang.c b/gdb/c-lang.c
index 28dce8d..da084be 100644
--- a/gdb/c-lang.c
+++ b/gdb/c-lang.c
@@ -863,6 +863,7 @@ const struct language_defn c_language_defn =
   c_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                         /* la_return_by_reference */
   c_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
@@ -987,6 +988,7 @@ const struct language_defn cplus_language_defn =
   cplus_language_arch_info,
   default_print_array_index,
   cp_pass_by_reference,
+  NULL,                          /* la_return_by_reference */
   c_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
@@ -1029,6 +1031,7 @@ const struct language_defn asm_language_defn =
   c_language_arch_info, 	/* FIXME: la_language_arch_info.  */
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                         /* la_return_by_reference */
   c_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
@@ -1076,6 +1079,7 @@ const struct language_defn minimal_language_defn =
   c_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                         /* la_return_by_reference */
   c_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
diff --git a/gdb/d-lang.c b/gdb/d-lang.c
index 121040a..7d6df29 100644
--- a/gdb/d-lang.c
+++ b/gdb/d-lang.c
@@ -272,6 +272,7 @@ static const struct language_defn d_language_defn =
   c_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                         /* la_return_by_reference */
   c_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
diff --git a/gdb/f-lang.c b/gdb/f-lang.c
index 3368d01..9b5e689 100644
--- a/gdb/f-lang.c
+++ b/gdb/f-lang.c
@@ -305,6 +305,7 @@ const struct language_defn f_language_defn =
   f_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                          /* la_return_by_reference */
   default_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
diff --git a/gdb/go-lang.c b/gdb/go-lang.c
index 147a922..d01aa05 100644
--- a/gdb/go-lang.c
+++ b/gdb/go-lang.c
@@ -594,6 +594,7 @@ static const struct language_defn go_language_defn =
   go_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                          /* la_return_by_reference */
   c_get_string,
   NULL,
   iterate_over_symbols,
diff --git a/gdb/infcall.c b/gdb/infcall.c
index 4ace08b..506caaa 100644
--- a/gdb/infcall.c
+++ b/gdb/infcall.c
@@ -598,7 +598,7 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
      the first argument is passed in out0 but the hidden structure
      return pointer would normally be passed in r8.  */
 
-  if (language_pass_by_reference (values_type))
+  if (language_return_by_reference (values_type))
     {
       lang_struct_return = 1;
 
diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c
index a7cfb76..3202aab 100644
--- a/gdb/jv-lang.c
+++ b/gdb/jv-lang.c
@@ -1197,6 +1197,7 @@ const struct language_defn java_language_defn =
   java_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                          /* la_return_by_reference */
   default_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
diff --git a/gdb/language.c b/gdb/language.c
index f0a8697..9dd49db 100644
--- a/gdb/language.c
+++ b/gdb/language.c
@@ -772,6 +772,17 @@ default_pass_by_reference (struct type *type)
   return 0;
 }
 
+int
+language_return_by_reference (struct type *type)
+{
+  /* If field 'la_return_by_reference' is not installed, we resort to
+     language_pass_by_reference.  */
+  if (current_language->la_return_by_reference != NULL)
+    return current_language->la_return_by_reference (type);
+  else
+    return language_pass_by_reference (type);
+}
+
 /* 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.  */
@@ -933,6 +944,7 @@ const struct language_defn unknown_language_defn =
   unknown_language_arch_info,	/* la_language_arch_info.  */
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                          /* la_return_by_reference */
   default_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
@@ -977,6 +989,7 @@ const struct language_defn auto_language_defn =
   unknown_language_arch_info,	/* la_language_arch_info.  */
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                          /* la_return_by_reference */
   default_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
@@ -1019,6 +1032,7 @@ const struct language_defn local_language_defn =
   unknown_language_arch_info,	/* la_language_arch_info.  */
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                          /* la_return_by_reference */
   default_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
diff --git a/gdb/language.h b/gdb/language.h
index d612c70..d9388ae 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -320,10 +320,13 @@ struct language_defn
                                   struct ui_file *stream,
                                   const struct value_print_options *options);
 
-    /* Return non-zero if TYPE should be passed (and returned) by
-       reference at the language level.  */
+    /* Return non-zero if TYPE should be passed by reference at the
+       language level.  */
     int (*la_pass_by_reference) (struct type *type);
 
+    /* Return non-zero if TYPE should be returned by reference.  */
+    int (*la_return_by_reference) (struct type *type);
+
     /* Obtain a string from the inferior, storing it in a newly allocated
        buffer in BUFFER, which should be freed by the caller.  If the
        in- and out-parameter *LENGTH is specified at -1, the string is
@@ -538,10 +541,13 @@ extern void default_print_array_index (struct value *index_value,
                                        struct ui_file *stream,
 				       const struct value_print_options *options);
 
-/* Return non-zero if TYPE should be passed (and returned) by
-   reference at the language level.  */
+/* Return non-zero if TYPE should be passed by reference at the language
+   level.  */
 int language_pass_by_reference (struct type *type);
 
+/* Return non-zero if TYPE should be returned by reference.  */
+int language_return_by_reference (struct type *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.  */
diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c
index 8faa6c1..2faec9a 100644
--- a/gdb/m2-lang.c
+++ b/gdb/m2-lang.c
@@ -401,6 +401,7 @@ const struct language_defn m2_language_defn =
   m2_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                         /* la_return_by_reference */
   default_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index 15bf792..0f796d4 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -540,6 +540,7 @@ const struct language_defn objc_language_defn = {
   c_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                          /* la_return_by_reference */
   default_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c
index 54075a4..6ed3dbe 100644
--- a/gdb/opencl-lang.c
+++ b/gdb/opencl-lang.c
@@ -1024,6 +1024,7 @@ const struct language_defn opencl_language_defn =
   opencl_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                         /* la_return_by_reference */
   c_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
diff --git a/gdb/p-lang.c b/gdb/p-lang.c
index c59ba0b..f265ff0 100644
--- a/gdb/p-lang.c
+++ b/gdb/p-lang.c
@@ -459,6 +459,7 @@ const struct language_defn pascal_language_defn =
   pascal_language_arch_info,
   default_print_array_index,
   default_pass_by_reference,
+  NULL,                          /* la_return_by_reference */
   default_get_string,
   NULL,				/* la_get_symbol_name_cmp */
   iterate_over_symbols,
-- 
1.7.0.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]