From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22418 invoked by alias); 8 Jan 2015 20:51:37 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 22406 invoked by uid 89); 8 Jan 2015 20:51:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_50,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: smtp.fgznet.ch Received: from mail.fgznet.ch (HELO smtp.fgznet.ch) (81.92.96.47) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Thu, 08 Jan 2015 20:51:30 +0000 Received: from [192.168.225.11] (dhclient-91-190-14-19.flashcable.ch [91.190.14.19]) by smtp.fgznet.ch (8.13.8/8.13.8/Submit_SMTPAUTH) with ESMTP id t08KpLBG042283; Thu, 8 Jan 2015 21:51:24 +0100 (CET) (envelope-from andreast-list@fgznet.ch) Message-ID: <54AEEDCE.8020302@fgznet.ch> Date: Thu, 08 Jan 2015 20:51:00 -0000 From: Andreas Tobler User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-Version: 1.0 To: Richard Earnshaw , GCC Patches , "ramana.gcc@googlemail.com" Subject: Re: [PATCH][ARM] FreeBSD ARM support, EABI, v3 References: <54A1A0FB.60407@fgznet.ch> <54AEAFF5.6050008@arm.com> In-Reply-To: <54AEAFF5.6050008@arm.com> Content-Type: multipart/mixed; boundary="------------000907040908010407010701" X-IsSubscribed: yes X-SW-Source: 2015-01/txt/msg00413.txt.bz2 This is a multi-part message in MIME format. --------------000907040908010407010701 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1756 On 08.01.15 17:27, Richard Earnshaw wrote: > On 29/12/14 18:44, Andreas Tobler wrote: >> All, >> >> here is the third attempt to support ARM with FreeBSD. >> >> In the meantime we found another issue in the unwinder where I had to >> adapt some stuff. >> >> The unwind_phase2_forced function in libgcc calls a stop_fn function. >> This stop_fn is in FreeBSD's libthr implementation and is called >> thread_unwind_stop. This thread_unwind_stop is a generic function used >> on all FreeBSD archs. >> >> The issue is now that this thread_unwind_stop expects a double int for >> the exception_class, like on every other arch. For ARM EABI this >> exception_class is an array of char which is passed in one register as >> pointer vs. two registers for a double int. >> >> To solve this issue we defined the exception_class as double integer for >> FreeBSD. >> >> This adaptation reduced the failure count in libstdc++ by about 40 fails. >> >> I build and test this port on a regular basis and I post the results to >> the usual place. ... > Umm, sorry, just seen this update to the previous patch. > > The changes to the exception unwinding look a bit more involved. Could > you separate that out into a separate patch, so that it's easier to see > what you're changing? Ok, here the mentioned part as separate diff. The comments are above. The CL below :) Thank you very much! Andreas gcc: * ginclude/unwind-arm-common.h (_Uwind_Control_Block): Define exception_class as double integer for FreeBSD ARM. (_Unwind_Exception): Define _Unwind_Exception_Class as double integer for FreeBSD ARM. libstc++-v3: * libsupc++/unwind-cxx.h (__is_gxx_exception_class, __is_dependent_exception): Exclude FreeBSD ARM from the __ARM_EABI_UNWINDER__ ifdef. --------------000907040908010407010701 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="gcc5_arm_unwind_20150108.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="gcc5_arm_unwind_20150108.diff" Content-length: 3443 Index: gcc/ginclude/unwind-arm-common.h =================================================================== --- gcc/ginclude/unwind-arm-common.h (revision 219357) +++ gcc/ginclude/unwind-arm-common.h (working copy) @@ -82,7 +82,11 @@ struct _Unwind_Control_Block { +#ifdef __FreeBSD__ + unsigned exception_class __attribute__((__mode__(__DI__))); +#else char exception_class[8]; +#endif void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block *); /* Unwinder cache, private fields for the unwinder's use */ struct @@ -181,7 +185,11 @@ /* Support functions for the PR. */ #define _Unwind_Exception _Unwind_Control_Block +#ifdef __FreeBSD__ + typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__))); +#else typedef char _Unwind_Exception_Class[8]; +#endif void * _Unwind_GetLanguageSpecificData (_Unwind_Context *); _Unwind_Ptr _Unwind_GetRegionStart (_Unwind_Context *); Index: libstdc++-v3/libsupc++/unwind-cxx.h =================================================================== --- libstdc++-v3/libsupc++/unwind-cxx.h (revision 219357) +++ libstdc++-v3/libsupc++/unwind-cxx.h (working copy) @@ -235,7 +235,7 @@ return reinterpret_cast<__cxa_dependent_exception *>(exc + 1) - 1; } -#ifdef __ARM_EABI_UNWINDER__ +#if defined (__ARM_EABI_UNWINDER__) && !defined (__FreeBSD__) static inline bool __is_gxx_exception_class(_Unwind_Exception_Class c) { @@ -309,13 +309,7 @@ c[6] = 'R'; c[7] = '\0'; } - -static inline void* -__gxx_caught_object(_Unwind_Exception* eo) -{ - return (void*)eo->barrier_cache.bitpattern[0]; -} -#else // !__ARM_EABI_UNWINDER__ +#else // !__ARM_EABI_UNWINDER__ || __FreeBSD__ // This is the primary exception class we report -- "GNUCC++\0". const _Unwind_Exception_Class __gxx_primary_exception_class = ((((((((_Unwind_Exception_Class) 'G' @@ -339,6 +333,16 @@ << 8 | (_Unwind_Exception_Class) '+') << 8 | (_Unwind_Exception_Class) '\x01'); +const _Unwind_Exception_Class __gxx_forced_unwind_class += ((((((((_Unwind_Exception_Class) 'G' + << 8 | (_Unwind_Exception_Class) 'N') + << 8 | (_Unwind_Exception_Class) 'U') + << 8 | (_Unwind_Exception_Class) 'C') + << 8 | (_Unwind_Exception_Class) 'F') + << 8 | (_Unwind_Exception_Class) 'O') + << 8 | (_Unwind_Exception_Class) 'R') + << 8 | (_Unwind_Exception_Class) '\0'); + static inline bool __is_gxx_exception_class(_Unwind_Exception_Class c) { @@ -346,6 +350,12 @@ || c == __gxx_dependent_exception_class; } +static inline bool +__is_gxx_forced_unwind_class(_Unwind_Exception_Class c) +{ + return c == __gxx_forced_unwind_class; +} + // Only checks for primary or dependent, but not that it is a C++ exception at // all. static inline bool @@ -357,7 +367,18 @@ #define __GXX_INIT_PRIMARY_EXCEPTION_CLASS(c) c = __gxx_primary_exception_class #define __GXX_INIT_DEPENDENT_EXCEPTION_CLASS(c) \ c = __gxx_dependent_exception_class +#define __GXX_INIT_FORCED_UNWIND_CLASS(c) c = __gxx_forced_unwind_class +#endif // __ARM_EABI_UNWINDER__ && !__FreeBSD__ +#ifdef __ARM_EABI_UNWINDER__ +static inline void* +__gxx_caught_object(_Unwind_Exception* eo) +{ + return (void*)eo->barrier_cache.bitpattern[0]; +} + +#else // !__ARM_EABI_UNWINDER__ + // GNU C++ personality routine, Version 0. extern "C" _Unwind_Reason_Code __gxx_personality_v0 (int, _Unwind_Action, _Unwind_Exception_Class, --------------000907040908010407010701--