aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2024-08-16 17:10:59 +0200
committerMarc Poulhiès <dkm@gcc.gnu.org>2024-10-08 10:37:11 +0200
commit3376bc79ba0833f9ad8a9ec4860aeb217710cb5b (patch)
tree06627d30d60cfadfcf5aadad50bf8e58439ab1ed
parent39bd80bee89d68be08d5b41ad71adfb2ec6cff05 (diff)
downloadgcc-3376bc79ba0833f9ad8a9ec4860aeb217710cb5b.zip
gcc-3376bc79ba0833f9ad8a9ec4860aeb217710cb5b.tar.gz
gcc-3376bc79ba0833f9ad8a9ec4860aeb217710cb5b.tar.bz2
ada: Account for aarch64 in init.c section for Android
Unlike the ARM port already there, aarch64 is dwarf CFI based for unwinding and Android-Linux exposes kernel CFI for signal handlers. gcc/ada/ChangeLog: * init.c (__gnat_error_handler): Map signals straight to Ada exceptions, without a local CFI trampoline. (__gnat_adjust_context_for_raise): Guard arm specific code on __arm__ compilation. Do nothing otherwise, relying on libgcc's signal frame recognition for PC/RA adjustments.
-rw-r--r--gcc/ada/init.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/ada/init.c b/gcc/ada/init.c
index 93e73f5..ad51e2e 100644
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -2782,10 +2782,16 @@ __gnat_install_handler ()
void
__gnat_adjust_context_for_raise (int signo ATTRIBUTE_UNUSED, void *ucontext)
{
+#if defined(__arm__)
mcontext_t *mcontext = &((ucontext_t *) ucontext)->uc_mcontext;
/* ARM Bump has to be an even number because of odd/even architecture. */
((mcontext_t *) mcontext)->arm_pc += 2;
+#endif
+
+ /* Other ports, based on dwarf2 unwinding, typically leverage
+ kernel CFI coordinated with libgcc's explicit support for signal
+ frames. */
}
static void
@@ -2826,8 +2832,14 @@ __gnat_error_handler (int sig, siginfo_t *si, void *ucontext)
{
__gnat_adjust_context_for_raise (sig, ucontext);
+ /* The ARM port relies on a sigtramp. Others such as aarch64,
+ dwarf info based, rely on kernel CFI. */
+#if defined(__arm__)
__gnat_sigtramp (sig, (void *) si, (void *) ucontext,
(__sigtramphandler_t *)&__gnat_map_signal);
+#else
+ __gnat_map_signal (sig, si, ucontext);
+#endif
}
/* This must be in keeping with System.OS_Interface.Alternate_Stack_Size. */