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
This commit is contained in:
Tankut Baris Aktemur
2019-12-20 17:43:06 +01:00
parent e35000a7f8
commit 9d084466d7
9 changed files with 131 additions and 40 deletions

View File

@ -652,21 +652,23 @@ language_class_name_from_physname (const struct language_defn *lang,
return NULL;
}
/* Return non-zero if TYPE should be passed (and returned) by
reference at the language level. */
int
/* 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 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
/* 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)
{
return 0;
return {};
}
/* Return the default string containing the list of characters