public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/3] PPC/PPC64 "finish" fixes
@ 2023-03-14 13:37 Tom Tromey
  2023-03-14 13:37 ` [PATCH 1/3] Handle function descriptors in call_site_target Tom Tromey
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Tom Tromey @ 2023-03-14 13:37 UTC (permalink / raw)
  To: gdb-patches

We found some minor issues with "finish" on PPC and PPC64.  This
series fixes some of them.

I think there are still some issues here with fixed-point types, but I
don't hae an immediate plan to look at those.

These patches have been tested using the internal AdaCore test suite.

Tom

---
Tom Tromey (3):
      Handle function descriptors in call_site_target
      Handle erroneous DW_AT_call_return_pc
      Use entry values for 32-bit PPC struct return

 gdb/arch-utils.c                           |  6 +++++
 gdb/dwarf2/loc.c                           |  6 ++++-
 gdb/gdbarch-gen.h                          | 13 +++++++++++
 gdb/gdbarch.c                              | 22 ++++++++++++++++++
 gdb/gdbarch_components.py                  | 17 ++++++++++++++
 gdb/ppc-sysv-tdep.c                        |  3 +--
 gdb/ppc-tdep.h                             |  4 +++-
 gdb/rs6000-tdep.c                          | 25 ++++++++++++++++++--
 gdb/symtab.c                               | 13 +++++++++++
 gdb/testsuite/gdb.ada/finish-large.exp     | 30 ++++++++++++++++++++++++
 gdb/testsuite/gdb.ada/finish-large/p.adb   | 24 +++++++++++++++++++
 gdb/testsuite/gdb.ada/finish-large/pck.adb | 28 ++++++++++++++++++++++
 gdb/testsuite/gdb.ada/finish-large/pck.ads | 37 ++++++++++++++++++++++++++++++
 13 files changed, 222 insertions(+), 6 deletions(-)
---
base-commit: ff581559f9d6586d1d05c5a25d777c78edab3517
change-id: 20230314-submit-ppc-finish-fixes-a60161e49b29

Best regards,
-- 
Tom Tromey <tromey@adacore.com>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/3] Handle function descriptors in call_site_target
  2023-03-14 13:37 [PATCH 0/3] PPC/PPC64 "finish" fixes Tom Tromey
@ 2023-03-14 13:37 ` Tom Tromey
  2023-03-14 13:37 ` [PATCH 2/3] Handle erroneous DW_AT_call_return_pc Tom Tromey
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2023-03-14 13:37 UTC (permalink / raw)
  To: gdb-patches

call_site_target::iterate_over_addresses may look up a minimal symbol.
On platforms like PPC64 that use function descriptors, this may find
an unexpected address.  The fix is to use gdbarch_convert_from_func_ptr_addr
to convert from a function descriptor to the address recorded at the
call site.

I've added a new test case that is based on the internal AdaCore test
that provoked this bug.  However, I'm unable to test it as-is on
PPC64.
---
 gdb/dwarf2/loc.c                           |  6 ++++-
 gdb/testsuite/gdb.ada/finish-large.exp     | 30 ++++++++++++++++++++++++
 gdb/testsuite/gdb.ada/finish-large/p.adb   | 24 +++++++++++++++++++
 gdb/testsuite/gdb.ada/finish-large/pck.adb | 28 ++++++++++++++++++++++
 gdb/testsuite/gdb.ada/finish-large/pck.ads | 37 ++++++++++++++++++++++++++++++
 5 files changed, 124 insertions(+), 1 deletion(-)

diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c
index 914e016f085..d9615870aeb 100644
--- a/gdb/dwarf2/loc.c
+++ b/gdb/dwarf2/loc.c
@@ -711,7 +711,11 @@ call_site_target::iterate_over_addresses
 			  : msym.minsym->print_name ()));
 			
 	  }
-	callback (msym.value_address ());
+
+	CORE_ADDR addr = (gdbarch_convert_from_func_ptr_addr
+			  (call_site_gdbarch, msym.value_address (),
+			   current_inferior ()->top_target ()));
+	callback (addr);
       }
       break;
 
diff --git a/gdb/testsuite/gdb.ada/finish-large.exp b/gdb/testsuite/gdb.ada/finish-large.exp
new file mode 100644
index 00000000000..5661d132a18
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/finish-large.exp
@@ -0,0 +1,30 @@
+# Copyright 2023 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "ada.exp"
+
+require allow_ada_tests
+
+standard_ada_testfile p
+
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable debug] != ""} {
+  return -1
+}
+
+clean_restart ${testfile}
+runto "pck.create_large"
+
+set value "= (i => 1, j => 2, k => 3, l => 4, m => 5, n => 6, o => 7, p => 8, q => 9, r => 10, s => 11, t => 12)"
+gdb_test "finish" [string_to_regexp $value]
diff --git a/gdb/testsuite/gdb.ada/finish-large/p.adb b/gdb/testsuite/gdb.ada/finish-large/p.adb
new file mode 100644
index 00000000000..ce7631e5cbd
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/finish-large/p.adb
@@ -0,0 +1,24 @@
+--  Copyright 2023 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+with Pck; use Pck;
+
+procedure P is
+   Large : Data_Large;
+begin
+   Large := Create_Large;
+   Large.P := 42;
+   Break_Me;
+end P;
diff --git a/gdb/testsuite/gdb.ada/finish-large/pck.adb b/gdb/testsuite/gdb.ada/finish-large/pck.adb
new file mode 100644
index 00000000000..18ed031db12
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/finish-large/pck.adb
@@ -0,0 +1,28 @@
+--  Copyright 2023 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+package body Pck is
+
+   function Create_Large return Data_Large is
+   begin
+      return (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
+   end Create_Large;
+
+   procedure Break_Me is
+   begin
+      null;
+   end Break_Me;
+
+end Pck;
diff --git a/gdb/testsuite/gdb.ada/finish-large/pck.ads b/gdb/testsuite/gdb.ada/finish-large/pck.ads
new file mode 100644
index 00000000000..0ed49a71241
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/finish-large/pck.ads
@@ -0,0 +1,37 @@
+--  Copyright 2023 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+package Pck is
+
+   type Data_Large is record
+      I : Integer;
+      J : Integer;
+      K : Integer;
+      L : Integer;
+      M : Integer;
+      N : Integer;
+      O : Integer;
+      P : Integer;
+      Q : Integer;
+      R : Integer;
+      S : Integer;
+      T : Integer;
+   end record;
+
+   function Create_Large return Data_Large;
+
+   procedure Break_Me;
+
+end Pck;

-- 
2.39.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/3] Handle erroneous DW_AT_call_return_pc
  2023-03-14 13:37 [PATCH 0/3] PPC/PPC64 "finish" fixes Tom Tromey
  2023-03-14 13:37 ` [PATCH 1/3] Handle function descriptors in call_site_target Tom Tromey
