This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[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