Objective-C Runtime specific code in CGObjC.cpp

In clang there is a separation between the Objective-C language and the runtime implementation. Code that is specific to the runtime should be in one of the various Objective-C runtime subclasses like "CGObjCGNU.cpp" and "CGObjCMac.cpp".

It occurred to me today, that this separation is not adhered to very well. And it seems to be getting worse (IMO).

Here's one simple example of many, on line 2534: https://github.com/llvm/llvm-project/blob/master/clang/lib/CodeGen/CGObjC.cpp#L2534

/// Allocate the given objc object.
///   call i8* \@objc_alloc(i8* %value)
llvm::Value *CodeGenFunction::EmitObjCAlloc(llvm::Value *value,
                                             llvm::Type *resultType) {
   return emitObjCValueOperation(*this, value, resultType,

This is basically hardwired to the Apple runtime. If any runtime wants to partake in this codepath (*) , it is forced not only to use Apple's naming but also its parameter scheme (you can't have an extra parameter for instance).

Second the llvm::type of the function is also defined (I believe), as the resulting value is then cached in "getObjCEntryPoints" which specifies if something is a llvm::InlineAsm or a llvm::Constant. That also seems runtime specific.

I'd expect code like CodeGenFunction::EmitObjCAlloc to be in "CGObjCMac.cpp" and declared overridable in "CGObjCRuntime.h".



(*) shouldUseRuntimeFunctionsForAlloc, which is off by default for all non-Apple runtimes.