aboutsummaryrefslogtreecommitdiff
path: root/libjava/include/dwarf2-signal.h
diff options
context:
space:
mode:
authorAndrew Haley <aph@cambridge.redhat.com>2002-03-26 03:42:54 +0000
committerHans Boehm <hboehm@gcc.gnu.org>2002-03-26 03:42:54 +0000
commit90b2d2afa1e1d6b7a8c37b836de62f70d3a103e0 (patch)
tree13e41aa4b2ae2a369831b422eb3db83f7990e49a /libjava/include/dwarf2-signal.h
parentcaba570b31bfe18bcad32fa4a5331d8575f74ddd (diff)
downloadgcc-90b2d2afa1e1d6b7a8c37b836de62f70d3a103e0.zip
gcc-90b2d2afa1e1d6b7a8c37b836de62f70d3a103e0.tar.gz
gcc-90b2d2afa1e1d6b7a8c37b836de62f70d3a103e0.tar.bz2
configure.in, configure: enable dwarf2-exception-style exception handling on IA-64.
* configure.in, configure: enable dwarf2-exception-style exception handling on IA-64. * include/dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64. (INIT_SEGV, INIT_FPE): Use __libc_sigaction instead of syscall. Add FIXME comment. From-SVN: r51367
Diffstat (limited to 'libjava/include/dwarf2-signal.h')
-rw-r--r--libjava/include/dwarf2-signal.h32
1 files changed, 30 insertions, 2 deletions
diff --git a/libjava/include/dwarf2-signal.h b/libjava/include/dwarf2-signal.h
index 3a662ae..f1572d3 100644
--- a/libjava/include/dwarf2-signal.h
+++ b/libjava/include/dwarf2-signal.h
@@ -41,7 +41,25 @@ do \
_sc->sc_pc += 4; \
} \
while (0)
+
+#elif defined(__ia64__)
+
+#define MAKE_THROW_FRAME(_exception) \
+do \
+{ \
+ /* IA-64 either leaves PC pointing at a faulting instruction or the \
+ following instruction, depending on the signal. SEGV always does \
+ the former, so we adjust the saved PC to point to the following \
+ instruction; this is what the handler in libgcc expects. */ \
+ /* Note that we are lying to the unwinder here, which expects the \
+ faulting pc, not pc+1. But we claim the unwind information can't \
+ be changed by such a ld or st instruction, so it doesn't matter. */ \
+ struct sigcontext *_sc = (struct sigcontext *)_p; \
+ _sc->sc_ip++; \
+} \
+while (0)
#else
+#error
#define MAKE_THROW_FRAME(_exception) \
do \
{ \
@@ -50,6 +68,16 @@ do \
while (0)
#endif
+// FIXME: We shouldn't be using libc_sigaction here, since it should
+// be glibc private. But using syscall here would mean translating to
+// the kernel's struct sigaction and argument sequence, which we
+// shouldn't either. The right solution is to call sigaction and to
+// make sure that we can unwind correctly through the pthread signal
+// wrapper.
+extern "C" int __libc_sigaction (int __sig,
+ __const struct sigaction *__restrict __act,
+ struct sigaction *__restrict __oact) throw ();
+
#define INIT_SEGV \
do \
{ \
@@ -58,7 +86,7 @@ do \
act.sa_sigaction = _Jv_catch_segv; \
sigemptyset (&act.sa_mask); \
act.sa_flags = SA_SIGINFO; \
- syscall (SYS_sigaction, SIGSEGV, &act, NULL); \
+ __libc_sigaction (SIGSEGV, &act, NULL); \
} \
while (0)
@@ -71,7 +99,7 @@ do \
act.sa_sigaction = _Jv_catch_fpe; \
sigemptyset (&act.sa_mask); \
act.sa_flags = SA_SIGINFO; \
- syscall (SYS_sigaction, SIGFPE, &act, NULL); \
+ __libc_sigaction (SIGFPE, &act, NULL); \
} \
while (0)