On Monday 19 September 2022 16:50:33 Martin Storsjö wrote:
> On Mon, 19 Sep 2022, Pali Rohár wrote:
> 
> > On Monday 19 September 2022 15:33:45 Martin Storsjö wrote:
> > > On Sat, 17 Sep 2022, Pali Rohár wrote:
> > > 
> > > > ---
> > > > mingw-w64-crt/Makefile.am            |  3 +++
> > > > mingw-w64-crt/stdio/ucrt__scprintf.c | 21 +++++++++++++++++++++
> > > > mingw-w64-crt/stdio/ucrt__snprintf.c | 21 +++++++++++++++++++++
> > > > mingw-w64-crt/stdio/ucrt__snscanf.c  | 21 +++++++++++++++++++++
> > > > 4 files changed, 66 insertions(+)
> > > > create mode 100644 mingw-w64-crt/stdio/ucrt__scprintf.c
> > > > create mode 100644 mingw-w64-crt/stdio/ucrt__snprintf.c
> > > > create mode 100644 mingw-w64-crt/stdio/ucrt__snscanf.c
> > > 
> > > I fail to see the motivation for these three patches.
> > > 
> > > Sure there are inconsistencies currently (how we have a non-inline
> > > _vscprintf today but _scprintf is inline), but for all the existing ones, 
> > > we
> > > consistently have either inline or extern definition - but not both.
> > 
> > For different checks (like in autoconf) it is needed to have functions
> > linkable/exported from standard library. As these checks are doing
> > linking without including header files. This is reason why there is e.g.
> > snprintf function in mingw-w64 crt library.
> 
> Yes, I know that this is the reason for why I moved those functions there.
> But if moving other functions, I'd like to hear that specifically this, or
> something else, is the motivation.
> 
> We didn't move all inline functions into external ones, only ones that we
> know that common autoconf scripts check for.
> 
> Also, most of them, which are standard C functions, are such that the
> standard mandates that they have extern linkage - but _scprintf isn't one of
> those that the standard say anything about.
> 
> > And for optimizations, it is really not a good idea to use another
> > function wrapper which just call another function. This is reason why
> > functions are defined as inline.
> 
> So far, we have mostly not had this, not for any of the UCRT functions at
> least.
> 
> If we suddenly want that, then this should be specifically labelled as a
> patch that explicit does that change, so that it can be evaluated at face
> value, not sneakily trying to change policy/common style as part of a
> different change.
> 
> And if we really are changing policy to duplicate function definitions for
> performance reasons, I'm sure that the main printf/snprintf functions would
> be a better target to start with, than _scprintf. And then it would also be
> nice to have any actual numbers to back it up, to justify the added
> maintaince burden of duplicate definitions.
> 
> > > So while some reshuffling might be warranted - if there's a good reason 
> > > for
> > > it - I'd prefer to make them either entirely inline or entirely extern, 
> > > when
> > > doing such reshuffling.
> > > 
> > > // Martin
> > 
> > I think that C99 requires that inline functions need to have also
> > non-inline variant for external linkage.
> 
> There are many, many different variants of inline behaviour - C89 inline,
> C99 inline, static inline, extern inline, gnu_inline, etc. There's a couple
> different styles used here; all the inline functions that we're talking
> about here have static inline linkage - which doesn't require any external
> linkage version of the function.
> 
> When dealing with the other ones that do require external linkage to be
> present, there's a whole rat's nest of potential issues, since sometimes one
> compiler never tries to use the external version, but other compilers do,
> etc.
> 
> > Anyway, my motivation was to build mingw-w64 runtime without dependency
> > on particular msvcrt/ucrt CRT code, so CRT dependent code would be
> > constructed at application compile time. And for this, it is needed that
> > mingw-w64 runtime/helper functions would not use any inline ucrt
> > function, so it would be CRT independent.
> 
> Ok, so this is the core of what you're working towards - good to have that
> out in the clear.
> 
> What runtime do you specifically mean, which currently is CRT dependent but
> should be independent? Currently, libmingwex.a and all the other
> mingw-w64-crt bits should be, as far as I know, CRT independent (but there
> can of course be bits that I've missed). All those bits are specifically
> compiled with "-D__MSVCRT_VERSION__=0x700" today, so regardless of what is
> set as default version in the headers, these should always be built the same
> way today. The intent is that all symbols that those refer to should be
> provided by the various lib*crt*.a.
> 
> If you mean other runtimes (libgcc, libstdc++, libc++, winopthreads etc),
> then reducing use of inline functions does reduce the variation between
> different CRT choices - yes - but it doesn't elimitate it entirely, since
> there are public structs that have different layout and different members
> depending on the CRT choice. For static libraries, something like that might
> help, but for DLL builds of them, the DLL is already finalized so there's
> not much that can be changed after the fact.
> 
> Can you elaborate on how you meant to construct such code at application
> compile time?
> 
> // Martin

Hello! Thank you very much for all those details. I did not investigated
everything yet, just small subset. But runtime I mean all of them which
you mentioned (from mingw-w64-crt to libgcc/stdc++...). Public
structures and dll libs are problematic. I was planning to look at it
what is different, how and what can be done to achieve binary
compatibility.

The main issue which I see is that if you "compile" source code (gcc -c)
of some application then it already reference ucrt symbols (if mingw-w64
runtime was compiled for ucrt) because header files automatically inline
some ucrt functions. Same for msvcrt.

I see that mingw-w64 crt is compiled with "-D__MSVCRT_VERSION__=0x700"
which you mentioned, and which should "workaround" above issue.

So if this issue can be "fixed" then building static libraries can be
CRT independent.

And back to the list, function _snprintf is used by lot of applications
as this is "native" msvcrt function and because msvcrt does not provide
real C99 snprintf. So that is why I chose this one. Just for
information.


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

Reply via email to