@ 2023-03-14 13:37 ` Tom Tromey
  2023-03-24 16:10   ` Tom Tromey
  2023-03-14 13:37 ` [PATCH 3/3] Use entry values for 32-bit PPC struct return Tom Tromey
  2023-04-21 13:40 ` [PATCH 0/3] PPC/PPC64 "finish" fixes Tom Tromey
  3 siblings, 1 reply; 6+ messages in thread
From: Tom Tromey @ 2023-03-14 13:37 UTC (permalink / raw)
  To: gdb-patches

On PPC64, with the test case included in an earlier patch, we found
that "finish" would still not correctly find the return value via
entry values.

The issue is simple.  The compiler emits:

   0x00000000100032b8 <+28>:	bl      0x1000320c <pck__create_large>
   0x00000000100032bc <+32>:	nop
   0x00000000100032c0 <+36>:	li      r9,42

... but the DWARF says:

    <162a>   DW_AT_call_return_pc: 0x100032c0

That is, the declared return PC is one instruction past the actual
return PC.

This patch adds a new arch hook to handle this scenario, and
implements it for PPC64.  Some care is taken so that GDB will continue
to work if this compiler bug is fixed.  A GCC patch is here:

    https://gcc.gnu.org/pipermail/gcc-patches/2023-March/613336.html

