[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