On Thursday 09 October 2025 15:56:54 Martin Storsjö wrote:
> On Tue, 23 Sep 2025, Pali Rohár wrote:
> 
> > POSIX ftime() function returns int. MS _ftime() returns void. Add new
> > mingw-w64 wrappers around _ftime32() and _ftime64() which returns int 0
> > for implementing proper POSIX ftime() function.
> > 
> > Function ftime() defined in sys/timeb.h now redirects to either ftime32
> > or ftime64 symbol, which correctly returns an integer 0.
> > ---
> > mingw-w64-crt/Makefile.am                    |  1 +
> > mingw-w64-crt/def-include/crt-aliases.def.in |  7 +------
> > mingw-w64-crt/misc/ftime32.c                 | 19 +++++++++++++++++++
> > mingw-w64-crt/misc/ftime64.c                 | 19 +++++++++++++++++++
> > mingw-w64-headers/crt/sys/timeb.h            |  4 ++--
> > 5 files changed, 42 insertions(+), 8 deletions(-)
> > create mode 100644 mingw-w64-crt/misc/ftime32.c
> > create mode 100644 mingw-w64-crt/misc/ftime64.c
> > 
> > diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
> > index 57b110be331b..266eed840eac 100644
> > --- a/mingw-w64-crt/Makefile.am
> > +++ b/mingw-w64-crt/Makefile.am
> > @@ -1154,6 +1154,7 @@ src_libmingwex=\
> >   misc/mingw_setfp.c \
> >   misc/feupdateenv.c     misc/ftruncate.c           misc/fwide.c            
> > misc/getlogin.c              misc/getopt.c          \
> >   misc/gettimeofday.c    misc/__mingw_has_sse.c      \
> > +  misc/ftime32.c         misc/ftime64.c              \
> >   misc/mempcpy.c         misc/mingw-aligned-malloc.c \
> >   misc/mingw_matherr.c   misc/mingw_mbwc_convert.c  misc/mingw_usleep.c     
> > misc/mingw_wcstod.c          misc/mingw_wcstof.c    \
> >   misc/mingw_wcstold.c \
> > diff --git a/mingw-w64-crt/def-include/crt-aliases.def.in 
> > b/mingw-w64-crt/def-include/crt-aliases.def.in
> > index 42d1bfc1faa4..c568196b7265 100644
> > --- a/mingw-w64-crt/def-include/crt-aliases.def.in
> > +++ b/mingw-w64-crt/def-include/crt-aliases.def.in
> > @@ -72,12 +72,7 @@ ADD_UNDERSCORE(fstat)
> > F32(fstat == _fstat32)
> > F64(fstat == _fstat64i32)
> > #endif
> > -#ifdef FIXED_SIZE_SYMBOLS
> > -ADD_UNDERSCORE(ftime)
> > -#else
> > -F32(ftime == _ftime32)
> > -F64(ftime == _ftime64)
> > -#endif
> > +; ftime is provided in misc/ftime32.c or misc/ftime64.c as MS _ftime is 
> > not ABI compatible with POSIX ftime
> > #if defined(UCRTBASE)
> > ; HUGE alias and _HUGE variable are provided by math/_huge.c
> > #elif defined(CRTDLL)
> > diff --git a/mingw-w64-crt/misc/ftime32.c b/mingw-w64-crt/misc/ftime32.c
> > new file mode 100644
> > index 000000000000..41cc31a6673c
> > --- /dev/null
> > +++ b/mingw-w64-crt/misc/ftime32.c
> > @@ -0,0 +1,19 @@
> > +/**
> > + * This file has no copyright assigned and is placed in the Public Domain.
> > + * This file is part of the mingw-w64 runtime package.
> > + * No warranty is given; refer to the file DISCLAIMER.PD within this 
> > package.
> > + */
> > +
> > +#include <sys/timeb.h>
> > +
> > +int __cdecl ftime32(struct __timeb32 *tb32);
> > +int __cdecl ftime32(struct __timeb32 *tb32)
> > +{
> > +    _ftime32(tb32);
> > +    return 0;
> > +}
> > +
> > +/* On 32-bit systems is ftime ABI using 32-bit time_t */
> > +#ifndef _WIN64
> > +int __attribute__ ((alias("ftime32"))) __cdecl ftime(struct timeb *);
> > +#endif
> > diff --git a/mingw-w64-crt/misc/ftime64.c b/mingw-w64-crt/misc/ftime64.c
> > new file mode 100644
> > index 000000000000..c30003b0302a
> > --- /dev/null
> > +++ b/mingw-w64-crt/misc/ftime64.c
> > @@ -0,0 +1,19 @@
> > +/**
> > + * This file has no copyright assigned and is placed in the Public Domain.
> > + * This file is part of the mingw-w64 runtime package.
> > + * No warranty is given; refer to the file DISCLAIMER.PD within this 
> > package.
> > + */
> > +
> > +#include <sys/timeb.h>
> > +
> > +int __cdecl ftime64(struct __timeb64 *tb64);
> > +int __cdecl ftime64(struct __timeb64 *tb64)
> > +{
> > +    _ftime64(tb64);
> > +    return 0;
> > +}
> > +
> > +/* On 64-bit systems is ftime ABI using 64-bit time_t */
> > +#ifdef _WIN64
> > +int __attribute__ ((alias("ftime64"))) __cdecl ftime(struct timeb *);
> > +#endif
> > diff --git a/mingw-w64-headers/crt/sys/timeb.h 
> > b/mingw-w64-headers/crt/sys/timeb.h
> > index c35398539441..d52fd9c7f760 100644
> > --- a/mingw-w64-headers/crt/sys/timeb.h
> > +++ b/mingw-w64-headers/crt/sys/timeb.h
> > @@ -122,9 +122,9 @@ struct itimerspec {
> > #ifndef _CRTBLD
> > #if !defined (RC_INVOKED) && !defined (NO_OLDNAMES)
> > #ifndef _USE_32BIT_TIME_T
> > -  void __cdecl ftime (struct timeb *) __MINGW_ASM_CALL(_ftime64);
> > +  int __cdecl ftime (struct timeb *) __MINGW_ASM_CALL(ftime64);
> 
> Hmm, this seems a little bit odd, that we have double redirections in place
> here; we both have __MINGW_ASM_CALL(ftime64) in the headers, and we also
> have __attribute__ ((alias("ftime64"))) in the source files.
> 
> This doesn't seem to be a change in itself though, because earlier, we had
> similar redirections in the def file (ftime == _ftime64).

Yes, exactly. Before this change we had symbol "ftime" in import
library, so in this my change I added alias at cpp level to ensure that
symbol "ftime" stay there as before (because it is being removed from
def file).

So basically the symbol alias is just moved from def file to c source
file due to implementation details.

> But normally I think we'd make do with either of the redirection mechanisms,
> not have both of them (as it becomes a bit surprising for future
> maintainance that the same thing has to be changed in two places).
> 
> Normally it should be enough to have the __MINGW_ASM_CALL in the headers,
> right? Unless we need to cope with users who call it without including
> headers (or declare it themselves). Is that the case here?
> 
> // Martin

Yes, exactly, the __MINGW_ASM_CALL in the header files should be enough.
But here is it compatibility with msvc / msvcrt (and maybe also msvc
with UCRT) which provides the "ftime" symbol at link time.


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

Reply via email to