I'm not completely sure that the nop check in the new arch hook is
correct; but if it is incorrect it just means that some invocations of
'finish' won't find a value -- which is what happens without the
patch.
---
 gdb/arch-utils.c          |  6 ++++++
 gdb/gdbarch-gen.h         | 13 +++++++++++++
 gdb/gdbarch.c             | 22 ++++++++++++++++++++++
 gdb/gdbarch_components.py | 17 +++++++++++++++++
 gdb/rs6000-tdep.c         | 22 ++++++++++++++++++++++
 gdb/symtab.c              | 13 +++++++++++++
 6 files changed, 93 insertions(+)

diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c
index e3af9ce2dbc..f9d0e73a362 100644
--- a/gdb/arch-utils.c
+++ b/gdb/arch-utils.c
@@ -1098,6 +1098,12 @@ default_get_return_buf_addr (struct type *val_type, frame_info_ptr cur_frame)
   return 0;
 }
 
+static CORE_ADDR
+default_update_call_site_pc (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  return pc;
+}
+
 /* Non-zero if we want to trace architecture code.  */
 
 #ifndef GDBARCH_DEBUG
diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h
index 76d12a15317..bec3221202c 100644
--- a/gdb/gdbarch-gen.h
+++ b/gdb/gdbarch-gen.h
@@ -468,6 +468,19 @@ typedef CORE_ADDR (gdbarch_get_return_buf_addr_ftype) (struct type *val_type, fr
 extern CORE_ADDR gdbarch_get_return_buf_addr (struct gdbarch *gdbarch, struct type *val_type, frame_info_ptr cur_frame);
 extern void set_gdbarch_get_return_buf_addr (struct gdbarch *gdbarch, gdbarch_get_return_buf_addr_ftype *get_return_buf_addr);
 
+/* Update PC when trying to find a call site.  This is useful on
+   architectures where the call site PC, as reported in the DWARF, can be
+   incorrect for some reason.
+
+   The passed-in PC will be an address in the inferior.  GDB will have
+   already failed to find a call site at this PC.  This function may
+   simply return its parameter if it thinks that should be the correct
+   address. */
+
+typedef CORE_ADDR (gdbarch_update_call_site_pc_ftype) (struct gdbarch *gdbarch, CORE_ADDR pc);
+extern CORE_ADDR gdbarch_update_call_site_pc (struct gdbarch *gdbarch, CORE_ADDR pc);
+extern void set_gdbarch_update_call_site_pc (struct gdbarch *gdbarch, gdbarch_update_call_site_pc_ftype *update_call_site_pc);
+
 /* Return true if the return value of function is stored in the first hidden
    parameter.  In theory, this feature should be language-dependent, specified
    by language and its ABI, such as C++.  Unfortunately, compiler may
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index b4763aa6bf4..b4ee88b61cb 100644
--- a/gdb/gdbarch.c
+++ b/gdb/gdbarch.c
@@ -114,6 +114,7 @@ struct gdbarch
   gdbarch_return_value_ftype *return_value = nullptr;
   gdbarch_return_value_as_value_ftype *return_value_as_value = default_gdbarch_return_value;
   gdbarch_get_return_buf_addr_ftype *get_return_buf_addr = default_get_return_buf_addr;
+  gdbarch_update_call_site_pc_ftype *update_call_site_pc = default_update_call_site_pc;
   gdbarch_return_in_first_hidden_param_p_ftype *return_in_first_hidden_param_p = default_return_in_first_hidden_param_p;
   gdbarch_skip_prologue_ftype *skip_prologue = nullptr;
   gdbarch_skip_main_prologue_ftype *skip_main_prologue = nullptr;
@@ -370,6 +371,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   if ((gdbarch->return_value_as_value == default_gdbarch_return_value) == (gdbarch->return_value == nullptr))
     log.puts ("\n\treturn_value_as_value");
   /* Skip verify of get_return_buf_addr, invalid_p == 0 */
+  /* Skip verify of update_call_site_pc, invalid_p == 0 */
   /* Skip verify of return_in_first_hidden_param_p, invalid_p == 0 */
   if (gdbarch->skip_prologue == 0)
     log.puts ("\n\tskip_prologue");
@@ -787,6 +789,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
   gdb_printf (file,
 	      "gdbarch_dump: get_return_buf_addr = <%s>\n",
 	      host_address_to_string (gdbarch->get_return_buf_addr));
+  gdb_printf (file,
+	      "gdbarch_dump: update_call_site_pc = <%s>\n",
+	      host_address_to_string (gdbarch->update_call_site_pc));
   gdb_printf (file,
 	      "gdbarch_dump: return_in_first_hidden_param_p = <%s>\n",
 	      host_address_to_string (gdbarch->return_in_first_hidden_param_p));
@@ -2619,6 +2624,23 @@ set_gdbarch_get_return_buf_addr (struct gdbarch *gdbarch,
   gdbarch->get_return_buf_addr = get_return_buf_addr;
 }
 
+CORE_ADDR
+gdbarch_update_call_site_pc (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  gdb_assert (gdbarch != NULL);
+  gdb_assert (gdbarch->update_call_site_pc != NULL);
+  if (gdbarch_debug >= 2)
+    gdb_printf (gdb_stdlog, "gdbarch_update_call_site_pc called\n");
+  return gdbarch->update_call_site_pc (gdbarch, pc);
+}
+
+void
+set_gdbarch_update_call_site_pc (struct gdbarch *gdbarch,
+				 gdbarch_update_call_site_pc_ftype update_call_site_pc)
+{
+  gdbarch->update_call_site_pc = update_call_site_pc;
+}
+
 int
 gdbarch_return_in_first_hidden_param_p (struct gdbarch *gdbarch, struct type *type)
 {
diff --git a/gdb/gdbarch_components.py b/gdb/gdbarch_components.py
index 92c501d2a72..8b5512c647e 100644
--- a/gdb/gdbarch_components.py
+++ b/gdb/gdbarch_components.py
@@ -901,6 +901,23 @@ May return 0 when unable to determine that address.""",
     invalid=False,
 )
 
+Method(
+    comment="""
+Update PC when trying to find a call site.  This is useful on
+architectures where the call site PC, as reported in the DWARF, can be
+incorrect for some reason.
+
+The passed-in PC will be an address in the inferior.  GDB will have
+already failed to find a call site at this PC.  This function may
+simply return its parameter if it thinks that should be the correct
+address.""",
+    type="CORE_ADDR",
+    name="update_call_site_pc",
+    params=[("CORE_ADDR", "pc")],
+    predefault="default_update_call_site_pc",
+    invalid=False,
+)
+
 Method(
     comment="""
 Return true if the return value of function is stored in the first hidden
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index 9859a7d8b85..d1a16b3430b 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -7460,6 +7460,27 @@ rs6000_program_breakpoint_here_p (gdbarch *gdbarch, CORE_ADDR address)
   return false;
 }
 
+/* Implement the update_call_site_pc arch hook.  */
+
+static CORE_ADDR
+ppc64_update_call_site_pc (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  /* Some versions of GCC emit:
+
+     .  bl function
+     .  nop
+     .  ...
+
+     but emit DWARF where the DW_AT_call_return_pc points to
+     instruction after the 'nop'.  If PC points to a nop, return the
+     following instruction instead.  */
+
+  unsigned long op = rs6000_fetch_instruction (gdbarch, pc);
+  if (op == 0x60000000)
+    pc += 4;
+  return pc;
+}
+
 /* Initialize the current architecture based on INFO.  If possible, re-use an
    architecture from ARCHES, which is a list of architectures already created
    during this debugging session.
@@ -8246,6 +8267,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       set_gdbarch_return_value (gdbarch, ppc64_sysv_abi_return_value);
       set_gdbarch_get_return_buf_addr (gdbarch,
 				       ppc64_sysv_get_return_buf_addr);
+      set_gdbarch_update_call_site_pc (gdbarch, ppc64_update_call_site_pc);
     }
   else
     set_gdbarch_return_value (gdbarch, ppc_sysv_abi_return_value);
diff --git a/gdb/symtab.c b/gdb/symtab.c
index e11f9262a22..219a1fd4671 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -349,6 +349,19 @@ compunit_symtab::find_call_site (CORE_ADDR pc) const
   struct call_site call_site_local (unrelocated_pc, nullptr, nullptr);
   void **slot
     = htab_find_slot (m_call_site_htab, &call_site_local, NO_INSERT);
+  if (slot != nullptr)
+    return (call_site *) *slot;
+
+  /* See if the arch knows another PC we should try.  On some
+     platforms, GCC emits a DWARF call site that is offset from the
+     actual return location.  */
+  struct gdbarch *arch = objfile ()->arch ();
+  CORE_ADDR new_pc = gdbarch_update_call_site_pc (arch, pc);
+  if (pc == new_pc)
+    return nullptr;
+
+  call_site new_call_site_local (new_pc - delta, nullptr, nullptr);
+  slot = htab_find_slot (m_call_site_htab, &new_call_site_local, NO_INSERT);
   if (slot == nullptr)
     return nullptr;
 

-- 
2.39.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 3/3] Use entry values for 32-bit PPC struct return
  2023-03-14 13:37 [PATCH 0/3] PPC/PPC64 "finish" fixes Tom Tromey
  2023-03-14 13:37 ` [PATCH 1/3] Handle function descriptors in call_site_target Tom Tromey
  2023-03-14 13:37 ` [PATCH 2/3] Handle erroneous DW_AT_call_return_pc Tom Tromey
