From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 62679 invoked by alias); 21 Jun 2019 16:01:56 -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 62663 invoked by uid 89); 21 Jun 2019 16:01:56 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-16.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=1680, TOTAL, todays, today's X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 21 Jun 2019 16:01:54 +0000 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BA668C0578F2; Fri, 21 Jun 2019 16:01:53 +0000 (UTC) Received: from localhost (unknown [10.33.36.140]) by smtp.corp.redhat.com (Postfix) with ESMTP id 69CC11001B05; Fri, 21 Jun 2019 16:01:53 +0000 (UTC) Date: Fri, 21 Jun 2019 16:01:00 -0000 From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Cc: Nathan Sidwell Subject: [PATCH] Fix ODR violations in code using Message-ID: <20190621160152.GN7627@redhat.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="l+goss899txtYvYf" Content-Disposition: inline X-Clacks-Overhead: GNU Terry Pratchett User-Agent: Mutt/1.11.3 (2019-02-01) X-SW-Source: 2019-06/txt/msg01326.txt.bz2 --l+goss899txtYvYf Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline Content-length: 5650 Nathan noticed that the 'static inline' functions in cause ODR violations when used from inline functions or templates (see [basic.def.odr] p12 bullet (12.2)). His modules branch now diagnoses those violations, so we need a fix. Looking at the history (r114044 by Paolo) I believe the idea was indeed to allow different definitions to be used in different TUs. I think __attribute__((__always_inline__)) is a better match for that than 'static inline', and doesn't violate the ODR (at least, not if all TUs have the same values for __GTHREADS and _GLIBCXX_ATOMIC_BUILTINS). These functions still violate this rule in [dcl.inline]: C++17: "If a function with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required." C++2a WP: "If a function or variable with external or module linkage is declared inline in one translation unit, there shall be a reachable inline declaration in all translation units in which it is declared; no diagnostic is required." But that doesn't seem to be diagnosable by today's implementations. Does this change seem reasonable? It does change the size of a few files, e.g. for x86_64 some are bigger and some are smaller, overall slightly smaller: text data bss dec hex filename 5400 8 352 5760 1680 src/c++11/cow-locale_init.o 5402 8 352 5762 1682 src/c++11/cow-locale_init.o [always_inline] 22772 2056 0 24828 60fc src/c++11/cow-shim_facets.o 22710 2056 0 24766 60be src/c++11/cow-shim_facets.o [always_inline] 49458 2184 0 51642 c9ba src/c++11/cow-sstream-inst.o 49482 2184 0 51666 c9d2 src/c++11/cow-sstream-inst.o [always_inline] 7461 8 0 7469 1d2d src/c++11/cow-stdexcept.o 7464 8 0 7472 1d30 src/c++11/cow-stdexcept.o [always_inline] 16753 8 32 16793 4199 src/c++11/cow-string-inst.o 16756 8 32 16796 419c src/c++11/cow-string-inst.o [always_inline] 17009 8 32 17049 4299 src/c++11/cow-wstring-inst.o 17008 8 32 17048 4298 src/c++11/cow-wstring-inst.o [always_inline] 20342 2072 0 22414 578e src/c++11/cxx11-shim_facets.o 20276 2072 0 22348 574c src/c++11/cxx11-shim_facets.o [always_inline] 2929 240 8 3177 c69 src/c++11/future.o 2945 240 8 3193 c79 src/c++11/future.o [always_inline] 6789 120 0 6909 1afd src/c++11/ios-inst.o 6750 120 0 6870 1ad6 src/c++11/ios-inst.o [always_inline] 2364 57 8 2429 97d src/c++11/ios.o 2362 57 8 2427 97b src/c++11/ios.o [always_inline] 94493 2712 192 97397 17c75 src/c++11/locale-inst.o 94498 2712 192 97402 17c7a src/c++11/locale-inst.o [always_inline] 93094 2712 192 95998 176fe src/c++11/wlocale-inst.o 93113 2712 192 96017 17711 src/c++11/wlocale-inst.o [always_inline] 20189 208 0 20397 4fad src/c++17/cow-fs_dir.o 20118 208 0 20326 4f66 src/c++17/cow-fs_dir.o [always_inline] 55077 8 0 55085 d72d src/c++17/cow-fs_ops.o 55103 8 0 55111 d747 src/c++17/cow-fs_ops.o [always_inline] 40200 304 0 40504 9e38 src/c++17/cow-fs_path.o 40204 304 0 40508 9e3c src/c++17/cow-fs_path.o [always_inline] 18672 208 0 18880 49c0 src/c++17/fs_dir.o 18628 208 0 18836 4994 src/c++17/fs_dir.o [always_inline] 60604 160 0 60764 ed5c src/c++17/fs_ops.o 60606 160 0 60766 ed5e src/c++17/fs_ops.o [always_inline] 39568 304 0 39872 9bc0 src/c++17/fs_path.o 39561 304 0 39865 9bb9 src/c++17/fs_path.o [always_inline] 3653 8 0 3661 e4d src/c++98/ios_init.o 3656 8 0 3664 e50 src/c++98/ios_init.o [always_inline] 6878 184 84 7146 1bea src/c++98/locale.o 6896 184 84 7164 1bfc src/c++98/locale.o [always_inline] 6693 768 5368 12829 321d src/c++98/locale_init.o 6710 768 5368 12846 322e src/c++98/locale_init.o [always_inline] 7222 8 0 7230 1c3e src/c++98/localename.o 7223 8 0 7231 1c3f src/c++98/localename.o [always_inline] 4036 144 208 4388 1124 src/c++98/pool_allocator.o 4044 144 208 4396 112c src/c++98/pool_allocator.o [always_inline] 1955 584 0 2539 9eb src/c++98/stdexcept.o 1957 584 0 2541 9ed src/c++98/stdexcept.o [always_inline] 25199 208 0 25407 633f src/filesystem/cow-dir.o 25248 208 0 25456 6370 src/filesystem/cow-dir.o [always_inline] 71134 8 0 71142 115e6 src/filesystem/cow-ops.o 71146 8 0 71154 115f2 src/filesystem/cow-ops.o [always_inline] 21995 184 0 22179 56a3 src/filesystem/cow-path.o 22013 184 0 22197 56b5 src/filesystem/cow-path.o [always_inline] 23708 208 0 23916 5d6c src/filesystem/dir.o 23690 208 0 23898 5d5a src/filesystem/dir.o [always_inline] 70268 160 0 70428 1131c src/filesystem/ops.o 70233 160 0 70393 112f9 src/filesystem/ops.o [always_inline] 815915 15841 6476 838232 cca58 TOTAL 815802 15841 6476 838119 cc9e7 TOTAL [always_inline] --l+goss899txtYvYf Content-Type: text/x-patch; charset=us-ascii Content-Disposition: attachment; filename="patch.txt" Content-length: 2519 diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ac98c0d02e7..ace1c8b565e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2019-06-21 Jonathan Wakely + + * include/ext/atomicity.h [_GLIBCXX_ATOMIC_BUILTINS] (__atomic_add) + (__exchange_and_add): Replace 'static' specifier with always_inline + attribute. + (__exchange_and_add_single, __atomic_add_single) + (__exchange_and_add_dispatch, __atomic_add_dispatch): Likewise. + 2019-06-20 Jonathan Wakely * acinclude.m4 (GLIBCXX_ENABLE_DEBUG): Only do debug build for final diff --git a/libstdc++-v3/include/ext/atomicity.h b/libstdc++-v3/include/ext/atomicity.h index 0783a58e01a..5cee388854b 100644 --- a/libstdc++-v3/include/ext/atomicity.h +++ b/libstdc++-v3/include/ext/atomicity.h @@ -44,24 +44,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // __exchange_and_add_dispatch // __atomic_add_dispatch #ifdef _GLIBCXX_ATOMIC_BUILTINS - static inline _Atomic_word + inline _Atomic_word + __attribute__((__always_inline__)) __exchange_and_add(volatile _Atomic_word* __mem, int __val) { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); } - static inline void + inline void + __attribute__((__always_inline__)) __atomic_add(volatile _Atomic_word* __mem, int __val) { __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); } #else _Atomic_word - __attribute__ ((__unused__)) __exchange_and_add(volatile _Atomic_word*, int) throw (); void - __attribute__ ((__unused__)) __atomic_add(volatile _Atomic_word*, int) throw (); #endif - static inline _Atomic_word + inline _Atomic_word + __attribute__((__always_inline__)) __exchange_and_add_single(_Atomic_word* __mem, int __val) { _Atomic_word __result = *__mem; @@ -69,12 +70,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __result; } - static inline void + inline void + __attribute__((__always_inline__)) __atomic_add_single(_Atomic_word* __mem, int __val) { *__mem += __val; } - static inline _Atomic_word - __attribute__ ((__unused__)) + inline _Atomic_word + __attribute__ ((__always_inline__)) __exchange_and_add_dispatch(_Atomic_word* __mem, int __val) { #ifdef __GTHREADS @@ -87,8 +89,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif } - static inline void - __attribute__ ((__unused__)) + inline void + __attribute__ ((__always_inline__)) __atomic_add_dispatch(_Atomic_word* __mem, int __val) { #ifdef __GTHREADS --l+goss899txtYvYf--