[PATCH] D27827: [ObjC] CodeGen support for @available on macOS

Alex Lorenz via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 19 02:25:08 PST 2016


arphaman added a comment.

In https://reviews.llvm.org/D27827#625438, @erik.pilkington wrote:

> I seem to remember that mapping from kernel versions to marketing versions was tossed around as a potential alternative to Gestalt. I think that the problem was Apple sometimes introduces (or reserves the right to introduce) new SDKs in a patch release (ie, Z in X.Y.Z), which wouldn't necessary imply a new kernel version, and would still need to be queried by @available. This makes it impossible to use kernel version in the general case (Or at least I think, it would be nice if someone internal to Apple could confirm this?). This rules out using `sysctl()` and the like.


This sounds like a legitimate concern, I'll try to get some information about this.

> AFAIK this just leaves `Gestalt()` and Objective-C's `NSProcessInfo`, the latter would mean pulling in the Objective-C runtime, which would be unfortunate for C users (using the `__builtin_available` spelling). I don't think `Gestalt()` is in any danger of actually being removed, so we might as well use it. The only alternative I know of to those would be manually parsing the `SystemVersion.plist` XML file, but I think that might cause problems with sandboxed processes (right?). Any thoughts here would be much appreciated, `Gestalt()` is by no means a perfect solution.

Sandboxed applications are allowed to read that PLIST file, since https://developer.apple.com/library/content/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html states the applications are permitted to read files that are world readable in `/System`. I confirmed that with a test sandboxed app as well. It would seem that reading that PLIST file is a good solution if we can get access to the PLIST APIs from compiler-rt (+ we can always fallback to `Gestalt`/`sysctl` if something goes wrong).

> Compiler-rt does seem like a good place it put this, should I move the runtime code there instead?

Yes, please.

Btw, compiler-rt already has code that checks which version of macOS it's running on (https://github.com/llvm-project/compiler-rt/blob/master/lib/sanitizer_common/sanitizer_mac.cc#L410). It uses `sysctl` as well. I'm not sure if we can somehow refactor and reuse this code or not (since ours will be in builtins), but at least it's a good starting point.

> Thanks for taking a look!
> Erik


https://reviews.llvm.org/D27827





More information about the cfe-commits mailing list