OSDN Git Service

1999-07-07 Andrew Haley <aph@cygnus.com>
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Jul 1999 09:09:39 +0000 (09:09 +0000)
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Jul 1999 09:09:39 +0000 (09:09 +0000)
        * include/i386-signal.h (MAKE_THROW_FRAME): Advance EIP by two
bytes to make it point after the instruction where the trap
occurred.
(HANDLE_DIVIDE_OVERFLOW): Ditto.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27989 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/include/i386-signal.h

index 51a94f9..ddb66be 100644 (file)
@@ -33,6 +33,11 @@ do                                                                   \
   register unsigned long _ebp = _regs->ebp;                            \
   register unsigned char *_eip = (unsigned char *)_regs->eip;          \
                                                                        \
+  /* Advance the program counter so that it is after the start of the  \
+     instruction:  the x86 exception handler expects                   \
+     the PC to point to the instruction after a call. */               \
+  _eip += 2;                                                           \
+                                                                       \
   asm volatile ("mov %0, (%%ebp); mov %1, 4(%%ebp)"                    \
                : : "r"(_ebp), "r"(_eip));                              \
 }                                                                      \
@@ -57,7 +62,7 @@ do                                                                    \
    * As the instructions are variable length it is necessary to do a   \
    * little calculation to figure out where the following instruction  \
    * actually is.                                                      \
-                                                                       \
+                                                                       \
    */                                                                  \
                                                                        \
   if (_eip[0] == 0xf7)                                                 \
@@ -99,6 +104,14 @@ do                                                                  \
          _eip = (unsigned char *)_ebp[1];                              \
          _ebp = (unsigned long *)_ebp[0];                              \
        }                                                               \
+      else                                                             \
+       {                                                               \
+         /* Advance the program counter so that it is after the start  \
+            of the instruction: this is because the x86 exception      \
+            handler expects the PC to point to the instruction after a \
+            call. */                                                   \
+         _eip += 2;                                                    \
+       }                                                               \
     }                                                                  \
                                                                        \
   asm volatile ("mov %0, (%%ebp); mov %1, 4(%%ebp)"                    \
@@ -118,9 +131,9 @@ do                                                          \
   }                                                            \
 while (0)  
 
-#define INIT_FPE                                                \
+#define INIT_FPE                                               \
 do                                                             \
-  {                                                            \
+  {                                                            \
     arithexception = new java::lang::ArithmeticException       \
       (JvNewStringLatin1 ("/ by zero"));                       \
     struct sigaction act;                                      \