diff options
-rw-r--r-- | gdb/riscv-tdep.c | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/non-trivial-retval.cc | 19 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/non-trivial-retval.exp | 6 |
3 files changed, 30 insertions, 1 deletions
diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c index 932708c..200a20a 100644 --- a/gdb/riscv-tdep.c +++ b/gdb/riscv-tdep.c @@ -2857,8 +2857,12 @@ static void riscv_call_arg_scalar_int (struct riscv_arg_info *ainfo, struct riscv_call_info *cinfo) { + auto lang_req = language_pass_by_reference (ainfo->type); + if (TYPE_HAS_DYNAMIC_LENGTH (ainfo->type) - || ainfo->length > (2 * cinfo->xlen)) + || ainfo->length > (2 * cinfo->xlen) + || !lang_req.trivially_copy_constructible + || !lang_req.trivially_destructible) { /* Argument is going to be passed by reference. */ ainfo->argloc[0].loc_type diff --git a/gdb/testsuite/gdb.cp/non-trivial-retval.cc b/gdb/testsuite/gdb.cp/non-trivial-retval.cc index 4bba0f1..4e81251 100644 --- a/gdb/testsuite/gdb.cp/non-trivial-retval.cc +++ b/gdb/testsuite/gdb.cp/non-trivial-retval.cc @@ -142,6 +142,24 @@ f4 (int i1, int i2) return e; } +class F +{ +public: + ~F () {} + + int f; +}; + +F +f5 (int i1, int i2) +{ + F f; + + f.f = i1 + i2; + + return f; +} + /* We place a breakpoint on the call to this function. */ void @@ -164,6 +182,7 @@ main (void) B1 b1 = f22 (i1, i2); C c = f3 (i1, i2); E e = f4 (i1, i2); + F f = f5 (i1, i2); return 0; } diff --git a/gdb/testsuite/gdb.cp/non-trivial-retval.exp b/gdb/testsuite/gdb.cp/non-trivial-retval.exp index 89035e1..6c9f7e1 100644 --- a/gdb/testsuite/gdb.cp/non-trivial-retval.exp +++ b/gdb/testsuite/gdb.cp/non-trivial-retval.exp @@ -42,12 +42,14 @@ gdb_test "p f2 (i1, i2)" ".* = {b = 123}" gdb_test "p f22 (i1, i2)" ".* = {b1 = 123}" gdb_test "p f3 (i1, i2)" ".* = {.* c = 123}" gdb_test "p f4 (i1, i2)" ".* = {.* e = 123}" +gdb_test "p f5 (i1, i2)" ".* = {f = 123}" gdb_breakpoint "f1" gdb_breakpoint "f2" gdb_breakpoint "f22" gdb_breakpoint "f3" gdb_breakpoint "f4" +gdb_breakpoint "f5" gdb_continue_to_breakpoint "Break in f1" gdb_test "finish" " = {a = 123}" \ @@ -68,3 +70,7 @@ gdb_test "finish" " = {.* c = 123}" \ gdb_continue_to_breakpoint "Break in f4" gdb_test "finish" " = {.* e = 123}" \ "finish from f4" + +gdb_continue_to_breakpoint "Break in f5" +gdb_test "finish" " = {f = 123}" \ + "finish from f5" |