gnustep-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Building GUI with libobjc2 for Windows MSVC


From: Frederik Seiffert
Subject: Re: Building GUI with libobjc2 for Windows MSVC
Date: Fri, 5 Nov 2021 23:21:36 +0100

Hi David,

Sorry it took me a while to give this a try.

Am 27.10.2021 um 14:36 schrieb David Chisnall <gnustep@theravensnest.org>:

Since all of them end with a close brace, I suspect that there's something in the field names that isn't a valid PE/COFF symbol name (at least for dllexported things, not sure if the restrictions are different here).  The second one was the easiest to find, since only one class in GNUstep looks like it implements this (note: *something* is wrong in your build environment because I don't think we should be seeing that version when targeting an ARC-enabled runtime and the one fourth from the button looks as if it's trying to use the old NeXT-style exceptions rather than SEH, but it helps find the bug so let's leave it for now).

Good catch. However it looks like autorelease_array_list is always referenced in _reallyDealloc even with ARC_RUNTIME being set. I’ll have to look into the SETJMP one in more detail.

The generated variable should be:

__objc_ivar_offset_NSAutoreleasePool._release.^{autorelease_array_list=^{autorelease_array_list}II[0\01]}

So it looks as if it's being truncated at the first equals sign?  I wonder if equals is not permitted in dllexported symbols?  This doesn't seem to cause problems for DLL-local symbols on Windows.

In clang/lib/CodeGen/CGObjCGNU.cpp, you'll see this line:

   // Prevent the @ from being interpreted as a symbol version.
   std::replace(TypeEncoding.begin(), TypeEncoding.end(),
     '@', '\1');

Underneath it, can you add this:

   std::replace(TypeEncoding.begin(), TypeEncoding.end(),
     '=', '\2');

Yes that works!

Let me know if that fixes things.  If so, it's an ABI break on Windows, so it probably needs to be guarded on whether the symbol is dllexported and may need an explicit opt-in flag.

I guess the only project using this setup so far is WinObjC, which seems like it won’t get a compiler update anytime soon, so if it’s an option to break the ABI without these flags that would seem ok to me too.

Thanks!
Frederik


reply via email to

[Prev in Thread] Current Thread [Next in Thread]