On Fri, Sep 27, 2024 at 03:55:14PM -0400, Jason Merrill wrote: > On 9/27/24 3:38 PM, Jonathan Wakely wrote: > > On Fri, 27 Sept 2024 at 19:46, Jason Merrill <ja...@redhat.com> wrote: > > > > > > On 9/26/24 6:34 AM, Nathaniel Shead wrote: > > > > On Thu, Sep 26, 2024 at 01:46:27PM +1000, Nathaniel Shead wrote: > > > > > On Wed, Sep 25, 2024 at 01:30:55PM +0200, Jakub Jelinek wrote: > > > > > > On Wed, Sep 25, 2024 at 12:18:07PM +0100, Jonathan Wakely wrote: > > > > > > > > > And whether similarly we couldn't use > > > > > > > > > __attribute__((__visibility__ ("hidden"))) on the static > > > > > > > > > block scope > > > > > > > > > vars for C++ (again, if compiler supports that), so that the > > > > > > > > > changes > > > > > > > > > don't affect ABI of C++ libraries. > > > > > > > > > > > > > > > > That sounds good too. > > > > > > > > > > > > > > Can you use visibility attributes on a local static? I get a > > > > > > > warning > > > > > > > that it's ignored. > > > > > > > > > > > > Indeed :( > > > > > > > > > > > > And #pragma GCC visibility push(hidden)/#pragma GCC visibility pop > > > > > > around > > > > > > just the static block scope var definition does nothing. > > > > > > If it is around the whole inline function though, then it seems to > > > > > > work. > > > > > > Though, unsure if we want that around the whole header; wonder what > > > > > > it would > > > > > > do with the weakrefs. > > > > > > > > > > > > Jakub > > > > > > > > > > > > > > > > Thanks for the thoughts. WRT visibility, it looks like the main > > > > > gthr.h > > > > > surrounds the whole function in a > > > > > > > > > > #ifndef HIDE_EXPORTS > > > > > #pragma GCC visibility push(default) > > > > > #endif > > > > > > > > > > block, though I can't quite work out what the purpose of that is here > > > > > (since everything is currently internal linkage to start with). > > > > > > > > > > But it sounds like doing something like > > > > > > > > > > #ifdef __has_attribute > > > > > # if __has_attribute(__always_inline__) > > > > > # define __GTHREAD_ALWAYS_INLINE > > > > > __attribute__((__always_inline__)) > > > > > # endif > > > > > #endif > > > > > #ifndef __GTHREAD_ALWAYS_INLINE > > > > > # define __GTHREAD_ALWAYS_INLINE > > > > > #endif > > > > > > > > > > #ifdef __cplusplus > > > > > # define __GTHREAD_INLINE inline __GTHREAD_ALWAYS_INLINE > > > > > #else > > > > > # define __GTHREAD_INLINE static inline > > > > > #endif > > > > > > > > > > and then marking maybe even just the new inline functions with > > > > > visibility hidden should be OK? > > > > > > > > > > Nathaniel > > > > > > > > Here's a new patch that does this. Also since v1 it adds another two > > > > internal linkage declarations I'd missed earlier from libstdc++, in > > > > pstl; it turns out that <bits/stdc++.h> doesn't include <execution>. > > > > > > > > Bootstrapped and regtested on x86_64-pc-linux-gnu and > > > > aarch64-unknown-linux-gnu, OK for trunk? > > > > > > > > -- >8 -- > > > > > > > > In C++20, modules streaming check for exposures of TU-local entities. > > > > In general exposing internal linkage functions in a header is liable to > > > > cause ODR violations in C++, and this is now detected in a module > > > > context. > > > > > > > > This patch goes through and removes 'static' from many declarations > > > > exposed through libstdc++ to prevent code like the following from > > > > failing: > > > > > > > > export module M; > > > > extern "C++" { > > > > #include <bits/stdc++.h> > > > > } > > > > > > > > Since gthreads is used from C as well, we need to choose whether to use > > > > 'inline' or 'static inline' depending on whether we're compiling for C > > > > or C++ (since the semantics of 'inline' are different between the > > > > languages). Additionally we need to remove static global variables, so > > > > we migrate these to function-local statics to avoid the ODR issues. > > > > > > Why function-local static rather than inline variable? > > > > We can make that conditional on __cplusplus but can we do that for > > C++98? With Clang too? > > Yes for both compilers, disabling -Wc++17-extensions. >
Ah, I didn't realise that was possible. I've already merged the above patch but happy to test another one that changes this if that's preferred. > > > > +++ b/libstdc++-v3/include/pstl/algorithm_impl.h > > > > @@ -2890,7 +2890,7 @@ __pattern_includes(__parallel_tag<_IsVector> > > > > __tag, _ExecutionPolicy&& __exec, _ > > > > }); > > > > } > > > > > > > > -constexpr auto __set_algo_cut_off = 1000; > > > > +inline constexpr auto __set_algo_cut_off = 1000; > > > > > > > > +++ b/libstdc++-v3/include/pstl/unseq_backend_simd.h > > > > @@ -22,7 +22,7 @@ namespace __unseq_backend > > > > { > > > > > > > > // Expect vector width up to 64 (or 512 bit) > > > > -const std::size_t __lane_size = 64; > > > > +inline const std::size_t __lane_size = 64; > > > > > > These changes should not be necessary; the uses of these variables are > > > not exposures under https://eel.is/c++draft/basic#link-14.4 > > > Right, forgot about that. Looks like I'll need to update my patch to support this then, perhaps by also eagerly folding constants in template declarations as is currently done for non-templates? > > > Jason > > > > > >