aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/sigtramp-android.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/sigtramp-android.c')
-rw-r--r--gcc/ada/sigtramp-android.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/gcc/ada/sigtramp-android.c b/gcc/ada/sigtramp-android.c
new file mode 100644
index 0000000..2fd42ba
--- /dev/null
+++ b/gcc/ada/sigtramp-android.c
@@ -0,0 +1,79 @@
+/****************************************************************************
+ * *
+ * GNAT COMPILER COMPONENTS *
+ * *
+ * S I G T R A M P *
+ * *
+ * C/Asm Implementation File *
+ * *
+ * Copyright (C) 2015-2024, Free Software Foundation, Inc. *
+ * *
+ * GNAT is free software; you can redistribute it and/or modify it under *
+ * terms of the GNU General Public License as published by the Free Soft- *
+ * ware Foundation; either version 3, or (at your option) any later ver- *
+ * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
+ * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
+ * or FITNESS FOR A PARTICULAR PURPOSE. *
+ * *
+ * As a special exception under Section 7 of GPL version 3, you are granted *
+ * additional permissions described in the GCC Runtime Library Exception, *
+ * version 3.1, as published by the Free Software Foundation. *
+ * *
+ * In particular, you can freely distribute your programs built with the *
+ * GNAT Pro compiler, including any required library run-time units, using *
+ * any licensing terms of your choosing. See the AdaCore Software License *
+ * for full details. *
+ * *
+ * GNAT was originally developed by the GNAT team at New York University. *
+ * Extensive contributions were provided by Ada Core Technologies Inc. *
+ * *
+ ****************************************************************************/
+
+/**************************************************
+ * Android version of the __gnat_sigtramp service *
+ **************************************************/
+
+#include "sigtramp.h"
+
+/* The ARM port relies on CFI info setup here. Others such as aarch64
+ rely on kernel CFI and may relay to the handler directly. */
+
+#if defined(__arm__)
+#define __SETUP_CFI 1
+#else
+#define __SETUP_CFI 0
+#endif
+
+#if __SETUP_CFI
+
+/* Craft a sigtramp stub providing unwind info for common registers. */
+
+#define TRAMP_COMMON __gnat_sigtramp_common
+extern void TRAMP_COMMON
+ (int signo, void *siginfo, void *sigcontext,
+ __sigtramphandler_t * handler);
+
+#include <sys/ucontext.h>
+
+void __gnat_sigtramp (int signo, void *si, void *ucontext,
+ __sigtramphandler_t * handler)
+{
+ struct sigcontext *mcontext = &((ucontext_t *) ucontext)->uc_mcontext;
+ TRAMP_COMMON (signo, si, mcontext, handler);
+}
+
+#include <sigtramp-android-asm.h>
+
+asm (SIGTRAMP_START(TRAMP_COMMON));
+asm (SIGTRAMP_BODY);
+asm (SIGTRAMP_END(TRAMP_COMMON));
+
+#else /* !__SETUP_CFI */
+
+void __gnat_sigtramp (int signo, void *si, void *ucontext,
+ __sigtramphandler_t * handler)
+{
+ handler (signo, si, ucontext);
+}
+
+#endif