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?


>
> > +++ 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
>
> Jason
>

Reply via email to