[Top][All Lists]

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

libobjc2 updates

From: David Chisnall
Subject: libobjc2 updates
Date: Sun, 31 Mar 2019 12:58:29 +0100
User-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.6.0

Hello the list,

A kind volunteer gave me access to a BeagleBone Black running FreeBSD, so I have now been able to test the runtime with ARM (AArch32) and fixed a few issues:

- [Probably FreeBSD specific], on ARM .init_array initialisers are run, but .ctors are not, so the compiler needs to use .init_array for the call into the runtime to register a binary. This is now fixed in upstream LLVM.

- The ARM objc_msgSend implementation no longer uses text relocations, so can be mapped read-only in the process. This should fix it on 32-bit Android. I also have a patch in the related issue for AArch64 - anyone with a 64-bit ARM system handy, please test it!

- The C++ exception structure used by the runtime did not incorporate the extra fields that the ARM EH ABI adds. This caused some state corruption with Objective-C++ exceptions and is now fixed.

- [Possibly FreeBSD specific] the GNU unwinder on ARM appears to not quite follow the ARM EH ABI spec. It calls the personality function to install the handler without doing a phase-1 search. This is now worked around in the runtime.

The runtime (master branch, due to be released as 2.0) now passes all of the tests on ARM, except for a small number that are not architecture specific, but run out of memory on the test platform.

I've also fixed a few other bugs:

- A memory leak in @synchronized that Fred pointed out. We only leaked a few bytes for every object used with @synchronized, but in a loop it was easy for this to be a problem. I had not seen this issue because I avoid using @synchronized entirely. It is a horrible feature in Objective-C and using __attribute__((cleanup)) for the unlock in C (or RAII in C++) lets you accomplish the same thing with less inefficiency. The feature wouldn't be such a problem if it were defined to send -lock / -unlock messages to the object, but requiring the runtime to maintain a lock for each object is awkward.

- There was an issue with static builds where the Protocol class was not being linked unless explicitly used outside of the runtime. This, in turn, broke the runtime's detection that the __objc_load function was being called for the runtime itself, which broke the ABI mismatch detection. This is now fixed and static linking probably works again.

- The compiler occasionally emits negative offsets for ivars in the non-fragile ABI when, in the fragile ABI version of the class they would be within the space allocated by the superclass. The runtime was not handling this correctly and so we were ending up with nonsense (sometimes negative) offsets for classes that contained BOOLs as their first fields if the compiler could see the layout of the superclass and it ended with something less than the size of a pointer. This triggered some very odd behaviour in -gui with some non-default defaults values set (and almost certainly broke GSMime, though I didn't see any reports of that).

I have now tested and committed Dustin Howett's patches to clang for improving the Windows support. It is now possible to use upstream clang (master branch, not any releases yet) to build WinObjC and have all of the tests pass (with some not-yet-merged patches to WinObjC, including updating their copy of libobjc2 to a recent trunk).

On Windows, we now have fully interoperable exceptions: The 2.0 ABI uses SEH-compatible exceptions and Objective-C++ code compiled with clang-cl will use the same ABI as the visual studio compiler for C++.

I have now moved the CI over to using Azure Pipelines, so there are CI builds on Windows and Ubuntu. This should help avoiding regressions on Windows.

If you see any other issues, please report them on GitHub!


reply via email to

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