[llvm-branch-commits] [lld] [lld][MachO] Support Objective-C class selector stubs (PR #219744)

Zhaoxuan Jiang via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Oct 30 00:51:11 PDT 2026


================
@@ -152,6 +178,63 @@ void ARM64::writeObjCMsgSendStub(uint8_t *buf, Symbol *sym, uint64_t stubsAddr,
   stubOffset += objcStubSize;
 }
 
+void ARM64::writeObjCMsgSendClassStub(uint8_t *buf, Symbol *stubSym,
+                                      uint64_t stubsAddr, uint64_t &stubOffset,
+                                      uint64_t selrefVA, Symbol *classSym,
+                                      Symbol *objcMsgSend) const {
+  SymbolDiagnostic d = {stubSym, stubSym->getName()};
+  auto *buf32 = reinterpret_cast<uint32_t *>(buf);
+
+  auto pcPageBits = [stubsAddr, stubOffset](int i) {
+    return pageBits(stubsAddr + stubOffset + i * sizeof(uint32_t));
+  };
+  auto writeClassLoad = [&](const uint32_t *code) {
+    uint64_t classVA;
+    uint32_t pageOffCode = code[1];
+    if (auto *defined = dyn_cast<Defined>(classSym)) {
+      classVA = defined->getVA();
+      pageOffCode = 0x91000000; // add x0, x0, _OBJC_CLASS_$_Foo at pageoff
+    } else {
+      classVA = in.got->addr + classSym->gotIndex * LP64::wordSize;
+    }
----------------
nocchijiang wrote:

```suggestion
    if (needsBinding(classSym)) {
      classVA = in.got->addr + classSym->gotIndex * LP64::wordSize;
    } else {
      classVA = classSym->getVA();
      pageOffCode = 0x91000000; // add x0, x0, _OBJC_CLASS_$_Foo at pageoff
    }
```

https://github.com/llvm/llvm-project/pull/219744


More information about the llvm-branch-commits mailing list