Hello! This problem was uncovered by a libgo testsuite, where SIGSEGV handler in html/template test resulted in
Program received signal SIGSEGV, Segmentation fault. libgo_html.template.Error.pN25_libgo_html.template.Error (e=0x0) at error.go:185 185 if e.Line != 0 { While x86_64 recovers from the exception, alpha doesn't, resulting in: (gdb) c Continuing. Program received signal SIGILL, Illegal instruction. 0x0000020000b6617c in runtime_m0 () from ./libgo.so.0 The problem was that signal handler in frame 5 wasn't marked as such, so unwinder assigned FDE of frame #5 to frame #6. (gdb) bt #0 _Unwind_RaiseException (exc=0xf840453300) at ../../../gcc-svn/trunk/libgcc/unwind.inc:135 #1 0x0000020000559a8c in __go_unwind_stack () at ../../../gcc-svn/trunk/libgo/runtime/go-unwind.c:175 #2 0x0000020000556d44 in __go_panic (arg=...) at ../../../gcc-svn/trunk/libgo/runtime/go-panic.c:85 #3 0x0000020000564be8 in runtime_panicstring (s=0x200007fb737 "invalid memory address or nil pointer dereference") at ../../../gcc-svn/trunk/libgo/runtime/runtime.c:83 #4 0x000002000055875c in sighandler (sig=<optimized out>) at ../../../gcc-svn/trunk/libgo/runtime/go-signal.c:183 #5 0x0000020002c82620 in ?? () from /lib/libc.so.6.1 #6 0x000000012001c85c in libgo_html.template.Error.pN25_libgo_html.template.Error (e=0x0) at error.go:184 #7 0x0000020000580cc4 in libgo_fmt.fmt.handleMethods.pN16_libgo_fmt.fmt.pp (p=0xf840214f00, verb=<optimized out>, plus=<optimized out>, goSyntax=<optimized out>, depth=<optimized out>) at ../../../gcc-svn/trunk/libgo/go/fmt/print.go:648 #8 0x000002000057efc8 in libgo_fmt.fmt.printField.pN16_libgo_fmt.fmt.pp (p=0xf840214f00, field=..., verb=<optimized out>, plus=<optimized out>, goSyntax=<optimized out>, depth=0) at ../../../gcc-svn/trunk/libgo/go/fmt/print.go:687 #9 0x000002000057fde8 in libgo_fmt.fmt.doPrintf.pN16_libgo_fmt.fmt.pp (p=0xf840214f00, format=..., a=...) at ../../../gcc-svn/trunk/libgo/go/fmt/print.go:1045 #10 0x00000200005811ac in libgo_fmt.fmt.Sprintf (format=..., a=...) at ../../../gcc-svn/trunk/libgo/go/fmt/print.go:194 Attached patch that introduces MD_FROB_UPDATE_CONTEXT fixes this failure. 2011-12-19 Uros Bizjak <ubiz...@gmail.com> * config/alpha/linux-unwind.h: Update copyright years. (MD_FROB_UPDATE_CONTEXT): New define. (alpha_frob_update_context): New function. Patch was bootstrapped and regression tested on alphaev68-pc-linux-gnu with all languages + go. OK for mainline? What about other release branches? Uros.
Index: config/alpha/linux-unwind.h =================================================================== --- config/alpha/linux-unwind.h (revision 182430) +++ config/alpha/linux-unwind.h (working copy) @@ -1,5 +1,5 @@ /* DWARF2 EH unwinding support for Alpha Linux. - Copyright (C) 2004, 2005, 2009 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2009, 2011 Free Software Foundation, Inc. This file is part of GCC. @@ -78,3 +80,20 @@ return _URC_NO_REASON; } + +#define MD_FROB_UPDATE_CONTEXT alpha_frob_update_context + +/* Fix up for kernels that have vDSO, but don't have S flag in it. */ + +static void +alpha_frob_update_context (struct _Unwind_Context *context, + _Unwind_FrameState *fs ATTRIBUTE_UNUSED) +{ + unsigned int *pc = context->ra; + + if (pc[0] == 0x47fe0410 /* mov $30,$16 */ + && pc[2] == 0x00000083 /* callsys */ + && (pc[1] == 0x201f0067 /* lda $0,NR_sigreturn */ + || pc[1] == 0x201f015f)) /* lda $0,NR_rt_sigreturn */ + _Unwind_SetSignalFrame (context, 1); +}