@ 2023-03-14 13:37 ` Tom Tromey
  2023-04-21 13:40 ` [PATCH 0/3] PPC/PPC64 "finish" fixes Tom Tromey
  3 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2023-03-14 13:37 UTC (permalink / raw)
  To: gdb-patches

AdaCore has a local patch for PPC "finish", but last year, Ulrich
Weigand pointed out that this patch was incorrect.  It may work for
simple functions like the one in the internal test, but nothing
guarantees that r3 will be preserved by the callee, so checking r3 on
exit is not always correct.

This patch fixes the problem using the same approach as PPC64: use the
entry value of r3, if available.  Ulrich confirmed this matches the
PPC32 ABI.
---
 gdb/ppc-sysv-tdep.c | 3 +--
 gdb/ppc-tdep.h      | 4 +++-
 gdb/rs6000-tdep.c   | 3 +--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c
index ab859fbe143..66630793e86 100644
--- a/gdb/ppc-sysv-tdep.c
+++ b/gdb/ppc-sysv-tdep.c
@@ -2159,8 +2159,7 @@ ppc64_sysv_abi_return_value (struct gdbarch *gdbarch, struct value *function,
 }
 
 CORE_ADDR
-ppc64_sysv_get_return_buf_addr (struct type *val_type,
-				frame_info_ptr cur_frame)
+ppc_sysv_get_return_buf_addr (struct type *val_type, frame_info_ptr cur_frame)
 {
   /* The PowerPC ABI specifies aggregates that are not returned by value
      are returned in a storage buffer provided by the caller.  The
diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h
index fe41baef149..3c7948cc4ba 100644
--- a/gdb/ppc-tdep.h
+++ b/gdb/ppc-tdep.h
@@ -175,7 +175,9 @@ extern void ppc_collect_vsxregset (const struct regset *regset,
 				  const struct regcache *regcache,
 				  int regnum, void *vsxregs, size_t len);
 
-extern CORE_ADDR ppc64_sysv_get_return_buf_addr (type*, frame_info_ptr);
+/* Implementation of the gdbarch get_return_buf_addr hook.  */
+
+extern CORE_ADDR ppc_sysv_get_return_buf_addr (type*, frame_info_ptr);
 
 /* Private data that this module attaches to struct gdbarch.  */
 
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index d1a16b3430b..16adefb9f9b 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -8265,12 +8265,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   if (wordsize == 8)
     {
       set_gdbarch_return_value (gdbarch, ppc64_sysv_abi_return_value);
-      set_gdbarch_get_return_buf_addr (gdbarch,
-				       ppc64_sysv_get_return_buf_addr);
       set_gdbarch_update_call_site_pc (gdbarch, ppc64_update_call_site_pc);
     }
   else
     set_gdbarch_return_value (gdbarch, ppc_sysv_abi_return_value);
+  set_gdbarch_get_return_buf_addr (gdbarch, ppc_sysv_get_return_buf_addr);
 
   /* Set lr_frame_offset.  */
   if (wordsize == 8)

-- 
2.39.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/3] Handle erroneous DW_AT_call_return_pc
  2023-03-14 13:37 ` [PATCH 2/3] Handle erroneous DW_AT_call_return_pc Tom Tromey
@ 2023-03-24 16:10   ` Tom Tromey
  0 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2023-03-24 16:10 UTC (permalink / raw)
  To: Tom Tromey via Gdb-patches; +Cc: Tom Tromey

