From patchwork Mon Dec 19 22:14:02 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uros Bizjak X-Patchwork-Id: 132327 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 8EB60B6FFC for ; Tue, 20 Dec 2011 09:14:46 +1100 (EST) Received: (qmail 1869 invoked by alias); 19 Dec 2011 22:14:43 -0000 Received: (qmail 1846 invoked by uid 22791); 19 Dec 2011 22:14:41 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, TW_ZJ X-Spam-Check-By: sourceware.org Received: from mail-gy0-f175.google.com (HELO mail-gy0-f175.google.com) (209.85.160.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 19 Dec 2011 22:14:03 +0000 Received: by ghrr17 with SMTP id r17so2149965ghr.20 for ; Mon, 19 Dec 2011 14:14:02 -0800 (PST) MIME-Version: 1.0 Received: by 10.236.144.227 with SMTP id n63mr16930120yhj.131.1324332842865; Mon, 19 Dec 2011 14:14:02 -0800 (PST) Received: by 10.147.133.6 with HTTP; Mon, 19 Dec 2011 14:14:02 -0800 (PST) Date: Mon, 19 Dec 2011 23:14:02 +0100 Message-ID: Subject: [PATCH, alpha]: Introduce alpha_frob_update_context From: Uros Bizjak To: gcc-patches@gcc.gnu.org Cc: Richard Henderson , Ian Lance Taylor , Rainer Orth Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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=) 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=, plus=, goSyntax=, depth=) 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=, plus=, goSyntax=, 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 * 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); +}