aboutsummaryrefslogtreecommitdiff
path: root/gdb/language.h
diff options
context:
space:
mode:
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>2019-12-20 17:43:06 +0100
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>2019-12-20 17:43:06 +0100
commit9d084466d740e40c655609f9c04b3bb2b9b9ca76 (patch)
tree210f4ac3ac14359576fce5bda16bd3522a43c1b1 /gdb/language.h
parente35000a7f8be021459102751db7e0b7e2868b57e (diff)
downloadgdb-9d084466d740e40c655609f9c04b3bb2b9b9ca76.zip
gdb-9d084466d740e40c655609f9c04b3bb2b9b9ca76.tar.gz
gdb-9d084466d740e40c655609f9c04b3bb2b9b9ca76.tar.bz2
infcall, c++: allow more info to be computed for pass-by-reference values
In C++, call-by-value arguments that cannot be trivially copied are implicitly passed by reference. When making an infcall, GDB needs to find out if an argument is pass-by-reference or not, so that the correct semantics can be followed. This patch enriches the information computed by the language ops for pass-by-reference arguments. Instead of a plain binary result, the computed information now includes whether the argument is - copy constructible - destructible - trivially copyable - trivially copy constructible - trivially destructible This information is stored in a struct named 'language_pass_by_ref_info'. This patch paves the way for GDB's infcall mechanism to call the copy ctor and the destructor of a pass-by-ref argument appropriately. gdb/ChangeLog: 2019-12-20 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * language.h (struct language_pass_by_ref_info): New struct. (struct language_defn)<la_pass_by_reference>: Change the signature to return a language_pass_by_ref_info instead of an int. (language_pass_by_reference): Ditto. (default_pass_by_reference): Ditto. Adjust the users listed below. * arch-utils.c (default_return_in_first_hidden_param_p): Update. * cp-abi.c (cp_pass_by_reference): Update. * cp-abi.h (cp_pass_by_reference): Update declaration. (struct cp_abi_ops)<pass_by_reference>: Update. * gnu-v3-abi.c (gnuv3_pass_by_reference): Update. * infcall.c (call_function_by_hand_dummy): Update. * language.c (language_pass_by_reference): Update. (default_pass_by_reference): Update. * tic6x-tdep.c (tic6x_return_value): Update. Change-Id: Ib1c1f87f2490a5737c469f7b7185ddc7f6a164cb
Diffstat (limited to 'gdb/language.h')
-rw-r--r--gdb/language.h62
1 files changed, 52 insertions, 10 deletions
diff --git a/gdb/language.h b/gdb/language.h
index 14d6fac..f6cd29b 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -128,6 +128,47 @@ struct language_arch_info
struct type *bool_type_default;
};
+/* In a language (particularly C++) a function argument of an aggregate
+ type (i.e. class/struct/union) may be implicitly passed by reference
+ even though it is declared a call-by-value argument in the source.
+ The struct below puts together necessary information for GDB to be
+ able to detect and carry out pass-by-reference semantics for a
+ particular type. This type is referred as T in the inlined comments
+ below.
+
+ The default values of the fields are chosen to give correct semantics
+ for primitive types and for simple aggregate types, such as
+
+ class T {
+ int x;
+ }; */
+
+struct language_pass_by_ref_info
+{
+ /* True if an argument of type T can be passed to a function by value
+ (i.e. not through an implicit reference). False, otherwise. */
+ bool trivially_copyable = true;
+
+ /* True if a copy of a value of type T can be initialized by
+ memcpy'ing the value bit-by-bit. False, otherwise.
+ E.g. If T has a user-defined copy ctor, this should be false. */
+ bool trivially_copy_constructible = true;
+
+ /* True if a value of type T can be destructed simply by reclaiming
+ the memory area occupied by the value. False, otherwise.
+ E.g. If T has a user-defined destructor, this should be false. */
+ bool trivially_destructible = true;
+
+ /* True if it is allowed to create a copy of a value of type T.
+ False, otherwise.
+ E.g. If T has a deleted copy ctor, this should be false. */
+ bool copy_constructible = true;
+
+ /* True if a value of type T can be destructed. False, otherwise.
+ E.g. If T has a deleted destructor, this should be false. */
+ bool destructible = true;
+};
+
/* Structure tying together assorted information about a language. */
struct language_defn
@@ -356,9 +397,10 @@ 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. */
- int (*la_pass_by_reference) (struct type *type);
+ /* Return information about whether TYPE should be passed
+ (and returned) by reference at the language level. */
+ struct language_pass_by_ref_info (*la_pass_by_reference)
+ (struct type *type);
/* Return an expression that can be used for a location
watchpoint. TYPE is a pointer type that points to the memory
@@ -613,14 +655,14 @@ 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. */
-int language_pass_by_reference (struct type *type);
+/* Return information about whether TYPE should be passed
+ (and returned) by reference at the language level. */
+struct language_pass_by_ref_info language_pass_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. */
-int default_pass_by_reference (struct type *type);
+/* Return a default struct that provides pass-by-reference information
+ about the given TYPE. Languages should update the default values
+ as appropriate. */
+struct language_pass_by_ref_info default_pass_by_reference (struct type *type);
/* The default implementation of la_print_typedef. */
void default_print_typedef (struct type *type, struct symbol *new_symbol,