>>>>> "Tom" == Tom Tromey via Gdb-patches <gdb-patches@sourceware.org> writes:

Tom> On PPC64, with the test case included in an earlier patch, we found
Tom> that "finish" would still not correctly find the return value via
Tom> entry values.
[...]

Tom> I'm not completely sure that the nop check in the new arch hook is
Tom> correct; but if it is incorrect it just means that some invocations of
Tom> 'finish' won't find a value -- which is what happens without the
Tom> patch.

Subsequent discussion revealed that the linker might replace this 'nop'
with some other instruction, so ...

Tom> +  unsigned long op = rs6000_fetch_instruction (gdbarch, pc);
Tom> +  if (op == 0x60000000)
Tom> +    pc += 4;
Tom> +  return pc;

... in an updated version I've replaced this with just "return pc + 4".

Tom

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/3] PPC/PPC64 "finish" fixes
  2023-03-14 13:37 [PATCH 0/3] PPC/PPC64 "finish" fixes Tom Tromey
                   ` (2 preceding siblings ...)
  2023-03-14 13:37 ` [PATCH 3/3] Use entry values for 32-bit PPC struct return Tom Tromey
@ 2023-04-21 13:40 ` Tom Tromey
  3 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2023-04-21 13:40 UTC (permalink / raw)
  To: Tom Tromey via Gdb-patches; +Cc: Tom Tromey

>>>>> "Tom" == Tom Tromey via Gdb-patches <gdb-patches@sourceware.org> writes:

Tom> We found some minor issues with "finish" on PPC and PPC64.  This
Tom> series fixes some of them.

Tom> I think there are still some issues here with fixed-point types, but I
Tom> don't hae an immediate plan to look at those.

Tom> These patches have been tested using the internal AdaCore test suite.

I'm going to check these in now.

Tom

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-04-21 13:40 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-14 13:37 [PATCH 0/3] PPC/PPC64 "finish" fixes Tom Tromey
2023-03-14 13:37 ` [PATCH 1/3] Handle function descriptors in call_site_target Tom Tromey
2023-03-14 13:37 ` [PATCH 2/3] Handle erroneous DW_AT_call_return_pc Tom Tromey
2023-03-24 16:10   ` Tom Tromey
2023-03-14 13:37 ` [PATCH 3/3] Use entry values for 32-bit PPC struct return Tom Tromey
2023-04-21 13:40 ` [PATCH 0/3] PPC/PPC64 "finish" fixes Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).