[committed] Fix Java exception support on PA

John David Anglin dave@hiauly1.hia.nrc.ca
Wed Dec 9 21:59:00 GMT 2009


Now that the unwind MD_FALLBACK_FRAME_STATE_FOR on all PA targets sets
the signal_frame flag, we don't need to adjust the program counter
in MAKE_THROW_FRAME.  The rest of the changes are simplifications arising
from this change and cleanups.

Tested on hppa-unknown-linux-gnu and hppa2.0w-hp-hpux11.11 with no
regressions.  Committed to trunk.

I wish to thank Eric Botcazou for his help in debugging the failure
of array_3.java.

Dave
-- 
J. David Anglin                                  dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6602)

2009-12-09  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>

	* include/pa-signal.h: Do not include ucontext.h.
	(SIGNAL_HANDLER): Add __attribute__ ((unused)) to signal handler
	arguments.
	(MAKE_THROW_FRAME): Do not adjust program counter.
	* include/hppa-signal.h: Do not include sys/types.h, sys/syscall.h and
	unistd.h.
	(MAKE_THROW_FRAME): Do not adjust program counter.
	(HANDLE_FPE): Define.
	(INIT_SEGV, INIT_FPE): Revise indentation.

Index: include/pa-signal.h
===================================================================
--- include/pa-signal.h	(revision 155099)
+++ include/pa-signal.h	(working copy)
@@ -1,6 +1,6 @@
 // pa-signal.h - Catch runtime signals and turn them into exceptions.
 
-/* Copyright (C) 1998, 1999, 2000  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2009  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -12,29 +12,17 @@
 #define JAVA_SIGNAL_H 1
 
 #include <signal.h>
-#include <ucontext.h>
 #include <sys/syscall.h>
 
 #define HANDLE_SEGV 1
 #define HANDLE_FPE 1
 
-#define SIGNAL_HANDLER(_name) 					\
-static void _Jv_##_name (int _dummy, siginfo_t *_info, void *arg)
+#define SIGNAL_HANDLER(_name)						\
+static void _Jv_##_name (int _dummy __attribute__ ((unused)),		\
+			 siginfo_t *_info __attribute__ ((__unused__)), \
+			 void *arg __attribute__ ((__unused__)))
 
-#define MAKE_THROW_FRAME(_exception)				\
-do								\
-{								\
-  struct ucontext *uc = (struct ucontext *)arg;			\
-  struct sigcontext *sc = &uc->uc_mcontext;			\
-  (void)_dummy;							\
-  (void)_info;							\
-  /* Advance the program counter so that it is after the start 	\
-     of the instruction:  the exception handler expects		\
-     the PC to point to the instruction after a call. */	\
-  sc->sc_iaoq[0] = sc->sc_iaoq[1];				\
-  sc->sc_iaoq[1] += 4;						\
-}								\
-while (0)
+#define MAKE_THROW_FRAME(_exception)
 
 #define INIT_SEGV						\
 do								\
Index: include/hppa-signal.h
===================================================================
--- include/hppa-signal.h	(revision 155099)
+++ include/hppa-signal.h	(working copy)
@@ -1,7 +1,7 @@
 /* hppa-signal.h - Catch runtime signals and turn them into exceptions,
    on a HP-UX 11 PA system.  */
 
-/* Copyright (C) 2006  Free Software Foundation
+/* Copyright (C) 2006, 2009  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -9,60 +9,41 @@
 Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
 details.  */
 
-/* This file is really more of a specification.  The rest of the system
-   should be arranged so that this Just Works.  */
-
 #ifndef JAVA_SIGNAL_H
-# define JAVA_SIGNAL_H 1
+#define JAVA_SIGNAL_H 1
 
-#include <sys/types.h>
 #include <signal.h>
-#include <sys/syscall.h>
-#include <unistd.h>
 
-# define HANDLE_SEGV 1
-# undef HANDLE_FPE
+#define HANDLE_SEGV 1
+#define HANDLE_FPE 1
 
 #define SIGNAL_HANDLER(_name)						\
-  static void _name (int _dummy __attribute__ ((unused)),		\
-		     siginfo_t *_info __attribute__ ((__unused__)),	\
-		     void *arg __attribute__ ((__unused__)))
+static void  _name (int _dummy __attribute__ ((unused)),		\
+		    siginfo_t *_info __attribute__ ((__unused__)),	\
+		    void *arg __attribute__ ((__unused__)))
 
-#define MAKE_THROW_FRAME(_exception)					\
-do									\
-{									\
-  ucontext_t *_context = (ucontext_t *) arg;				\
-  (void)_dummy;								\
-  (void)_info;								\
-  mcontext_t *mc = &(_context->uc_mcontext);				\
-  SetSSReg (mc, ss_pcoq_head, GetSSReg (mc, ss_pcoq_tail));		\
-  SetSSReg (mc, ss_pcsq_head, GetSSReg (mc, ss_pcsq_tail));		\
-  /* This part is not quit right if the head pc was pointing		\
-     at a branch.  The tail needs to be adjusted to the branch		\
-     target if the branch is taken.  The tail space register		\
-     may need adjustment as well if the branch is an interspace		\
-     branch.  */							\
-  SetSSReg (mc, ss_pcoq_tail, (GetSSReg (mc, ss_pcoq_tail) + 4));	\
-									\
- }									\
+#define MAKE_THROW_FRAME(_exception)
+
+#define INIT_SEGV				\
+do						\
+  {						\
+    struct sigaction sa;			\
+    sa.sa_sigaction = catch_segv;		\
+    sigemptyset (&sa.sa_mask);			\
+    sa.sa_flags = SA_SIGINFO | SA_NODEFER;	\
+    sigaction (SIGSEGV, &sa, NULL);		\
+  }						\
 while (0)
 
-# define INIT_SEGV				\
-  do {						\
-      struct sigaction sa;			\
-      sa.sa_sigaction = catch_segv;		\
-      sigemptyset (&sa.sa_mask);		\
-      sa.sa_flags = SA_SIGINFO | SA_NODEFER;	\
-      sigaction (SIGSEGV, &sa, NULL);		\
-    } while (0)
+#define INIT_FPE				\
+do						\
+  {						\
+    struct sigaction sa;			\
+    sa.sa_sigaction = catch_fpe;		\
+    sigemptyset (&sa.sa_mask);			\
+    sa.sa_flags = SA_SIGINFO | SA_NODEFER;	\
+    sigaction (SIGFPE, &sa, NULL);		\
+  }						\
+while (0)
 
-# define INIT_FPE				\
-  do {						\
-      struct sigaction sa;			\
-      sa.sa_sigaction = catch_fpe;		\
-      sigemptyset (&sa.sa_mask);		\
-      sa.sa_flags = SA_SIGINFO | SA_NODEFER;	\
-      sigaction (SIGFPE, &sa, NULL);		\
-    } while (0)
-
 #endif /* JAVA_SIGNAL_H */



More information about the Gcc-patches mailing list