Hi David, Sorry it took me a while to give this a try.
> Am 27.10.2021 um 14:36 schrieb David Chisnall <gnus...@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