[lld] [lld-macho][arm64] implement -objc_stubs_small (PR #78665)
Ellis Hoag via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 22 12:16:48 PST 2024
================
@@ -809,31 +809,50 @@ void StubHelperSection::setUp() {
ObjCStubsSection::ObjCStubsSection()
: SyntheticSection(segment_names::text, section_names::objcStubs) {
flags = S_ATTR_SOME_INSTRUCTIONS | S_ATTR_PURE_INSTRUCTIONS;
- align = target->objcStubsAlignment;
+ align = config->objcStubsMode == ObjCStubsMode::fast
+ ? target->objcStubsFastAlignment
+ : target->objcStubsSmallAlignment;
}
void ObjCStubsSection::addEntry(Symbol *sym) {
assert(sym->getName().starts_with(symbolPrefix) && "not an objc stub");
StringRef methname = sym->getName().drop_front(symbolPrefix.size());
offsets.push_back(
in.objcMethnameSection->getStringOffset(methname).outSecOff);
+
+ auto stubSize = config->objcStubsMode == ObjCStubsMode::fast
+ ? target->objcStubsFastSize
+ : target->objcStubsSmallSize;
Defined *newSym = replaceSymbol<Defined>(
sym, sym->getName(), nullptr, isec,
- /*value=*/symbols.size() * target->objcStubsFastSize,
- /*size=*/target->objcStubsFastSize,
+ /*value=*/symbols.size() * stubSize,
+ /*size=*/stubSize,
/*isWeakDef=*/false, /*isExternal=*/true, /*isPrivateExtern=*/true,
/*includeInSymtab=*/true, /*isReferencedDynamically=*/false,
/*noDeadStrip=*/false);
symbols.push_back(newSym);
}
void ObjCStubsSection::setUp() {
- Symbol *objcMsgSend = symtab->addUndefined("_objc_msgSend", /*file=*/nullptr,
- /*isWeakRef=*/false);
+ objcMsgSend = symtab->addUndefined("_objc_msgSend", /*file=*/nullptr,
+ /*isWeakRef=*/false);
+ if (auto *undefined = dyn_cast<Undefined>(objcMsgSend))
+ treatUndefinedSymbol(*undefined,
+ "lazy binding (normally in libobjc.dylib)");
objcMsgSend->used = true;
- in.got->addEntry(objcMsgSend);
- assert(objcMsgSend->isInGot());
- objcMsgSendGotIndex = objcMsgSend->gotIndex;
+ if (config->objcStubsMode == ObjCStubsMode::fast) {
+ in.got->addEntry(objcMsgSend);
+ assert(objcMsgSend->isInGot());
+ } else {
+ assert(config->objcStubsMode == ObjCStubsMode::small);
+ // In line with ld64's behavior, when objc_msgSend is a direct symbol,
+ // we directly reference it.
+ // In other cases, typically when binding in libobjc.dylib,
+ // we generate a stub to invoke objc_msgSend.
+ auto *d = dyn_cast<Defined>(objcMsgSend);
+ if (!d)
+ in.stubs->addEntry(objcMsgSend);
----------------
ellishg wrote:
Can we use `!isa<Defined>(objcMsgSend)` instead?
https://github.com/llvm/llvm-project/pull/78665
More information about the llvm-commits
mailing list