Skip to content

Commit 860e862

Browse files
committed
[lld/mac] Simplify encodeDylibOrdinal() a bit
Only one of the two callers used the lastBinding parameter, so do that work at that one call site. Extract a ordinalForDylibSymbol() helper to make this tidy. No behavior change. Differential Revision: https://reviews.llvm.org/D97597
1 parent ab3ea27 commit 860e862

File tree

1 file changed

+20
-23
lines changed

1 file changed

+20
-23
lines changed

lld/MachO/SyntheticSections.cpp

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -279,28 +279,21 @@ static void encodeBinding(const Symbol *sym, const OutputSection *osec,
279279
}
280280

281281
// Non-weak bindings need to have their dylib ordinal encoded as well.
282-
static void encodeDylibOrdinal(const DylibSymbol *dysym, Binding *lastBinding,
283-
raw_svector_ostream &os) {
284-
using namespace llvm::MachO;
282+
static int16_t ordinalForDylibSymbol(const DylibSymbol &dysym) {
283+
return dysym.isDynamicLookup() ? MachO::BIND_SPECIAL_DYLIB_FLAT_LOOKUP
284+
: dysym.getFile()->ordinal;
285+
}
285286

286-
int16_t ordinal = dysym->isDynamicLookup() ? BIND_SPECIAL_DYLIB_FLAT_LOOKUP
287-
: dysym->getFile()->ordinal;
288-
289-
if (lastBinding == nullptr ||
290-
lastBinding->ordinal != ordinal) {
291-
if (ordinal <= 0) {
292-
os << static_cast<uint8_t>(
293-
BIND_OPCODE_SET_DYLIB_SPECIAL_IMM |
294-
(ordinal & BIND_IMMEDIATE_MASK));
295-
} else if (ordinal <= BIND_IMMEDIATE_MASK) {
296-
os << static_cast<uint8_t>(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
297-
ordinal);
298-
} else {
299-
os << static_cast<uint8_t>(BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB);
300-
encodeULEB128(ordinal, os);
301-
}
302-
if (lastBinding != nullptr)
303-
lastBinding->ordinal = ordinal;
287+
static void encodeDylibOrdinal(int16_t ordinal, raw_svector_ostream &os) {
288+
using namespace llvm::MachO;
289+
if (ordinal <= 0) {
290+
os << static_cast<uint8_t>(BIND_OPCODE_SET_DYLIB_SPECIAL_IMM |
291+
(ordinal & BIND_IMMEDIATE_MASK));
292+
} else if (ordinal <= BIND_IMMEDIATE_MASK) {
293+
os << static_cast<uint8_t>(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM | ordinal);
294+
} else {
295+
os << static_cast<uint8_t>(BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB);
296+
encodeULEB128(ordinal, os);
304297
}
305298
}
306299

@@ -336,7 +329,11 @@ void BindingSection::finalizeContents() {
336329
return a.target.getVA() < b.target.getVA();
337330
});
338331
for (const BindingEntry &b : bindings) {
339-
encodeDylibOrdinal(b.dysym, &lastBinding, os);
332+
int16_t ordinal = ordinalForDylibSymbol(*b.dysym);
333+
if (ordinal != lastBinding.ordinal) {
334+
encodeDylibOrdinal(ordinal, os);
335+
lastBinding.ordinal = ordinal;
336+
}
340337
if (auto *isec = b.target.section.dyn_cast<const InputSection *>()) {
341338
encodeBinding(b.dysym, isec->parent, isec->outSecOff + b.target.offset,
342339
b.addend, /*isWeakBinding=*/false, lastBinding, os);
@@ -558,7 +555,7 @@ uint32_t LazyBindingSection::encode(const DylibSymbol &sym) {
558555
uint64_t offset = in.lazyPointers->addr - dataSeg->firstSection()->addr +
559556
sym.stubsIndex * WordSize;
560557
encodeULEB128(offset, os);
561-
encodeDylibOrdinal(&sym, nullptr, os);
558+
encodeDylibOrdinal(ordinalForDylibSymbol(sym), os);
562559

563560
uint8_t flags = MachO::BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM;
564561
if (sym.isWeakRef())

0 commit comments

Comments
 (0)