]> gcc.gnu.org Git - gcc.git/commitdiff
dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64.
authorAndrew Haley <aph@cambridge.redhat.com>
Wed, 27 Mar 2002 17:08:47 +0000 (17:08 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Wed, 27 Mar 2002 17:08:47 +0000 (17:08 +0000)
2002-03-25  Andrew Haley <aph@cambridge.redhat.com>, Hans Boehm <Hans_Boehm@hp.com>

        * include/dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64.
        (INIT_SEGV, INIT_FPE): Add versions that use __libc_sigaction
        instead of syscall on IA-64.
        Add FIXME comment.

From-SVN: r51459

libjava/ChangeLog
libjava/include/dwarf2-signal.h

index 2a57cc407bd45611267d16e901bc8ab1ed5ca333..878854b92201c238886063c2878c965c01606330 100644 (file)
@@ -1,3 +1,10 @@
+2002-03-25  Andrew Haley <aph@cambridge.redhat.com>, Hans Boehm <Hans_Boehm@hp.com>
+
+        * include/dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64.
+        (INIT_SEGV, INIT_FPE): Add versions that use __libc_sigaction
+        instead of syscall on IA-64.
+        Add FIXME comment.
+
 2002-03-27  Anthony Green  <green@redhat.com>
 
        * libgcj.spec.in: Add CHECKREFSPEC.
index 3a662aec2d979bf6138ec6b5340aa8365aa016f8..cde0fa9d8ccf0f7348fee54a86b4a84f0998ca30 100644 (file)
@@ -41,6 +41,23 @@ 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
 #define MAKE_THROW_FRAME(_exception)           \
 do                                             \
@@ -50,6 +67,7 @@ do                                            \
 while (0)
 #endif
 
+#ifndef __ia64__
 #define INIT_SEGV                                              \
 do                                                             \
   {                                                            \
@@ -82,4 +100,41 @@ while (0)
  * go away once all systems have pthreads libraries that are
  * compiled with full unwind info.  */
 
+#else  /* __ia64__ */
+
+// 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                                                             \
+  {                                                            \
+    nullp = new java::lang::NullPointerException ();           \
+    struct sigaction act;                                      \
+    act.sa_sigaction = _Jv_catch_segv;                         \
+    sigemptyset (&act.sa_mask);                                        \
+    act.sa_flags = SA_SIGINFO;                                 \
+    __libc_sigaction (SIGSEGV, &act, NULL);                    \
+  }                                                            \
+while (0)  
+
+#define INIT_FPE                                               \
+do                                                             \
+  {                                                            \
+    arithexception = new java::lang::ArithmeticException       \
+      (JvNewStringLatin1 ("/ by zero"));                       \
+    struct sigaction act;                                      \
+    act.sa_sigaction = _Jv_catch_fpe;                          \
+    sigemptyset (&act.sa_mask);                                        \
+    act.sa_flags = SA_SIGINFO;                                 \
+    __libc_sigaction (SIGFPE, &act, NULL);                     \
+  }                                                            \
+while (0)  
+#endif /* __ia64__ */
 #endif /* JAVA_SIGNAL_H */
This page took 0.061666 seconds and 5 git commands to generate.