aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2019-05-02 20:46:38 +0200
committerSegher Boessenkool <segher@gcc.gnu.org>2019-05-02 20:46:38 +0200
commitfc9613c640c28ca85ea988f6890d13cb4d912e11 (patch)
tree49d967cb2a1fa94ac724f2836d4bf90d39130ba1
parentf58bd252753e1c2458dc009a71726fca772643a8 (diff)
downloadgcc-fc9613c640c28ca85ea988f6890d13cb4d912e11.zip
gcc-fc9613c640c28ca85ea988f6890d13cb4d912e11.tar.gz
gcc-fc9613c640c28ca85ea988f6890d13cb4d912e11.tar.bz2
rs6000: Make debug regnums independent of internal ones
Where we use "internal GCC register numbers" in debug info, that defines an ABI, so we cannot change those numbers. But we want to change the internal numbers, and sometimes we do that without remembering this gotcha anyway; so let's make everything independent of the internal numbers. For those registers that are not recognised here (we still have MQ for example, but also the GCC-internal frame pointer and arg pointer registers), this just returns the internal register number. This is a bit worrying: that number could be the same as that for a register we validly want to have in debug info. I first had a gcc_unreachable () for that, but this does now work because dwarf2cfi calls rs6000_dbx_register_number for every internal register. Then I just returned 0 for the internal regs, but that causes various regression tests to fail. So now I return the internal register number again, as it was before; but this needs to be fixed. * config/rs6000/rs6000.c (rs6000_dbx_register_number): Do not use the internal register number, for any "real" register. From-SVN: r270820
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/rs6000/rs6000.c85
2 files changed, 58 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 88d8364..5342864 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2019-05-02 Segher Boessenkool <segher@kernel.crashing.org>
+ * config/rs6000/rs6000.c (rs6000_dbx_register_number): Do not use
+ the internal register number, for any "real" register.
+
+2019-05-02 Segher Boessenkool <segher@kernel.crashing.org>
+
* config/rs6000/rs6000.c (rs6000_dbx_register_number): Return the
correct numbers for TFHAR, TFIAR, TEXASR.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index f8e9fd2..c75fd86 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -36269,53 +36269,74 @@ rs6000_init_dwarf_reg_sizes_extra (tree address)
unsigned int
rs6000_dbx_register_number (unsigned int regno, unsigned int format)
{
- /* 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)
+ /* On some platforms, we use the standard DWARF register
+ numbering for .debug_info and .debug_frame. */
+ if ((format == 0 && write_symbols == DWARF2_DEBUG) || format == 1)
{
- /* Translate the regnos to their numbers in GCC 7 (and before). */
+#ifdef RS6000_USE_DWARF_NUMBERING
+ if (regno <= 31)
+ return regno;
+ if (FP_REGNO_P (regno))
+ return regno - FIRST_FPR_REGNO + 32;
+ if (ALTIVEC_REGNO_P (regno))
+ return regno - FIRST_ALTIVEC_REGNO + 1124;
+ if (regno == LR_REGNO)
+ return 108;
+ if (regno == CTR_REGNO)
+ return 109;
+ if (regno == CA_REGNO)
+ return 101; /* XER */
+ /* Special handling for CR for .debug_frame: rs6000_emit_prologue has
+ translated any combination of CR2, CR3, CR4 saves to a save of CR2.
+ The actual code emitted saves the whole of CR, so we map CR2_REGNO
+ to the DWARF reg for CR. */
+ if (format == 1 && regno == CR2_REGNO)
+ return 64;
+ if (CR_REGNO_P (regno))
+ return regno - CR0_REGNO + 86;
+ if (regno == VRSAVE_REGNO)
+ return 356;
+ if (regno == VSCR_REGNO)
+ return 67;
if (regno == TFHAR_REGNO)
- regno = 114;
- else if (regno == TFIAR_REGNO)
- regno = 115;
- else if (regno == TEXASR_REGNO)
- regno = 116;
+ return 228;
+ if (regno == TFIAR_REGNO)
+ return 229;
+ if (regno == TEXASR_REGNO)
+ return 230;
return regno;
+#endif
}
- /* On some platforms, we use the standard DWARF register
- numbering for .debug_info and .debug_frame. */
-#ifdef RS6000_USE_DWARF_NUMBERING
- if (regno <= 63)
+ /* We use the GCC 7 (and before) internal number for non-DWARF debug
+ information, and also for .eh_frame. */
+ /* Translate the regnos to their numbers in GCC 7 (and before). */
+ if (regno <= 31)
return regno;
+ if (FP_REGNO_P (regno))
+ return regno - FIRST_FPR_REGNO + 32;
+ if (ALTIVEC_REGNO_P (regno))
+ return regno - FIRST_ALTIVEC_REGNO + 77;
if (regno == LR_REGNO)
- return 108;
+ return 65;
if (regno == CTR_REGNO)
- return 109;
- /* Special handling for CR for .debug_frame: rs6000_emit_prologue has
- translated any combination of CR2, CR3, CR4 saves to a save of CR2.
- The actual code emitted saves the whole of CR, so we map CR2_REGNO
- to the DWARF reg for CR. */
- if (format == 1 && regno == CR2_REGNO)
- return 64;
- if (CR_REGNO_P (regno))
- return regno - CR0_REGNO + 86;
+ return 66;
if (regno == CA_REGNO)
- return 101; /* XER */
- if (ALTIVEC_REGNO_P (regno))
- return regno - FIRST_ALTIVEC_REGNO + 1124;
+ return 76; /* XER */
+ if (CR_REGNO_P (regno))
+ return regno - CR0_REGNO + 68;
if (regno == VRSAVE_REGNO)
- return 356;
+ return 109;
if (regno == VSCR_REGNO)
- return 67;
+ return 110;
if (regno == TFHAR_REGNO)
- return 228;
+ return 114;
if (regno == TFIAR_REGNO)
- return 229;
+ return 115;
if (regno == TEXASR_REGNO)
- return 230;
-#endif
+ return 116;
+
return regno;
}