On Saturday 13 December 2025 20:34:43 Martin Storsjö wrote:
> On Sat, 6 Dec 2025, Pali Rohár wrote:
> 
> > An alternative change instead of 06/12 which tries to address
> > the ABI issue in dirent.h header file is below.
> > 
> > I verified that this change is correct by _Static_assert code injected
> > into mingw-w64-crt build:
> > #include <dirent.h>
> > #include <tchar.h>
> > #ifdef _WIN64
> > _Static_assert(__builtin_types_compatible_p(typeof(_tfindfirst), 
> > typeof(_tfindfirst64i32)), "Functions are compatible");
> > #else
> > _Static_assert(__builtin_types_compatible_p(typeof(_tfindfirst), 
> > typeof(_tfindfirst32)), "Functions are compatible");
> > #endif
> > 
> > 
> > crt: dirent: Use fixed size findfirst/findnext symbols
> > 
> > For 64-bit builds *find* is replaced by *find*64i32.
> > For 32-bit builds *find* is replaced by *find32.
> > This is what are current definitions during the mingw-w64-crt build time.
> > So this change does not modify any emitted symbol or strucure usage.
> > 
> > This ensures that ABI of mingw-w64 dirent function would not change.
> > Also this ensures that applications including the dirent.h would use
> > ABI-same struct DIR as was defined at the mingw-w64 build time.
> > 
> > diff --git a/mingw-w64-crt/misc/dirent.c b/mingw-w64-crt/misc/dirent.c
> > index 4897cf492fa1..f65fdea3234b 100644
> > --- a/mingw-w64-crt/misc/dirent.c
> > +++ b/mingw-w64-crt/misc/dirent.c
> > @@ -152,7 +152,13 @@ _treaddir (_TDIR * dirp)
> >     {
> >       /* We haven't started the search yet. */
> >       /* Start the search */
> > -      dirp->dd_handle = _tfindfirst (dirp->dd_name, &(dirp->dd_dta));
> > +      dirp->dd_handle =
> > +#ifdef _WIN64
> > +   _tfindfirst64i32
> > +#else
> > +   _tfindfirst32
> > +#endif
> > +   (dirp->dd_name, &(dirp->dd_dta));
> > 
> >       if (dirp->dd_handle == -1)
> >     {
> > @@ -168,7 +174,13 @@ _treaddir (_TDIR * dirp)
> >   else
> >     {
> >       /* Get the next search entry. */
> > -      if (_tfindnext (dirp->dd_handle, &(dirp->dd_dta)))
> > +      if (
> > +#ifdef _WIN64
> > +     _tfindnext64i32
> > +#else
> > +     _tfindnext32
> > +#endif
> > +     (dirp->dd_handle, &(dirp->dd_dta)))
> >     {
> >       /* We are off the end or otherwise error.
> >          _findnext sets errno to ENOENT if no more file
> > diff --git a/mingw-w64-headers/crt/dirent.h b/mingw-w64-headers/crt/dirent.h
> > index 2d7a1b73f71e..e9a4d1ba1c27 100644
> > --- a/mingw-w64-headers/crt/dirent.h
> > +++ b/mingw-w64-headers/crt/dirent.h
> > @@ -38,7 +38,11 @@ struct dirent
> > typedef struct
> > {
> >     /* disk transfer area for this dir */
> > -   struct _finddata_t      dd_dta;
> > +#ifdef _WIN64
> > +   struct _finddata64i32_t dd_dta;
> > +#else
> > +   struct _finddata32_t    dd_dta;
> > +#endif
> > 
> >     /* dirent struct to return from dir (NOTE: this makes this thread
> >      * safe as long as only one thread uses a particular DIR struct at
> > @@ -85,7 +89,11 @@ struct _wdirent
> > typedef struct
> > {
> >     /* disk transfer area for this dir */
> > -   struct _wfinddata_t     dd_dta;
> > +#ifdef _WIN64
> > +   struct _wfinddata64i32_t        dd_dta;
> > +#else
> > +   struct _wfinddata32_t   dd_dta;
> > +#endif
> > 
> 
> I think this looks like the cleaner and more correct change here (I guess
> this is the change that you suggest in a comment in the other version of
> patch 06/12, that would be the right future change instead?).
> 
> // Martin

Yes, I mean this one. Therefore I will use this code instead of the
original in patch 06/12 for next patch resend.


_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to