From patchwork Thu Dec 8 19:16:33 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai Tietz X-Patchwork-Id: 130215 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 E5C691007D1 for ; Fri, 9 Dec 2011 06:16:50 +1100 (EST) Received: (qmail 1418 invoked by alias); 8 Dec 2011 19:16:48 -0000 Received: (qmail 1398 invoked by uid 22791); 8 Dec 2011 19:16:47 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, TW_CX X-Spam-Check-By: sourceware.org Received: from mail-qw0-f47.google.com (HELO mail-qw0-f47.google.com) (209.85.216.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 08 Dec 2011 19:16:33 +0000 Received: by qadb17 with SMTP id b17so822311qad.20 for ; Thu, 08 Dec 2011 11:16:33 -0800 (PST) MIME-Version: 1.0 Received: by 10.182.89.105 with SMTP id bn9mr930493obb.65.1323371793088; Thu, 08 Dec 2011 11:16:33 -0800 (PST) Received: by 10.182.154.65 with HTTP; Thu, 8 Dec 2011 11:16:33 -0800 (PST) Date: Thu, 8 Dec 2011 20:16:33 +0100 Message-ID: Subject: [patch PR libstdc++/51135]: Fix [4.7 Regression] SIGSEGV during exception cleanup on win32 From: Kai Tietz To: GCC Patches Cc: "libstdc++" X-IsSubscribed: yes 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 Hi, this bug was caused by change of default-calling-convention of __thiscall for class-member-functions on 32-bit IA windows target. Issue is that that destructor pointer used default __cdecl calling-convention instead. This patch fix that. As currently trunk is still broken for all SjLj targets (this clobber patch really clobbered things ...) and so for 32-bit Windows native too, it is necessary to disable - until this bug is fixed in compiler (PR/51117)- for the unwind-sjlj.c file in libgcc the option -fexceptions. ChangeLog 2011-12-08 Kai Tietz PR libstdc++/511135 * libsupc++/cxxabi.h (_GLIBCXX_DESTRUCTOR_CALLCONVENTION): New macro. (__cxa_throw): Use it for destructor-argument. * eh_throw.cc (__cxa_throw): Likewise. * unwind-cxx.h (__cxa_exception): Use for member exceptionDestructor the _GLIBCXX_DESTRUCTOR_CALLCONVENTION macro. Patch tested for i686-w64-mingw32, i686-pc-cygwin, x86_64-w64-mingw32, and x86_64-unknown-linux-gnu. Ok for apply? Regards, Kai Index: gcc/libstdc++-v3/libsupc++/cxxabi.h =================================================================== --- gcc.orig/libstdc++-v3/libsupc++/cxxabi.h +++ gcc/libstdc++-v3/libsupc++/cxxabi.h @@ -51,6 +51,16 @@ #include #include +// On 32-bit IA native windows target is the used calling-convention +// for class-member-functions of kind __thiscall. As destructor is +// also of kind class-member-function, we need to specify for this +// target proper calling-convention on destructor-function-pointer. +#if defined (__MINGW32__) && defined (__i386__) +#define _GLIBCXX_DESTRUCTOR_CALLCONVENTION __thiscall +#else +#define _GLIBCXX_DESTRUCTOR_CALLCONVENTION +#endif + #ifdef __cplusplus namespace __cxxabiv1 { @@ -596,7 +606,8 @@ namespace __cxxabiv1 // Throw the exception. void - __cxa_throw(void*, std::type_info*, void (*) (void *)) + __cxa_throw(void*, std::type_info*, + void (_GLIBCXX_DESTRUCTOR_CALLCONVENTION *) (void *)) __attribute__((__noreturn__)); // Used to implement exception handlers. Index: gcc/libstdc++-v3/libsupc++/eh_throw.cc =================================================================== --- gcc.orig/libstdc++-v3/libsupc++/eh_throw.cc +++ gcc/libstdc++-v3/libsupc++/eh_throw.cc @@ -59,7 +59,8 @@ __gxx_exception_cleanup (_Unwind_Reason_ extern "C" void __cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo, - void (*dest) (void *)) + void (_GLIBCXX_DESTRUCTOR_CALLCONVENTION *dest) + (void *)) { // Definitely a primary. __cxa_refcounted_exception *header Index: gcc/libstdc++-v3/libsupc++/unwind-cxx.h =================================================================== --- gcc.orig/libstdc++-v3/libsupc++/unwind-cxx.h +++ gcc/libstdc++-v3/libsupc++/unwind-cxx.h @@ -51,7 +51,7 @@ struct __cxa_exception { // Manage the exception object itself. std::type_info *exceptionType; - void (*exceptionDestructor)(void *); + void (_GLIBCXX_DESTRUCTOR_CALLCONVENTION *exceptionDestructor)(void *); // The C++ standard has entertaining rules wrt calling set_terminate // and set_unexpected in the middle of the exception cleanup process.