On Wed, 27 Jun 2018, Martin Storsjö wrote:

On Tue, 26 Jun 2018, Jacek Caban wrote:

On 06/26/2018 01:44 PM, Martin Storsjö wrote:
On Tue, 26 Jun 2018, Jacek Caban wrote:

I still need to run some test, but I it seems ready for review.

The important change is __forceinline. We add extern to GCC macro,
because that matches closer intended behaviour. clang supports
__forceinline itself if -fms-extensions is used, so we should just leave
it to the compiler in that case (also __ptr32, __unaligned and __w64, so
I changed them as well while I was at it). Without -fms-extensions,
__always_inline__ is expected and as far as I can tell (and my testing
conforms that), it matches intended behaviour without additional
attributes.

Signed-off-by: Jacek Caban <[email protected]>
---
mingw-w64-headers/crt/_mingw.h.in | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

I think the patch is fine, but it took me a couple re-reads until I
got the full explanation of the commit message.

Sorry, I probably could explain that cleaner.

I can try to put this patch through test building of a number of
projects that I build with clang+mingw, I'll let you know how it goes.

Thanks would be great. Thanks!

I did a test build with this patch, and it failed at building winpthreads, with the following error:

libtool: link: i686-w64-mingw32-clang -shared src/.libs/libwinpthread_la-barrier.o src/.libs/libwinpthread_la-cond.o src/.libs/libwinpthread_la-misc.o src/.libs/libwinp thread_la-mutex.o src/.libs/libwinpthread_la-rwlock.o src/.libs/libwinpthread_la-spinlock.o src/.libs/libwinpthread_la-thread.o src/.libs/libwinpthread_la-ref.o src/.lib s/libwinpthread_la-sem.o src/.libs/libwinpthread_la-sched.o src/.libs/libwinpthread_la-clock.o src/.libs/libwinpthread_la-nanosleep.o src/.libs/version.o -L./fakelib -g -O2 -no-pthread -o .libs/libwinpthread-1.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker .libs/libwinpthread.dll.a lld-link: error: duplicate symbol: _wcsnlen_s in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _NtCurrentTeb in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _GetCurrentFiber in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _GetFiberData in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpInitializeCallbackEnviron in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpSetCallbackThreadpool in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpSetCallbackCleanupGroup in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpSetCallbackActivationContext in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpSetCallbackNoActivationContext in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpSetCallbackLongFunction in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpSetCallbackRaceWithDll in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpSetCallbackFinalizationCallback in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpSetCallbackPersistent in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: _TpDestroyCallbackEnviron in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: __InterlockedAnd64 in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: __InterlockedOr64 in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: __InterlockedXor64 in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: __InterlockedIncrement64 in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: __InterlockedDecrement64 in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: duplicate symbol: __InterlockedExchange64 in src/.libs/libwinpthread_la-barrier.o and in src/.libs/libwinpthread_la-cond.o lld-link: error: too many errors emitted, stopping now (use /errorlimit:0 to see all errors) clang-7: error: linker command failed with exit code 1 (use -v to see invocation)
Makefile:680: recipe for target 'libwinpthread.la' failed
make[2]: *** [libwinpthread.la] Error 1

And just to make it clear - this is code that builds fine with clang+lld as things stand right now (without -fms-extensions anywhere).

What was the exact issue you're trying to fix by tweaking the __forceinline define? And for the firefox case, did you fix it by adding -fms-extensions?

I do remember running into a few issues with inlines in our headers, behaving differently than with gcc - mainly in cases with non-static inline. GCC would either emit the function (as inline so it doesn't conflict with other definitions) or inline it totally. While clang on the other hand would conclude that since it's non-static inline, there will be a function definition elsewhere and just try to reference that (which fails).

Those particular cases that I've run into, I've worked around so far in one way or another though (but there's probably more of them that I haven't happened to use, while firefox does), but I'm pretty sure the headers rely on some aspects that aren't really guaranteed to behave in that way, and in those cases, we maybe should fix the headers and how they use inline.

// Martin
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to