x86_64 support

Andrew Haley aph@redhat.com
Fri Jan 10 11:27:00 GMT 2003


Fix x86_64 bugs.

Andrew.

2003-01-10  Andrew Haley  <aph@redhat.com>

        * include/dwarf2-signal.h: Remove x86_64.
        * configure.host (x86_64 DIVIDESPEC): Remove.
        * include/x86_64-signal.h: New file.
        * configure.in: Regenerate.

Index: configure.in
===================================================================
RCS file: /cvs/gcc/gcc/libjava/configure.in,v
retrieving revision 1.143
diff -c -2 -p -r1.143 configure.in
*** configure.in	16 Dec 2002 18:22:52 -0000	1.143
--- configure.in	10 Jan 2003 11:18:12 -0000
*************** case "${host}" in
*** 917,921 ****
      ;;
   x86_64*-*-linux*)
!     SIGNAL_HANDLER=include/dwarf2-signal.h
      ;;
   sparc*-*-linux*)
--- 917,921 ----
      ;;
   x86_64*-*-linux*)
!     SIGNAL_HANDLER=include/x86_64-signal.h
      ;;
   sparc*-*-linux*)
Index: configure.host
===================================================================
RCS file: /cvs/gcc/gcc/libjava/configure.host,v
retrieving revision 1.40
diff -c -2 -p -r1.40 configure.host
*** configure.host	16 Dec 2002 18:22:52 -0000	1.40
--- configure.host	10 Jan 2003 11:18:12 -0000
*************** case "${host}" in
*** 102,106 ****
  	libgcj_cxxflags="-D__NO_MATH_INLINES"
  	libgcj_cflags="-D__NO_MATH_INLINES"
- 	DIVIDESPEC=-fno-use-divide-subroutine
  	enable_hash_synchronization_default=yes
  	slow_pthread_self=yes
--- 102,105 ----
Index: include/dwarf2-signal.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/dwarf2-signal.h,v
retrieving revision 1.12
diff -c -2 -p -r1.12 dwarf2-signal.h
*** include/dwarf2-signal.h	19 Jul 2002 14:41:14 -0000	1.12
--- include/dwarf2-signal.h	10 Jan 2003 11:18:13 -0000
*************** while (0)  
*** 210,216 ****
  #endif
  #elif !defined(__ia64__)
- #if defined(__x86_64__)
- #define SYS_sigaction SYS_rt_sigaction
- #endif
  #define INIT_SEGV						\
  do								\
--- 210,213 ----
Index: include/x86_64-signal.h
===================================================================
RCS file: include/x86_64-signal.h
diff -N include/x86_64-signal.h
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- include/x86_64-signal.h	10 Jan 2003 11:18:13 -0000
***************
*** 0 ****
--- 1,82 ----
+ // x86_64-signal.h - Catch runtime signals and turn them into exceptions
+ // on an x86_64 based GNU/Linux system.
+ 
+ /* Copyright (C) 2003  Free Software Foundation
+ 
+    This file is part of libgcj.
+ 
+ This software is copyrighted work licensed under the terms of the
+ Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
+ details.  */
+ 
+ 
+ #ifndef JAVA_SIGNAL_H
+ #define JAVA_SIGNAL_H 1
+ 
+ #include <signal.h>
+ #include <sys/syscall.h>
+ 
+ #define HANDLE_SEGV 1
+ 
+ #define SIGNAL_HANDLER(_name)	\
+ static void _Jv_##_name (int, siginfo_t *_sip, void *_p)
+ 
+ extern "C" 
+ {
+   struct kernel_sigaction 
+   {
+     void (*k_sa_sigaction)(int,siginfo_t *,void *);
+     unsigned long k_sa_flags;
+     void (*k_sa_restorer) (void);
+     sigset_t k_sa_mask;
+   };
+ }
+ 
+ #define MAKE_THROW_FRAME(_exception)					\
+ do									\
+ {									\
+   /* Advance the program counter so that it is after the start of the	\
+      instruction:  the x86_64 exception handler expects			\
+      the PC to point to the instruction after a call. */		\
+   struct ucontext *_uc = (struct ucontext *)_p;				\
+   struct sigcontext *_sc = (struct sigcontext *) &_uc->uc_mcontext;	\
+   _sc->rip += 2;							\
+ }									\
+ while (0)
+ 
+ #define RESTORE(name, syscall) RESTORE2 (name, syscall)
+ #define RESTORE2(name, syscall)			\
+ asm						\
+   (						\
+    ".align 16\n"				\
+    "__" #name ":\n"				\
+    "	movq $" #syscall ", %rax\n"		\
+    "	syscall\n"				\
+    );
+ 
+ /* The return code for realtime-signals.  */
+ RESTORE (restore_rt, __NR_rt_sigreturn)
+ static void restore_rt (void) asm ("__restore_rt");
+ 
+ #define INIT_SEGV						\
+ do								\
+   {								\
+     nullp = new java::lang::NullPointerException ();		\
+     struct kernel_sigaction act;				\
+     act.k_sa_sigaction = _Jv_catch_segv;			\
+     sigemptyset (&act.k_sa_mask);				\
+     act.k_sa_flags = SA_SIGINFO|0x4000000;			\
+     act.k_sa_restorer = restore_rt;				\
+     syscall (SYS_rt_sigaction, SIGSEGV, &act, NULL, _NSIG / 8);	\
+   }								\
+ while (0)  
+ 
+ /* We use syscall(SYS_rt_sigaction) in INIT_SEGV instead of
+  * sigaction() because on some systems the pthreads wrappers for
+  * signal handlers are not compiled with unwind information, so it's
+  * not possible to unwind through them.  This is a problem that will
+  * go away if all systems ever have pthreads libraries that are
+  * compiled with unwind info.  */
+ 
+ #endif /* JAVA_SIGNAL_H */
+   



More information about the Java-patches mailing list