On Wed, 25 Sept 2024 at 11:47, Jonathan Wakely <jwak...@redhat.com> wrote:
>
> On Wed, 25 Sept 2024 at 11:29, Jakub Jelinek <ja...@redhat.com> wrote:
> >
> > On Wed, Sep 25, 2024 at 10:43:50AM +0100, Jonathan Wakely wrote:
> > > > libgcc/ChangeLog:
> > > >
> > > >         * gthr-posix.h (__GTHREAD_INLINE): New macro.
> > > >         (__gthread_active): Convert from variable to function.
> > > >         (__gthread_trigger): Mark as __GTHREAD_INLINE instead of static.
> > > >         (__gthread_active_p): Likewise.
> > > >         (__gthread_create): Likewise.
> > > >         (__gthread_join): Likewise.
> > > >         (__gthread_detach): Likewise.
> > > >         (__gthread_equal): Likewise.
> > > >         (__gthread_self): Likewise.
> > > >         (__gthread_yield): Likewise.
> > > >         (__gthread_once): Likewise.
> > > >         (__gthread_key_create): Likewise.
> > > >         (__gthread_key_delete): Likewise.
> > > >         (__gthread_getspecific): Likewise.
> > > >         (__gthread_setspecific): Likewise.
> > > >         (__gthread_mutex_init_function): Likewise.
> > > >         (__gthread_mutex_destroy): Likewise.
> > > >         (__gthread_mutex_lock): Likewise.
> > > >         (__gthread_mutex_trylock): Likewise.
> > > >         (__gthread_mutex_timedlock): Likewise.
> > > >         (__gthread_mutex_unlock): Likewise.
> > > >         (__gthread_recursive_mutex_init_function): Likewise.
> > > >         (__gthread_recursive_mutex_lock): Likewise.
> > > >         (__gthread_recursive_mutex_trylock): Likewise.
> > > >         (__gthread_recursive_mutex_timedlock): Likewise.
> > > >         (__gthread_recursive_mutex_unlock): Likewise.
> > > >         (__gthread_recursive_mutex_destroy): Likewise.
> > > >         (__gthread_cond_init_function): Likewise.
> > > >         (__gthread_cond_broadcast): Likewise.
> > > >         (__gthread_cond_signal): Likewise.
> > > >         (__gthread_cond_wait): Likewise.
> > > >         (__gthread_cond_timedwait): Likewise.
> > > >         (__gthread_cond_wait_recursive): Likewise.
> > > >         (__gthread_cond_destroy): Likewise.
> > > >         (__gthread_rwlock_rdlock): Likewise.
> > > >         (__gthread_rwlock_tryrdlock): Likewise.
> > > >         (__gthread_rwlock_wrlock): Likewise.
> > > >         (__gthread_rwlock_trywrlock): Likewise.
> > > >         (__gthread_rwlock_unlock): Likewise.
> > > >         * gthr-single.h (__GTHREAD_INLINE): New macro.
> > > >         (__gthread_active_p): Mark as __GTHREAD_INLINE instead of 
> > > > static.
> > > >         (__gthread_once): Likewise.
> > > >         (__gthread_key_create): Likewise.
> > > >         (__gthread_key_delete): Likewise.
> > > >         (__gthread_getspecific): Likewise.
> > > >         (__gthread_setspecific): Likewise.
> > > >         (__gthread_mutex_destroy): Likewise.
> > > >         (__gthread_mutex_lock): Likewise.
> > > >         (__gthread_mutex_trylock): Likewise.
> > > >         (__gthread_mutex_unlock): Likewise.
> > > >         (__gthread_recursive_mutex_lock): Likewise.
> > > >         (__gthread_recursive_mutex_trylock): Likewise.
> > > >         (__gthread_recursive_mutex_unlock): Likewise.
> > > >         (__gthread_recursive_mutex_destroy): Likewise.
> >
> > I'm worried about ABI consequences of these changes.
> > From what I can see, this doesn't change anything important for C,
> > the inlines are still static inline and the conversion of global static
> > vars to function-local in static inline still keeps those static.
> >
> > But for C++ this means significant changes.
> > Say
> > _ZZ16__gthread_activevE20__gthread_active_var
> > etc. will now be STB_GNU_UNIQUE symbol, exported from whatever shared
> > libraries and binaries are compiled with C++ and include those headers
> > and actually use them somewhere.
>
> I don't think that applies for HPUX or Solaris, but maybe does for
> FreeBSD (and it looks like those are the only targets affected by the
> __gthread_active_var changes).
>
> > On one side, it has benefits (e.g. every TU won't separately test and
> > store whether the threads are active or not), on the other side it can
> > prevent dlclose of some shared libraries and create interdependencies
> > between libraries.
> >
> > So, I wonder if we couldn't define the C++ __GTHREAD_INLINE to
> > static inline __attribute__((__always_inline__)) (or at least when
> > using a compiler which supports the attribute, we can now test it
> > using preprocessor...).
>
> I think that would be a nice improvement for the gthread wrapper
> functions even without the concern about __gthread_active_var.
>
> >  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.

Reply via email to