================
@@ -415,11 +417,87 @@ bool CGObjCRuntime::canMessageReceiverBeNull(
bool CGObjCRuntime::canClassObjectBeUnrealized(
const ObjCInterfaceDecl *CalleeClassDecl, CodeGenFunction &CGF) const {
- // TODO
+ if (!CalleeClassDecl || isWeakLinkedClass(CalleeClassDecl))
+ return true;
+
+ // Heuristic 1: +load method on this class or any subclass
+ // If the class or any of its subclasses has a +load method, it's realized
+ // when the binary is loaded. We cache this information to avoid repeatedly
+ // scanning the translation unit.
+ if (getOrPopulateRealizedClasses().contains(CalleeClassDecl))
+ return false;
+
+ // Heuristic 2: using Self / Super
+ // If we're currently executing a method of ClassDecl (or a subclass),
+ // then ClassDecl must already be realized.
+ if (const auto *CurMethod =
+ dyn_cast_or_null<ObjCMethodDecl>(CGF.CurCodeDecl)) {
+ const ObjCInterfaceDecl *CallerCalssDecl = CurMethod->getClassInterface();
+ if (CallerCalssDecl && CalleeClassDecl->isSuperClassOf(CallerCalssDecl))
+ return false;
+ }
+
+ // Heuristic 3: previously realized classes
+ // If we've already emitted a class method call for this class (or a
subclass)
+ // earlier, then the class must be realized.
+ //
+ // TODO: Iter over all dominating blocks instead of just looking at the
+ // current block. While we can construct a DT using CFG.CurFn, it is
expensive
+ // to do so repeatly when CGF is still emitting blocks.
+ if (auto *CurBB = CGF.Builder.GetInsertBlock()) {
----------------
ojhunt wrote:
Can the insertion block be null at the point we hit this code?
If it is I'd rather this be structured as
```cpp
auto *CurBB = CGF.Builder.GetInsertBlock();
if (!CurBB)
return true;
```
This keeps the logical flow much more straight line, and makes dealing with the
absurd column limit of our style rules easier.
https://github.com/llvm/llvm-project/pull/170619
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits