diff --git a/lld/MachO/SyntheticSections.cpp b/lld/MachO/SyntheticSections.cpp --- a/lld/MachO/SyntheticSections.cpp +++ b/lld/MachO/SyntheticSections.cpp @@ -279,28 +279,21 @@ } // Non-weak bindings need to have their dylib ordinal encoded as well. -static void encodeDylibOrdinal(const DylibSymbol *dysym, Binding *lastBinding, - raw_svector_ostream &os) { - using namespace llvm::MachO; +static int16_t ordinalForDylibSymbol(const DylibSymbol &dysym) { + return dysym.isDynamicLookup() ? MachO::BIND_SPECIAL_DYLIB_FLAT_LOOKUP + : dysym.getFile()->ordinal; +} - int16_t ordinal = dysym->isDynamicLookup() ? BIND_SPECIAL_DYLIB_FLAT_LOOKUP - : dysym->getFile()->ordinal; - - if (lastBinding == nullptr || - lastBinding->ordinal != ordinal) { - if (ordinal <= 0) { - os << static_cast( - BIND_OPCODE_SET_DYLIB_SPECIAL_IMM | - (ordinal & BIND_IMMEDIATE_MASK)); - } else if (ordinal <= BIND_IMMEDIATE_MASK) { - os << static_cast(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM | - ordinal); - } else { - os << static_cast(BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB); - encodeULEB128(ordinal, os); - } - if (lastBinding != nullptr) - lastBinding->ordinal = ordinal; +static void encodeDylibOrdinal(int16_t ordinal, raw_svector_ostream &os) { + using namespace llvm::MachO; + if (ordinal <= 0) { + os << static_cast(BIND_OPCODE_SET_DYLIB_SPECIAL_IMM | + (ordinal & BIND_IMMEDIATE_MASK)); + } else if (ordinal <= BIND_IMMEDIATE_MASK) { + os << static_cast(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM | ordinal); + } else { + os << static_cast(BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB); + encodeULEB128(ordinal, os); } } @@ -336,7 +329,11 @@ return a.target.getVA() < b.target.getVA(); }); for (const BindingEntry &b : bindings) { - encodeDylibOrdinal(b.dysym, &lastBinding, os); + int16_t ordinal = ordinalForDylibSymbol(*b.dysym); + if (ordinal != lastBinding.ordinal) { + encodeDylibOrdinal(ordinal, os); + lastBinding.ordinal = ordinal; + } if (auto *isec = b.target.section.dyn_cast()) { encodeBinding(b.dysym, isec->parent, isec->outSecOff + b.target.offset, b.addend, /*isWeakBinding=*/false, lastBinding, os); @@ -558,7 +555,7 @@ uint64_t offset = in.lazyPointers->addr - dataSeg->firstSection()->addr + sym.stubsIndex * WordSize; encodeULEB128(offset, os); - encodeDylibOrdinal(&sym, nullptr, os); + encodeDylibOrdinal(ordinalForDylibSymbol(sym), os); uint8_t flags = MachO::BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM; if (sym.isWeakRef())