Fix a couple of inaccuracies in the VxWorks signal handler trampoline
for aarch64:

- REGNO_PC_OFFSET, used as the cfi return column number, is better
  sync'ed with the back-end's DWARF_ALT_FRAME_RETURN_COLUMN.

- R18 is used by VxWorks for internal purposes so is best left out of
  the CFI notes telling the unwinder where to find values to restore.

Figured out of code reading after observing failures of tests attempting
to catch exceptions expected to be raised out of signals triggered on
purpose. The tests pass after the change.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

        * sigtramp-vxworks-target.inc (__aarch64__): Sync
        REGNO_PC_OFFSET with the back-end DWARF_ALT_FRAME_RETURN_COLUMN.
        In CFI_COMMON_REGS, leave r18 alone, VxWorks private.
diff --git a/gcc/ada/sigtramp-vxworks-target.inc b/gcc/ada/sigtramp-vxworks-target.inc
--- a/gcc/ada/sigtramp-vxworks-target.inc
+++ b/gcc/ada/sigtramp-vxworks-target.inc
@@ -100,7 +100,7 @@
 #define FUNCTION "%function"
 
 #ifdef __aarch64__
-#define REGNO_PC_OFFSET  80  /* aka V16, a scratch register */
+#define REGNO_PC_OFFSET  96  /* DWARF_ALT_FRAME_RETURN_COLUMN */
 #else
 #define REGNO_PC_OFFSET  15  /* PC_REGNUM */
 #endif
@@ -375,7 +375,7 @@ TCR(COMMON_CFI(G_REG_OFFSET(14))) \
 TCR(COMMON_CFI(G_REG_OFFSET(15))) \
 TCR(COMMON_CFI(G_REG_OFFSET(16))) \
 TCR(COMMON_CFI(G_REG_OFFSET(17))) \
-TCR(COMMON_CFI(G_REG_OFFSET(18))) \
+CR("# Leave alone R18, VxWorks reserved\n") \
 TCR(COMMON_CFI(G_REG_OFFSET(19))) \
 TCR(COMMON_CFI(G_REG_OFFSET(20))) \
 TCR(COMMON_CFI(G_REG_OFFSET(21))) \


Reply via email to