Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:11.4
gcc41
pr26208.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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) \
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor