Skip to content

Commit b239a03

Browse files
committed
Refactor writeObjCMsgSendStub per feedback
1 parent da5183b commit b239a03

File tree

5 files changed

+47
-47
lines changed

5 files changed

+47
-47
lines changed

lld/MachO/Arch/ARM64.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ struct ARM64 : ARM64Common {
3737
uint64_t entryAddr) const override;
3838

3939
void writeObjCMsgSendStub(uint8_t *buf, Symbol *sym, uint64_t stubsAddr,
40-
uint64_t stubOffset, uint64_t selrefsVA,
41-
uint64_t selectorIndex, uint64_t gotAddr,
42-
uint64_t msgSendIndex) const override;
40+
uint64_t &stubOffset, uint64_t selrefsVA,
41+
uint64_t selectorIndex,
42+
Symbol *objcMsgSend) const override;
4343
void populateThunk(InputSection *thunk, Symbol *funcSym) override;
4444
void applyOptimizationHints(uint8_t *, const ObjFile &) const override;
4545
};
@@ -124,17 +124,35 @@ static constexpr uint32_t objcStubsSmallCode[] = {
124124
};
125125

126126
void ARM64::writeObjCMsgSendStub(uint8_t *buf, Symbol *sym, uint64_t stubsAddr,
127-
uint64_t stubOffset, uint64_t selrefsVA,
128-
uint64_t selectorIndex, uint64_t msgSendAddr,
129-
uint64_t msgSendIndex) const {
130-
if (config->objcStubsMode == ObjCStubsMode::fast)
127+
uint64_t &stubOffset, uint64_t selrefsVA,
128+
uint64_t selectorIndex,
129+
Symbol *objcMsgSend) const {
130+
uint64_t objcMsgSendAddr;
131+
uint64_t objcStubSize;
132+
uint64_t objcMsgSendIndex;
133+
134+
if (config->objcStubsMode == ObjCStubsMode::fast) {
135+
objcStubSize = target->objcStubsFastSize;
136+
objcMsgSendAddr = in.got->addr;
137+
objcMsgSendIndex = objcMsgSend->gotIndex;
131138
::writeObjCMsgSendFastStub<LP64>(buf, objcStubsFastCode, sym, stubsAddr,
132139
stubOffset, selrefsVA, selectorIndex,
133-
msgSendAddr, msgSendIndex);
134-
else
140+
objcMsgSendAddr, objcMsgSendIndex);
141+
} else {
142+
assert(config->objcStubsMode == ObjCStubsMode::small);
143+
objcStubSize = target->objcStubsSmallSize;
144+
if (auto *d = dyn_cast<Defined>(objcMsgSend)) {
145+
objcMsgSendAddr = d->getVA();
146+
objcMsgSendIndex = 0;
147+
} else {
148+
objcMsgSendAddr = in.stubs->addr;
149+
objcMsgSendIndex = objcMsgSend->stubsIndex;
150+
}
135151
::writeObjCMsgSendSmallStub<LP64>(buf, objcStubsSmallCode, sym, stubsAddr,
136152
stubOffset, selrefsVA, selectorIndex,
137-
msgSendAddr, msgSendIndex);
153+
objcMsgSendAddr, objcMsgSendIndex);
154+
}
155+
stubOffset += objcStubSize;
138156
}
139157

140158
// A thunk is the relaxed variation of stubCode. We don't need the

lld/MachO/Arch/ARM64_32.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ struct ARM64_32 : ARM64Common {
3434
void writeStubHelperEntry(uint8_t *buf, const Symbol &,
3535
uint64_t entryAddr) const override;
3636
void writeObjCMsgSendStub(uint8_t *buf, Symbol *sym, uint64_t stubsAddr,
37-
uint64_t stubOffset, uint64_t selrefsVA,
38-
uint64_t selectorIndex, uint64_t gotAddr,
39-
uint64_t msgSendIndex) const override;
37+
uint64_t &stubOffset, uint64_t selrefsVA,
38+
uint64_t selectorIndex,
39+
Symbol *objcMsgSend) const override;
4040
};
4141

4242
} // namespace
@@ -100,10 +100,9 @@ void ARM64_32::writeStubHelperEntry(uint8_t *buf8, const Symbol &sym,
100100
}
101101

102102
void ARM64_32::writeObjCMsgSendStub(uint8_t *buf, Symbol *sym,
103-
uint64_t stubsAddr, uint64_t stubOffset,
103+
uint64_t stubsAddr, uint64_t &stubOffset,
104104
uint64_t selrefsVA, uint64_t selectorIndex,
105-
uint64_t gotAddr,
106-
uint64_t msgSendIndex) const {
105+
Symbol *objcMsgSend) const {
107106
fatal("TODO: implement this");
108107
}
109108

lld/MachO/Arch/X86_64.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ struct X86_64 : TargetInfo {
3838
uint64_t entryAddr) const override;
3939

4040
void writeObjCMsgSendStub(uint8_t *buf, Symbol *sym, uint64_t stubsAddr,
41-
uint64_t stubOffset, uint64_t selrefsVA,
42-
uint64_t selectorIndex, uint64_t gotAddr,
43-
uint64_t msgSendIndex) const override;
41+
uint64_t &stubOffset, uint64_t selrefsVA,
42+
uint64_t selectorIndex,
43+
Symbol *objcMsgSend) const override;
4444

4545
void relaxGotLoad(uint8_t *loc, uint8_t type) const override;
4646
uint64_t getPageSize() const override { return 4 * 1024; }
@@ -182,16 +182,20 @@ static constexpr uint8_t objcStubsFastCode[] = {
182182
};
183183

184184
void X86_64::writeObjCMsgSendStub(uint8_t *buf, Symbol *sym, uint64_t stubsAddr,
185-
uint64_t stubOffset, uint64_t selrefsVA,
186-
uint64_t selectorIndex, uint64_t gotAddr,
187-
uint64_t msgSendIndex) const {
185+
uint64_t &stubOffset, uint64_t selrefsVA,
186+
uint64_t selectorIndex,
187+
Symbol *objcMsgSend) const {
188+
uint64_t objcMsgSendAddr = in.got->addr;
189+
uint64_t objcMsgSendIndex = objcMsgSend->gotIndex;
190+
188191
memcpy(buf, objcStubsFastCode, sizeof(objcStubsFastCode));
189192
SymbolDiagnostic d = {sym, sym->getName()};
190193
uint64_t stubAddr = stubsAddr + stubOffset;
191194
writeRipRelative(d, buf, stubAddr, 7,
192195
selrefsVA + selectorIndex * LP64::wordSize);
193196
writeRipRelative(d, buf, stubAddr, 0xd,
194-
gotAddr + msgSendIndex * LP64::wordSize);
197+
objcMsgSendAddr + objcMsgSendIndex * LP64::wordSize);
198+
stubOffset += target->objcStubsFastSize;
195199
}
196200

197201
void X86_64::relaxGotLoad(uint8_t *loc, uint8_t type) const {

lld/MachO/SyntheticSections.cpp

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -892,31 +892,11 @@ void ObjCStubsSection::writeTo(uint8_t *buf) const {
892892
assert(in.objcSelrefs->isFinal);
893893

894894
uint64_t stubOffset = 0;
895-
uint64_t objcMsgSendAddr;
896-
uint64_t objcStubSize;
897-
uint64_t objcMsgSendIndex;
898-
if (config->objcStubsMode == ObjCStubsMode::fast) {
899-
objcStubSize = target->objcStubsFastSize;
900-
objcMsgSendAddr = in.got->addr;
901-
objcMsgSendIndex = objcMsgSend->gotIndex;
902-
} else {
903-
assert(config->objcStubsMode == ObjCStubsMode::small);
904-
objcStubSize = target->objcStubsSmallSize;
905-
if (auto *d = dyn_cast<Defined>(objcMsgSend)) {
906-
objcMsgSendAddr = d->getVA();
907-
objcMsgSendIndex = 0;
908-
} else {
909-
objcMsgSendAddr = in.stubs->addr;
910-
objcMsgSendIndex = objcMsgSend->stubsIndex;
911-
}
912-
}
913-
914895
for (size_t i = 0, n = symbols.size(); i < n; ++i) {
915896
Defined *sym = symbols[i];
916897
target->writeObjCMsgSendStub(buf + stubOffset, sym, in.objcStubs->addr,
917898
stubOffset, in.objcSelrefs->getVA(), i,
918-
objcMsgSendAddr, objcMsgSendIndex);
919-
stubOffset += objcStubSize;
899+
objcMsgSend);
920900
}
921901
}
922902

lld/MachO/Target.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,9 @@ class TargetInfo {
7070
uint64_t entryAddr) const = 0;
7171

7272
virtual void writeObjCMsgSendStub(uint8_t *buf, Symbol *sym,
73-
uint64_t stubsAddr, uint64_t stubOffset,
73+
uint64_t stubsAddr, uint64_t &stubOffset,
7474
uint64_t selrefsVA, uint64_t selectorIndex,
75-
uint64_t gotAddr,
76-
uint64_t msgSendIndex) const = 0;
75+
Symbol *objcMsgSend) const = 0;
7776

7877
// Symbols may be referenced via either the GOT or the stubs section,
7978
// depending on the relocation type. prepareSymbolRelocation() will set up the

0 commit comments

Comments
 (0)