From patchwork Sat Jun 1 22:44:27 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerald Pfeifer X-Patchwork-Id: 248091 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 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id D850B2C008C for ; Sun, 2 Jun 2013 08:44:48 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:mime-version:content-type; q=dns; s=default; b=C4su2Zmwna6kDSt93euasxpgSi8TNCsQt++Z5uwqM39raW0VXf 2jElNcCninij5RCrY4tqrgnIa609Ps908qCXWrEFn2/tkglda7QeoZ9PU/kzYGpI JhfPHsw//gyTEL/764AUwbgz39aa5wFhTFFdA1EpSbwLsFvBL811DfzJ4= 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:date :from:to:cc:subject:message-id:mime-version:content-type; s= default; bh=BlAFdJN7OKId5npai0M/ZMLWlyo=; b=MbNL7aM+ODArUzBmxaq7 5waFiY/qzycqRIf0BzwTY6Mr8D5P8gfUL2Vauo4fhEQiTc8RedqQtMe9VzLgX3SK oTGowzcCw7405mpsIDA3luV3PsgFzuWhnH7RiKiRJdZmJVfguPFgu2lSHTNoSJir SOyxFsCgp/QfFRrCOKuWrdk= Received: (qmail 1258 invoked by alias); 1 Jun 2013 22:44:42 -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 1164 invoked by uid 89); 1 Jun 2013 22:44:35 -0000 X-Spam-SWARE-Status: No, score=-50.9 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.1 Received: from ainaz.pair.com (HELO ainaz.pair.com) (209.68.2.66) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sat, 01 Jun 2013 22:44:34 +0000 Received: from [192.168.0.131] (vie-188-118-252-197.dsl.sil.at [188.118.252.197]) by ainaz.pair.com (Postfix) with ESMTPSA id 851293F410; Sat, 1 Jun 2013 18:44:30 -0400 (EDT) Date: Sun, 2 Jun 2013 00:44:27 +0200 (CEST) From: Gerald Pfeifer To: gcc-patches@gcc.gnu.org, Richard Guenther , Jakub Jelinek , Richard Henderson cc: Andi Kleen Subject: PING^2 [libitm, PATCH] Fix bootstrap due to __always_inline in libitm Message-ID: MIME-Version: 1.0 [ I could not identify who approved the original patch, but believe it was one of Richi, Jakub or RTH, so I hope one of you can approve this. Andi acked the previous submission, but cannot approve. ] The following patch broke bootstrap on all FreeBSD platforms, which took me a bit to realize since originally Andi did not update ChangeLog: 2013-03-23 Andi Kleen * local_atomic (__always_inline): Add. (__calculate_memory_order, atomic_thread_fence, atomic_signal_fence, test_and_set, clear, store, load, exchange, compare_exchange_weak, compare_exchange_strong, fetch_add, fetch_sub, fetch_and, fetch_or, fetch_xor): Add __always_inline to force inlining. The problem is the patch added #ifndef __always_inline #define __always_inline inline __attribute__((always_inline)) #endif whereas /usr/include/sys/cdefs.h on FreeBSD has the following #define __always_inline __attribute__((__always_inline__)) and hence misses the "inline". I am fixing this by adding an explicit inline to those cases where necessary. I did not add it to struct members, which are considered inline by default (and believe Andi's patch may have been a bit over- eager from that perspective). On top of this, for this revision of the patch, I am unconditionally defining __always_inline to get the same behavior on all platforms. Bootstrapped and regression tested on i386-unknown-freebsd10.0, bootstrapped on amd64-unknown-freebsd8.4 and x86_64-suse-linux. Okay? Gerald 2013-05-31 Gerald Pfeifer PR bootstrap/56714 * local_atomic (__always_inline): Always define our version. (__calculate_memory_order): Mark inline. (atomic_thread_fence): Ditto. (atomic_signal_fence): Ditto. (atomic_bool::atomic_flag_test_and_set_explicit): Ditto. (atomic_bool::atomic_flag_clear_explicit): Ditto. (atomic_bool::atomic_flag_test_and_set): Ditto. (atomic_bool::atomic_flag_clear): Ditto. Index: libitm/local_atomic =================================================================== --- libitm/local_atomic (revision 199585) +++ libitm/local_atomic (working copy) @@ -41,9 +41,8 @@ #ifndef _GLIBCXX_ATOMIC #define _GLIBCXX_ATOMIC 1 -#ifndef __always_inline -#define __always_inline inline __attribute__((always_inline)) -#endif +#undef __always_inline +#define __always_inline __attribute__((always_inline)) // #pragma GCC system_header @@ -75,7 +74,7 @@ memory_order_seq_cst } memory_order; - __always_inline memory_order + inline __always_inline memory_order __calculate_memory_order(memory_order __m) noexcept { const bool __cond1 = __m == memory_order_release; @@ -85,13 +84,13 @@ return __mo2; } - __always_inline void + inline __always_inline void atomic_thread_fence(memory_order __m) noexcept { __atomic_thread_fence (__m); } - __always_inline void + inline __always_inline void atomic_signal_fence(memory_order __m) noexcept { __atomic_thread_fence (__m); @@ -1545,38 +1544,38 @@ // Function definitions, atomic_flag operations. - __always_inline bool + inline __always_inline bool atomic_flag_test_and_set_explicit(atomic_flag* __a, memory_order __m) noexcept { return __a->test_and_set(__m); } - __always_inline bool + inline __always_inline bool atomic_flag_test_and_set_explicit(volatile atomic_flag* __a, memory_order __m) noexcept { return __a->test_and_set(__m); } - __always_inline void + inline __always_inline void atomic_flag_clear_explicit(atomic_flag* __a, memory_order __m) noexcept { __a->clear(__m); } - __always_inline void + inline __always_inline void atomic_flag_clear_explicit(volatile atomic_flag* __a, memory_order __m) noexcept { __a->clear(__m); } - __always_inline bool + inline __always_inline bool atomic_flag_test_and_set(atomic_flag* __a) noexcept { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); } - __always_inline bool + inline __always_inline bool atomic_flag_test_and_set(volatile atomic_flag* __a) noexcept { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); } - __always_inline void + inline __always_inline void atomic_flag_clear(atomic_flag* __a) noexcept { atomic_flag_clear_explicit(__a, memory_order_seq_cst); } - __always_inline void + inline __always_inline void atomic_flag_clear(volatile atomic_flag* __a) noexcept { atomic_flag_clear_explicit(__a, memory_order_seq_cst); }