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:
parent
e35000a7f8
commit
9d084466d7
9 changed files with 131 additions and 40 deletions
10
gdb/cp-abi.h
10
gdb/cp-abi.h
|
@ -207,9 +207,11 @@ extern std::string cplus_typename_from_type_info (struct value *value);
|
|||
CORE_ADDR cplus_skip_trampoline (struct frame_info *frame,
|
||||
CORE_ADDR stop_pc);
|
||||
|
||||
/* Return non-zero if an argument of type TYPE should be passed by
|
||||
reference instead of value. */
|
||||
extern int cp_pass_by_reference (struct type *type);
|
||||
/* Return a struct that provides pass-by-reference information
|
||||
about the given TYPE. */
|
||||
|
||||
extern struct language_pass_by_ref_info cp_pass_by_reference
|
||||
(struct type *type);
|
||||
|
||||
struct cp_abi_ops
|
||||
{
|
||||
|
@ -246,7 +248,7 @@ struct cp_abi_ops
|
|||
struct type *(*get_type_from_type_info) (struct value *value);
|
||||
std::string (*get_typename_from_type_info) (struct value *value);
|
||||
CORE_ADDR (*skip_trampoline) (struct frame_info *, CORE_ADDR);
|
||||
int (*pass_by_reference) (struct type *type);
|
||||
struct language_pass_by_ref_info (*pass_by_reference) (struct type *type);
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue