File pr26208.patch of Package gcc41
2006-03-03 Jakub Jelinek <jakub@redhat.com>
* config/arm/unwind-arm.h (_Unwind_GetIPInfo): Fix pasto.
2006-02-27 Jakub Jelinek <jakub@redhat.com>
PR other/26208
* unwind-dw2.c (struct _Unwind_Context): Add signal_frame field.
(extract_cie_info): Handle S flag in augmentation string.
(execute_cfa_program): If context->signal_frame, execute also
fs->pc == context->ra instructions.
(uw_frame_state_for): If context->signal_frame, don't subtract one
from context->ra to find FDE.
(uw_update_context_1): Set context->signal_frame to
fs->signal_frame.
(_Unwind_GetIPInfo): New function.
* unwind-dw2.h (_Unwind_FrameState): Add signal_frame field.
* unwind-c.c (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead
of _Unwind_GetIP.
* unwind-sjlj.c (_Unwind_GetIPInfo): New function.
* unwind-generic.h (_Unwind_GetIPInfo): New prototype.
* unwind-compat.c (_Unwind_GetIPInfo): New function.
* libgcc-std.ver (_Unwind_GetIPInfo): Export @@GCC_4.2.0.
* config/ia64/unwind-ia64.c (_Unwind_GetIPInfo): New function.
* config/arm/unwind-arm.h (_Unwind_GetIPInfo): Define.
* config/i386/linux-unwind.h (x86_fallback_frame_state,
x86_64_fallback_frame_state): Set fs->signal_frame.
* config/rs6000/linux-unwind.h (ppc_fallback_frame_state): Likewise.
(MD_FROB_UPDATE_CONTEXT): Define unconditionally.
(frob_update_context): Likewise. Workaround missing S flag in
Linux 2.6.12 - 2.6.16 kernel vDSOs.
* config/s390/linux-unwind.h (s390_fallback_frame_state): Likewise.
Remove the psw_addr + 1 hack.
2006-02-27 Jakub Jelinek <jakub@redhat.com>
PR other/26208
* libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Use
_Unwind_GetIPInfo instead of _Unwind_GetIP.
2006-02-27 Jakub Jelinek <jakub@redhat.com>
PR other/26208
* exception.cc (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead
of _Unwind_GetIP.
* include/i386-signal.h (MAKE_THROW_FRAME): Change into empty macro.
(HANDLE_DIVIDE_OVERFLOW): Don't adjust _res->eip if falling through
to throw.
* include/x86_64-signal.h (MAKE_THROW_FRAME): Change into empty
macro.
* include/powerpc-signal.h (MAKE_THROW_FRAME): Change into empty
macro.
Index: gcc/unwind-compat.c
===================================================================
*** gcc/unwind-compat.c (revision 117108)
--- gcc/unwind-compat.c (working copy)
***************
*** 1,5 ****
/* Backward compatibility unwind routines.
! Copyright (C) 2004, 2005
Free Software Foundation, Inc.
This file is part of GCC.
--- 1,5 ----
/* Backward compatibility unwind routines.
! Copyright (C) 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GCC.
*************** _Unwind_GetIP (struct _Unwind_Context *c
*** 136,141 ****
--- 136,148 ----
}
symver (_Unwind_GetIP, GCC_3.0);
+ _Unwind_Ptr
+ _Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
+ {
+ *ip_before_insn = 0;
+ return __libunwind_Unwind_GetIP (context);
+ }
+
extern void *__libunwind_Unwind_GetLanguageSpecificData
(struct _Unwind_Context *);
Index: gcc/unwind-dw2.c
===================================================================
*** gcc/unwind-dw2.c (revision 117108)
--- gcc/unwind-dw2.c (working copy)
***************
*** 1,5 ****
/* DWARF2 exception handling and frame unwind runtime interface routines.
! Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This file is part of GCC.
--- 1,5 ----
/* DWARF2 exception handling and frame unwind runtime interface routines.
! Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GCC.
*************** struct _Unwind_Context
*** 71,76 ****
--- 71,77 ----
void *lsda;
struct dwarf_eh_bases bases;
_Unwind_Word args_size;
+ char signal_frame;
};
/* Byte size of every register managed by these routines. */
*************** _Unwind_GetIP (struct _Unwind_Context *c
*** 207,212 ****
--- 208,223 ----
return (_Unwind_Ptr) context->ra;
}
+ /* Retrieve the return address and flag whether that IP is before
+ or after first not yet fully executed instruction. */
+
+ inline _Unwind_Ptr
+ _Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
+ {
+ *ip_before_insn = context->signal_frame != 0;
+ return (_Unwind_Ptr) context->ra;
+ }
+
/* Overwrite the return address for CONTEXT with VAL. */
inline void
*************** extract_cie_info (const struct dwarf_cie
*** 327,332 ****
--- 338,350 ----
aug += 1;
}
+ /* "S" indicates a signal frame. */
+ else if (aug[0] == 'S')
+ {
+ fs->signal_frame = 1;
+ aug += 1;
+ }
+
/* Otherwise we have an unknown augmentation string.
Bail unless we saw a 'z' prefix. */
else
*************** execute_cfa_program (const unsigned char
*** 761,768 ****
a different stack configuration that we are not interested in. We
assume that the call itself is unwind info-neutral; if not, or if
there are delay instructions that adjust the stack, these must be
! reflected at the point immediately before the call insn. */
! while (insn_ptr < insn_end && fs->pc < context->ra)
{
unsigned char insn = *insn_ptr++;
_Unwind_Word reg, utmp;
--- 779,788 ----
a different stack configuration that we are not interested in. We
assume that the call itself is unwind info-neutral; if not, or if
there are delay instructions that adjust the stack, these must be
! reflected at the point immediately before the call insn.
! In signal frames, return address is after last completed instruction,
! so we add 1 to return address to make the comparison <=. */
! while (insn_ptr < insn_end && fs->pc < context->ra + context->signal_frame)
{
unsigned char insn = *insn_ptr++;
_Unwind_Word reg, utmp;
*************** uw_frame_state_for (struct _Unwind_Conte
*** 974,980 ****
if (context->ra == 0)
return _URC_END_OF_STACK;
! fde = _Unwind_Find_FDE (context->ra - 1, &context->bases);
if (fde == NULL)
{
#ifdef MD_FALLBACK_FRAME_STATE_FOR
--- 994,1001 ----
if (context->ra == 0)
return _URC_END_OF_STACK;
! fde = _Unwind_Find_FDE (context->ra + context->signal_frame - 1,
! &context->bases);
if (fde == NULL)
{
#ifdef MD_FALLBACK_FRAME_STATE_FOR
*************** uw_update_context_1 (struct _Unwind_Cont
*** 1192,1197 ****
--- 1213,1220 ----
break;
}
+ context->signal_frame = fs->signal_frame;
+
#ifdef MD_FROB_UPDATE_CONTEXT
MD_FROB_UPDATE_CONTEXT (context, fs);
#endif
Index: gcc/unwind-dw2.h
===================================================================
*** gcc/unwind-dw2.h (revision 117108)
--- gcc/unwind-dw2.h (working copy)
*************** typedef struct
*** 83,88 ****
--- 83,89 ----
unsigned char fde_encoding;
unsigned char lsda_encoding;
unsigned char saw_z;
+ unsigned char signal_frame;
void *eh_ptr;
} _Unwind_FrameState;
Index: gcc/unwind-c.c
===================================================================
*** gcc/unwind-c.c (revision 117108)
--- gcc/unwind-c.c (working copy)
*************** PERSONALITY_FUNCTION (int version,
*** 127,132 ****
--- 127,133 ----
lsda_header_info info;
const unsigned char *language_specific_data, *p, *action_record;
_Unwind_Ptr landing_pad, ip;
+ int ip_before_insn = 0;
#ifdef __ARM_EABI_UNWINDER__
if ((state & _US_ACTION_MASK) != _US_UNWIND_FRAME_STARTING)
*************** PERSONALITY_FUNCTION (int version,
*** 156,162 ****
/* Parse the LSDA header. */
p = parse_lsda_header (context, language_specific_data, &info);
! ip = _Unwind_GetIP (context) - 1;
landing_pad = 0;
#ifdef __USING_SJLJ_EXCEPTIONS__
--- 157,165 ----
/* Parse the LSDA header. */
p = parse_lsda_header (context, language_specific_data, &info);
! ip = _Unwind_GetIPInfo (context, &ip_before_insn);
! if (! ip_before_insn)
! --ip;
landing_pad = 0;
#ifdef __USING_SJLJ_EXCEPTIONS__
Index: gcc/unwind-sjlj.c
===================================================================
*** gcc/unwind-sjlj.c (revision 117108)
--- gcc/unwind-sjlj.c (working copy)
*************** _Unwind_GetIP (struct _Unwind_Context *c
*** 214,219 ****
--- 214,226 ----
return context->fc->call_site + 1;
}
+ _Unwind_Ptr
+ _Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
+ {
+ *ip_before_insn = 0;
+ return context->fc->call_site + 1;
+ }
+
/* Set the return landing pad index in CONTEXT. */
void
Index: gcc/unwind-generic.h
===================================================================
*** gcc/unwind-generic.h (revision 117108)
--- gcc/unwind-generic.h (working copy)
***************
*** 1,5 ****
/* Exception handling and frame unwind runtime interface routines.
! Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
This file is part of GCC.
--- 1,5 ----
/* Exception handling and frame unwind runtime interface routines.
! Copyright (C) 2001, 2003, 2004, 2006 Free Software Foundation, Inc.
This file is part of GCC.
*************** extern _Unwind_Word _Unwind_GetGR (struc
*** 155,160 ****
--- 155,161 ----
extern void _Unwind_SetGR (struct _Unwind_Context *, int, _Unwind_Word);
extern _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *);
+ extern _Unwind_Ptr _Unwind_GetIPInfo (struct _Unwind_Context *, int *);
extern void _Unwind_SetIP (struct _Unwind_Context *, _Unwind_Ptr);
/* @@@ Retrieve the CFA of the given context. */
Index: gcc/config/s390/linux-unwind.h
===================================================================
*** gcc/config/s390/linux-unwind.h (revision 117108)
--- gcc/config/s390/linux-unwind.h (working copy)
***************
*** 1,5 ****
/* DWARF2 EH unwinding support for S/390 Linux.
! Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC.
--- 1,5 ----
/* DWARF2 EH unwinding support for S/390 Linux.
! Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GCC.
*************** s390_fallback_frame_state (struct _Unwin
*** 113,139 ****
fs->regs.reg[32].how = REG_SAVED_OFFSET;
fs->regs.reg[32].loc.offset = (long)®s->psw_addr - new_cfa;
fs->retaddr_column = 32;
!
! /* If we got a SIGSEGV or a SIGBUS, the PSW address points *to*
! the faulting instruction, not after it. This causes the logic
! in unwind-dw2.c that decrements the RA to determine the correct
! CFI region to get confused. To fix that, we *increment* the RA
! here in that case. Note that we cannot modify the RA in place,
! and the frame state wants a *pointer*, not a value; thus we put
! the modified RA value into the unused register 33 slot of FS and
! have the register 32 save address point to that slot.
!
! Unfortunately, for regular signals on old kernels, we don't know
! the signal number. We default to not fiddling with the RA;
! that can fail in rare cases. Upgrade your kernel. */
!
! if (signo && (*signo == 11 || *signo == 7))
! {
! fs->regs.reg[33].loc.exp =
! (unsigned char *)regs->psw_addr + 1;
! fs->regs.reg[32].loc.offset =
! (long)&fs->regs.reg[33].loc.exp - new_cfa;
! }
return _URC_NO_REASON;
}
--- 113,123 ----
fs->regs.reg[32].how = REG_SAVED_OFFSET;
fs->regs.reg[32].loc.offset = (long)®s->psw_addr - new_cfa;
fs->retaddr_column = 32;
! /* SIGILL, SIGFPE and SIGTRAP are delivered with psw_addr
! after the faulting instruction rather than before it.
! Don't set FS->signal_frame in that case. */
! if (!signo || (*signo != 4 && *signo != 5 && *signo != 8))
! fs->signal_frame = 1;
return _URC_NO_REASON;
}
Index: gcc/config/ia64/unwind-ia64.c
===================================================================
*** gcc/config/ia64/unwind-ia64.c (revision 117108)
--- gcc/config/ia64/unwind-ia64.c (working copy)
*************** _Unwind_GetIP (struct _Unwind_Context *c
*** 1704,1709 ****
--- 1704,1716 ----
return context->rp;
}
+ inline _Unwind_Ptr
+ _Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
+ {
+ *ip_before_insn = 0;
+ return context->rp;
+ }
+
/* Overwrite the return address for CONTEXT with VAL. */
inline void
Index: gcc/config/i386/linux-unwind.h
===================================================================
*** gcc/config/i386/linux-unwind.h (revision 117108)
--- gcc/config/i386/linux-unwind.h (working copy)
***************
*** 1,5 ****
/* DWARF2 EH unwinding support for AMD x86-64 and x86.
! Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC.
--- 1,5 ----
/* DWARF2 EH unwinding support for AMD x86-64 and x86.
! Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GCC.
*************** x86_64_fallback_frame_state (struct _Unw
*** 100,105 ****
--- 100,106 ----
fs->regs.reg[16].how = REG_SAVED_OFFSET;
fs->regs.reg[16].loc.offset = (long)&sc->rip - new_cfa;
fs->retaddr_column = 16;
+ fs->signal_frame = 1;
return _URC_NO_REASON;
}
*************** x86_fallback_frame_state (struct _Unwind
*** 172,177 ****
--- 173,179 ----
fs->regs.reg[8].how = REG_SAVED_OFFSET;
fs->regs.reg[8].loc.offset = (long)&sc->REG_NAME(eip) - new_cfa;
fs->retaddr_column = 8;
+ fs->signal_frame = 1;
return _URC_NO_REASON;
}
#endif /* not glibc 2.0 */
Index: gcc/config/rs6000/linux-unwind.h
===================================================================
*** gcc/config/rs6000/linux-unwind.h (revision 117108)
--- gcc/config/rs6000/linux-unwind.h (working copy)
***************
*** 1,5 ****
/* DWARF2 EH unwinding support for PowerPC and PowerPC64 Linux.
! Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC.
--- 1,5 ----
/* DWARF2 EH unwinding support for PowerPC and PowerPC64 Linux.
! Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GCC.
*************** struct gcc_ucontext
*** 89,114 ****
enum { SIGNAL_FRAMESIZE = 128 };
- /* If the current unwind info (FS) does not contain explicit info
- saving R2, then we have to do a minor amount of code reading to
- figure out if it was saved. The big problem here is that the
- code that does the save/restore is generated by the linker, so
- we have no good way to determine at compile time what to do. */
-
- #define MD_FROB_UPDATE_CONTEXT frob_update_context
-
- static void
- frob_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
- {
- if (fs->regs.reg[2].how == REG_UNSAVED)
- {
- unsigned int *insn
- = (unsigned int *) _Unwind_GetGR (context, LINK_REGISTER_REGNUM);
- if (*insn == 0xE8410028)
- _Unwind_SetGRPtr (context, 2, context->cfa + 40);
- }
- }
-
/* If PC is at a sigreturn trampoline, return a pointer to the
regs. Otherwise return NULL. */
--- 89,94 ----
*************** ppc_fallback_frame_state (struct _Unwind
*** 272,277 ****
--- 252,258 ----
fs->regs.reg[ARG_POINTER_REGNUM].how = REG_SAVED_OFFSET;
fs->regs.reg[ARG_POINTER_REGNUM].loc.offset = (long) ®s->nip - new_cfa;
fs->retaddr_column = ARG_POINTER_REGNUM;
+ fs->signal_frame = 1;
if (hwcap == 0)
{
*************** ppc_fallback_frame_state (struct _Unwind
*** 322,324 ****
--- 303,348 ----
return _URC_NO_REASON;
}
+
+ #define MD_FROB_UPDATE_CONTEXT frob_update_context
+
+ static void
+ frob_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
+ {
+ const unsigned int *pc = (const unsigned int *) context->ra;
+
+ /* Fix up for 2.6.12 - 2.6.16 Linux kernels that have vDSO, but don't
+ have S flag in it. */
+ #ifdef __powerpc64__
+ /* addi r1, r1, 128; li r0, 0x0077; sc (sigreturn) */
+ /* addi r1, r1, 128; li r0, 0x00AC; sc (rt_sigreturn) */
+ if (pc[0] == 0x38210000 + SIGNAL_FRAMESIZE
+ && (pc[1] == 0x38000077 || pc[1] == 0x380000AC)
+ && pc[2] == 0x44000002)
+ context->signal_frame = 1;
+ #else
+ /* li r0, 0x7777; sc (sigreturn old) */
+ /* li r0, 0x0077; sc (sigreturn new) */
+ /* li r0, 0x6666; sc (rt_sigreturn old) */
+ /* li r0, 0x00AC; sc (rt_sigreturn new) */
+ if ((pc[0] == 0x38007777 || pc[0] == 0x38000077
+ || pc[0] == 0x38006666 || pc[0] == 0x380000AC)
+ && pc[1] == 0x44000002)
+ context->signal_frame = 1;
+ #endif
+
+ #ifdef __powerpc64__
+ if (fs->regs.reg[2].how == REG_UNSAVED)
+ {
+ /* If the current unwind info (FS) does not contain explicit info
+ saving R2, then we have to do a minor amount of code reading to
+ figure out if it was saved. The big problem here is that the
+ code that does the save/restore is generated by the linker, so
+ we have no good way to determine at compile time what to do. */
+ unsigned int *insn
+ = (unsigned int *) _Unwind_GetGR (context, LINK_REGISTER_REGNUM);
+ if (*insn == 0xE8410028)
+ _Unwind_SetGRPtr (context, 2, context->cfa + 40);
+ }
+ #endif
+ }
Index: gcc/config/arm/unwind-arm.h
===================================================================
*** gcc/config/arm/unwind-arm.h (revision 117108)
--- gcc/config/arm/unwind-arm.h (working copy)
***************
*** 1,5 ****
/* Header file for the ARM EABI unwinder
! Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Paul Brook
This file is free software; you can redistribute it and/or modify it
--- 1,5 ----
/* Header file for the ARM EABI unwinder
! Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Paul Brook
This file is free software; you can redistribute it and/or modify it
*************** extern "C" {
*** 250,255 ****
--- 250,258 ----
#define _Unwind_GetIP(context) \
(_Unwind_GetGR (context, 15) & ~(_Unwind_Word)1)
+ #define _Unwind_GetIPInfo(context, ip_before_insn) \
+ (*ip_before_insn = 0, _Unwind_GetGR (context, 15) & ~(_Unwind_Word)1)
+
static inline void
_Unwind_SetGR (_Unwind_Context *context, int regno, _Unwind_Word val)
{
Index: gcc/libgcc-std.ver
===================================================================
*** gcc/libgcc-std.ver (revision 117108)
--- gcc/libgcc-std.ver (working copy)
*************** GCC_4.0.0 {
*** 256,258 ****
--- 256,263 ----
%inherit GCC_4.1.0 GCC_4.0.0
GCC_4.1.0 {
}
+
+ %inherit GCC_4.2.0 GCC_4.1.0
+ GCC_4.2.0 {
+ _Unwind_GetIPInfo
+ }
Index: libstdc++-v3/libsupc++/eh_personality.cc
===================================================================
*** libstdc++-v3/libsupc++/eh_personality.cc (revision 117108)
--- libstdc++-v3/libsupc++/eh_personality.cc (working copy)
*************** PERSONALITY_FUNCTION (int version,
*** 365,370 ****
--- 365,371 ----
int handler_switch_value;
void* thrown_ptr = ue_header + 1;
bool foreign_exception;
+ int ip_before_insn = 0;
#ifdef __ARM_EABI_UNWINDER__
_Unwind_Action actions;
*************** PERSONALITY_FUNCTION (int version,
*** 431,437 ****
// Parse the LSDA header.
p = parse_lsda_header (context, language_specific_data, &info);
info.ttype_base = base_of_encoded_value (info.ttype_encoding, context);
! ip = _Unwind_GetIP (context) - 1;
landing_pad = 0;
action_record = 0;
handler_switch_value = 0;
--- 432,440 ----
// Parse the LSDA header.
p = parse_lsda_header (context, language_specific_data, &info);
info.ttype_base = base_of_encoded_value (info.ttype_encoding, context);
! ip = _Unwind_GetIPInfo (context, &ip_before_insn);
! if (! ip_before_insn)
! --ip;
landing_pad = 0;
action_record = 0;
handler_switch_value = 0;
Index: libjava/exception.cc
===================================================================
*** libjava/exception.cc (revision 117108)
--- libjava/exception.cc (working copy)
***************
*** 1,6 ****
// Functions for Exception Support for Java.
! /* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation
This file is part of libgcj.
--- 1,6 ----
// Functions for Exception Support for Java.
! /* Copyright (C) 1998, 1999, 2001, 2002, 2006 Free Software Foundation
This file is part of libgcj.
*************** PERSONALITY_FUNCTION (int version,
*** 197,202 ****
--- 197,203 ----
int handler_switch_value;
bool saw_cleanup;
bool saw_handler;
+ int ip_before_insn = 0;
// Interface version check.
*************** PERSONALITY_FUNCTION (int version,
*** 212,221 ****
goto install_context;
}
! // FIXME: In Phase 1, record _Unwind_GetIP in xh->obj as a part of
// the stack trace for this exception. This will only collect Java
// frames, but perhaps that is acceptable.
! // FIXME2: _Unwind_GetIP is nonsensical for SJLJ, being a call-site
// index instead of a PC value. We could perhaps arrange for
// _Unwind_GetRegionStart to return context->fc->jbuf[1], which
// is the address of the handler label for __builtin_longjmp, but
--- 213,222 ----
goto install_context;
}
! // FIXME: In Phase 1, record _Unwind_GetIPInfo in xh->obj as a part of
// the stack trace for this exception. This will only collect Java
// frames, but perhaps that is acceptable.
! // FIXME2: _Unwind_GetIPInfo is nonsensical for SJLJ, being a call-site
// index instead of a PC value. We could perhaps arrange for
// _Unwind_GetRegionStart to return context->fc->jbuf[1], which
// is the address of the handler label for __builtin_longjmp, but
*************** PERSONALITY_FUNCTION (int version,
*** 230,236 ****
// Parse the LSDA header.
p = parse_lsda_header (context, language_specific_data, &info);
! ip = _Unwind_GetIP (context) - 1;
landing_pad = 0;
action_record = 0;
handler_switch_value = 0;
--- 231,239 ----
// Parse the LSDA header.
p = parse_lsda_header (context, language_specific_data, &info);
! ip = _Unwind_GetIPInfo (context, &ip_before_insn);
! if (! ip_before_insn)
! --ip;
landing_pad = 0;
action_record = 0;
handler_switch_value = 0;
Index: libjava/include/i386-signal.h
===================================================================
*** libjava/include/i386-signal.h (revision 117108)
--- libjava/include/i386-signal.h (working copy)
***************
*** 1,7 ****
// i386-signal.h - Catch runtime signals and turn them into exceptions
// on an i386 based Linux system.
! /* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation
This file is part of libgcj.
--- 1,7 ----
// i386-signal.h - Catch runtime signals and turn them into exceptions
// on an i386 based Linux system.
! /* Copyright (C) 1998, 1999, 2001, 2002, 2006 Free Software Foundation
This file is part of libgcj.
*************** details. */
*** 22,40 ****
#define SIGNAL_HANDLER(_name) \
static void _name (int _dummy __attribute__ ((__unused__)))
! #define MAKE_THROW_FRAME(_exception) \
! do \
! { \
! void **_p = (void **)&_dummy; \
! volatile struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p; \
! \
! /* 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. */ \
! _regs->eip += 2; \
! \
! } \
! while (0)
#define HANDLE_DIVIDE_OVERFLOW \
do \
--- 22,28 ----
#define SIGNAL_HANDLER(_name) \
static void _name (int _dummy __attribute__ ((__unused__)))
! #define MAKE_THROW_FRAME(_exception)
#define HANDLE_DIVIDE_OVERFLOW \
do \
*************** do \
*** 91,104 ****
_regs->eip = (unsigned long)_eip; \
return; \
} \
- 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. */ \
- _regs->eip += 2; \
- } \
} \
} \
while (0)
--- 79,84 ----
Index: libjava/include/powerpc-signal.h
===================================================================
*** libjava/include/powerpc-signal.h (revision 117108)
--- libjava/include/powerpc-signal.h (working copy)
***************
*** 1,7 ****
// powerpc-signal.h - Catch runtime signals and turn them into exceptions
// on a powerpc based Linux system.
! /* Copyright (C) 2003 Free Software Foundation
This file is part of libgcj.
--- 1,7 ----
// powerpc-signal.h - Catch runtime signals and turn them into exceptions
// on a powerpc based Linux system.
! /* Copyright (C) 2003, 2006 Free Software Foundation
This file is part of libgcj.
*************** details. */
*** 22,39 ****
#define SIGNAL_HANDLER(_name) \
static void _name (int /* _signal */, struct sigcontext *_sc)
! /* PPC 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. */
- #define MAKE_THROW_FRAME(_exception) \
- do \
- { \
- _sc->regs->nip += 4; \
- } \
- while (0)
-
/* For an explanation why we cannot simply use sigaction to
install the handlers, see i386-signal.h. */
--- 22,33 ----
#define SIGNAL_HANDLER(_name) \
static void _name (int /* _signal */, struct sigcontext *_sc)
! /* MD_FALBACK_FRAME_STATE_FOR takes care of special casing PC
! before the faulting instruction, so we don't need to do anything
! here. */
!
! #define MAKE_THROW_FRAME(_exception)
/* For an explanation why we cannot simply use sigaction to
install the handlers, see i386-signal.h. */
Index: libjava/include/x86_64-signal.h
===================================================================
*** libjava/include/x86_64-signal.h (revision 117108)
--- libjava/include/x86_64-signal.h (working copy)
***************
*** 1,7 ****
// 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.
--- 1,7 ----
// x86_64-signal.h - Catch runtime signals and turn them into exceptions
// on an x86_64 based GNU/Linux system.
! /* Copyright (C) 2003, 2006 Free Software Foundation
This file is part of libgcj.
*************** extern "C"
*** 34,50 ****
};
}
! #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; \
! volatile struct sigcontext *_sc = (struct sigcontext *) &_uc->uc_mcontext; \
! _sc->rip += 2; \
! } \
! while (0)
#define RESTORE(name, syscall) RESTORE2 (name, syscall)
#define RESTORE2(name, syscall) \
--- 34,40 ----
};
}
! #define MAKE_THROW_FRAME(_exception)
#define RESTORE(name, syscall) RESTORE2 (name, syscall)
#define RESTORE2(name, syscall) \