From patchwork Thu Jan 22 22:23:24 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleg Endo X-Patchwork-Id: 432012 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id BED1C1400D5 for ; Fri, 23 Jan 2015 09:23:46 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:subject:from:to:date:content-type:mime-version; q= dns; s=default; b=Dr5ggONb3QiXz4z3MCADM474BDkl2GENRHRPc3SqiFPCFf HynxfqkAWf+e/IdcWxZPY7Id6PCwFd8VLEYKnjn7evvhG9smO6IsayfpEY1PtfZw NVR+2eTUD0QZwyMULJG7rixKIEg13BBEitVE5WR0yEcaUkHyFP516KuDjsCFk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:subject:from:to:date:content-type:mime-version; s= default; bh=m/qGjSmpmTz2e/X67v08vlmC5nQ=; b=gC+/gqgKVA8+TuCsaUxN K/4Hc3ykdXapBNtHcPNG6TBceWGrQt2SSyVlt0Ii0IV4Fr6jfo8+/jNg92AH3JQw qto9WQppj3UQJSMiG1SIB6s9yvnOPly6ihIe2XFQ7xXa3oaqW3XfDw2JcgXGA7th fdDEdCYlyA1k/s9N3PudLJc= Received: (qmail 13511 invoked by alias); 22 Jan 2015 22:23:37 -0000 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 Received: (qmail 13484 invoked by uid 89); 22 Jan 2015 22:23:35 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mailout10.t-online.de Received: from mailout10.t-online.de (HELO mailout10.t-online.de) (194.25.134.21) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 22 Jan 2015 22:23:33 +0000 Received: from fwd32.aul.t-online.de (fwd32.aul.t-online.de [172.20.26.144]) by mailout10.t-online.de (Postfix) with SMTP id 4D78040839; Thu, 22 Jan 2015 23:23:29 +0100 (CET) Received: from [192.168.0.105] (ZYqMMwZUghqwyWuCqP3u9KJIGq6BU-RohuLIyAI9eHtyMrI2aSUPp8-RwMPQ4tNg-J@[84.180.120.77]) by fwd32.t-online.de with (TLSv1.2:ECDHE-RSA-AES256-SHA encrypted) esmtp id 1YEQ9t-1eAlg80; Thu, 22 Jan 2015 23:23:25 +0100 Message-ID: <1421965404.2376.73.camel@yam-132-YW-E178-FTW> Subject: [SH] [libstdc++] Workaround for PR 29366 From: Oleg Endo To: gcc-patches , "libstdc++@gcc.gnu.org" , Kaz Kojima Date: Thu, 22 Jan 2015 23:23:24 +0100 Mime-Version: 1.0 X-IsSubscribed: yes Hi, The attached patch is a temporary workaround for PR 29366. We've been having support for various atomics on SH for a while, but libstdc++'s configury makes it impossible to use when doing a cross build (PR 53579). Even if that worked, if I'm not mistaken, config/cpu/sh/atomicity.h overrides all of that and replaces it with its own SH4A atomics or a lock based implementation for everything non-SH4A. The patch works OK on sh-elf, and as far as I can see there should be no problems on sh*-linux configs, too. I will commit the patch if there are no objections in 48h. Cheers, Oleg libstdc++-v4/ChangeLog: PR target/29366 * config/cpu/sh/atomicity.h (__exchange_and_add, __atomic_add): Remove SH4A inline asm and lock based implementations and use the defaults from ext/atomicity.h. Index: libstdc++-v3/config/cpu/sh/atomicity.h =================================================================== --- libstdc++-v3/config/cpu/sh/atomicity.h (revision 219824) +++ libstdc++-v3/config/cpu/sh/atomicity.h (working copy) @@ -22,87 +22,14 @@ // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // . -#ifdef __SH4A__ +// Use the default atomicity stuff, which will use __atomic* builtins +// if threads are available, or the *_single functions on single-thread +// configurations. +// Actually we wouldn't need this header at all, but because of PR 53579 +// libstdc++'s configury will not pickup the -matomic-model= option when +// set in the environment. This makes it impossible to enable the proper +// atomic model on SH without modifying GCC itself, because libstdc++ always +// thinks the target doesn't do any atomics and uses the default mutex based +// implementation from cpu/generic/atomicity/mutex. #include - -namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION - - typedef int _Atomic_word; - - _Atomic_word - __attribute__ ((__unused__)) - __exchange_and_add (volatile _Atomic_word* __mem, int __val) throw () - { - _Atomic_word __result; - - __asm__ __volatile__ - ("0:\n" - "\tmovli.l\t@%2,r0\n" - "\tmov\tr0,%1\n" - "\tadd\t%3,r0\n" - "\tmovco.l\tr0,@%2\n" - "\tbf\t0b" - : "+m" (*__mem), "=&r" (__result) - : "r" (__mem), "rI08" (__val) - : "r0"); - - return __result; - } - - - void - __attribute__ ((__unused__)) - __atomic_add (volatile _Atomic_word* __mem, int __val) throw () - { - asm("0:\n" - "\tmovli.l\t@%1,r0\n" - "\tadd\t%2,r0\n" - "\tmovco.l\tr0,@%1\n" - "\tbf\t0b" - : "+m" (*__mem) - : "r" (__mem), "rI08" (__val) - : "r0"); - } - -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace - -#else /* !__SH4A__ */ - -/* This is generic/atomicity.h */ - -#include -#include - -namespace -{ - __gnu_cxx::__mutex atomic_mutex; -} // anonymous namespace - -namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION - - _Atomic_word - __attribute__ ((__unused__)) - __exchange_and_add(volatile _Atomic_word* __mem, int __val) throw () - { - __gnu_cxx::__scoped_lock sentry(atomic_mutex); - _Atomic_word __result; - __result = *__mem; - *__mem += __val; - return __result; - } - - void - __attribute__ ((__unused__)) - __atomic_add(volatile _Atomic_word* __mem, int __val) throw () - { __exchange_and_add(__mem, __val); } - -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace - -#endif /* !__SH4A__ */