On Thu, 4 Apr 2019, Jacek Caban wrote:

On 4/4/19 3:07 PM, Martin Storsjö wrote:
On Thu, 4 Apr 2019, Jacek Caban wrote:

Signed-off-by: Jacek Caban <ja...@codeweavers.com>
---
mingw-w64-crt/Makefile.am              |  2 +-
mingw-w64-crt/lib-common/msvcrt.def.in |  4 +-
mingw-w64-crt/lib32/msvcr100.def.in    |  4 +-
mingw-w64-crt/lib32/msvcr80.def.in     |  2 +
mingw-w64-crt/lib32/msvcr90.def.in     |  4 +-
mingw-w64-crt/lib64/msvcr100.def.in    |  4 +-
mingw-w64-crt/lib64/msvcr80.def.in     |  2 +
mingw-w64-crt/lib64/msvcr90.def.in     |  4 +-
mingw-w64-crt/misc/difftime.c          | 21 ----------
mingw-w64-crt/misc/difftime32.c        |  9 -----
mingw-w64-crt/misc/difftime64.c        |  9 -----
mingw-w64-headers/crt/time.h           | 55 +++++++++++---------------
12 files changed, 37 insertions(+), 83 deletions(-)
delete mode 100644 mingw-w64-crt/misc/difftime.c
delete mode 100644 mingw-w64-crt/misc/difftime32.c
delete mode 100644 mingw-w64-crt/misc/difftime64.c

Ok with me, if you extend the commit message to mention all the changes. The changes IMO now include the following three change categories:

- Use importlibs for more time functions
- Unify inline attribute strategies for time functions in headers
- Use _CRTIMP on more time functions


Multiple line in commit message usually is a good sign that the patch should be split ;) And I agree, I could do better job at that. I split the patch and pushed.

This turned out to break compilation in certain cases for me.

The culprit is that __forceinline is a bit deceptive (and so is __CRT_INLINE). For good reasons I was using __mingw_static_ovr here before, for the UCRT case.

These three macros expand to slightly different things depending on compiler and context, but for the C, modern clang/gcc case, they are as follows:

#define __CRT_INLINE extern inline __attribute__((__gnu_inline__))
#define __forceinline extern __inline__ 
__attribute__((__always_inline__,__gnu_inline__))
#define __mingw_static_ovr static __attribute__ ((__unused__)) __inline__ 
__cdecl

Both __CRT_INLINE and __forceinline declare the inline functions as extern, in combination with the gnu_inline attribute. The gnu_inline attribute, in combination with extern, means that when you take the address of the function, it shouldn't generate and reference the inline version of the function, but reference the extern copy of the function available in another translation unit.

This obviously is desireable for getting the same function pointer to a function in all translation units that refer to it, but doesn't work for functions that don't exist elsewhere in that form.

I'm not sure about how many of the existing cases of __forceinline and __CRT_INLINE that really intentionally want this behaviour, so I've proceeded cautiously and used __mingw_static_ovr in a few places for UCRT where I otherwise ran into issues.

But in any case, we either need to add import library aliases for these cases (which doesn't work for things that vary depending on _USE_32BIT_TIME_T), remove extern from __forceinline and __CRT_INLINE, or use a different inline attribute (e.g. __mingw_static_ovr) for these particular inlines.

// Martin

_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to