On Tue, 17 Jun 2025, Corinna Vinschen wrote:

> On Jun 17 10:21, Jeremy Drake via Cygwin-patches wrote:
> > The pthread macros were previously casts of integers to pointers, which
> > would always be full absolute pointers.  This change is making them actual
> > symbols which the linker fills in with absolute addresses.  This would be
> > out of range of a 32-bit rip-relative relocation in cases where the image
> > base is >4GB.
> >
> > This is really gross, as I said, but was the only way I came up with to
> > make them satisfy constinit's restrictions in clang (and the standard, it
> > seems GCC allows things that are explicitly disallowed by the standard).
>
> Ok, but then I'm still puzzled about the code.
>
> First of all, shouldn't the new symbols get exported explicitly via
> cygwin.din?

No, as i said they can't be used from the DLL anyway.  I included them in
libcygwin.a (LIB_FILES) for external users, and in the dll (DLL_FILES) for
internal uses.

> Second, I'm puzzeling over the #if expression (cut for a simple example):
>
>   #if !defined(__INSIDE_CYGWIN__) || !defined(__cplusplus)
>   /* use symbols */
>   #else
>   /* use const int cast to pointer */
>   #endif
>
> So this is a problem in terms of constinit.  Constinit is a C++20
> expression.  But the condition will only define PTHREAD_...  using the
> symbols if this is either outside Cygwin, or if the Cygwin code is NOT
> C++.
>
> The usage inside Cygwin seems upside down to me.  Shouldn't it use the
> symbols in C++ code but not in plain C?  Or am I misunderstanding the
> condition entirely?

The reason I kept the old cast-to-pointer path inside Cygwin C++ code is
that that case triggered the "relocation truncated to fit" error.  Also,
that matches the condition inside sys/_pthreadtypes.h to cast to a class
pointer instead of a struct pointer.
>
> > Somewhat surprising to me is that clang also disallows using the address
> > of a dllimported extern variable in constinit, so we couldn't even
> > dllexport "magic" objects from the DLL whose addresses could be compared
> > against instead of (pthread_mutex_t)19 and such.
>
> We also have the choice to export the symbols from libcygwin.a, see the
> files in LIB_FILES in Makefile.am.  Would that allow clang to use them
> in constinit?  Theoretically we could also define them in crt0.o, but
> this looks too much like just another hack...

Yes, that's what I did...

Reply via email to