[PATCH, alpha]: Introduce alpha_frob_update_context
Uros Bizjak
ubizjak@gmail.com
Mon Dec 19 22:18:00 GMT 2011
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 <ubizjak@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.
-------------- next part --------------
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);
+}
More information about the Gcc-patches
mailing list