Since GCC 8, we have output incorrect numbers for the transactional
memory registers.

Also, we didn't output the correct DWARF register numbers for those.
The number for sprN is 100+N.

This fixes both these issues.

Tested on powerpc64-linux (-m32,-m64} and on powerpc64le-linux.
Committing.  I hope this (and the next patch) doesn't break targets
using the old DWARF register numbers, I cannot easily test that; but
it's stage 1.

This should be backported to GCC 8 and GCC 9 (9.2).


Segher


2019-05-02  Segher Boessenkool  <seg...@kernel.crashing.org>

        * config/rs6000/rs6000.c (rs6000_dbx_register_number): Return the
        correct numbers for TFHAR, TFIAR, TEXASR.

---
 gcc/config/rs6000/rs6000.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index f0de18d..f8e9fd2 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -36269,10 +36269,20 @@ rs6000_init_dwarf_reg_sizes_extra (tree address)
 unsigned int
 rs6000_dbx_register_number (unsigned int regno, unsigned int format)
 {
-  /* Except for the above, we use the internal number for non-DWARF
-     debug information, and also for .eh_frame.  */
+  /* We use the GCC 7 (and before) internal number for non-DWARF debug
+     information, and also for .eh_frame.  */
   if ((format == 0 && write_symbols != DWARF2_DEBUG) || format == 2)
-    return regno;
+    {
+      /* Translate the regnos to their numbers in GCC 7 (and before).  */
+      if (regno == TFHAR_REGNO)
+       regno = 114;
+      else if (regno == TFIAR_REGNO)
+       regno = 115;
+      else if (regno == TEXASR_REGNO)
+       regno = 116;
+
+      return regno;
+    }
 
   /* On some platforms, we use the standard DWARF register
      numbering for .debug_info and .debug_frame.  */
@@ -36299,6 +36309,12 @@ rs6000_dbx_register_number (unsigned int regno, 
unsigned int format)
     return 356;
   if (regno == VSCR_REGNO)
     return 67;
+  if (regno == TFHAR_REGNO)
+    return 228;
+  if (regno == TFIAR_REGNO)
+    return 229;
+  if (regno == TEXASR_REGNO)
+    return 230;
 #endif
   return regno;
 }
-- 
1.8.3.1

Reply via email to