diff --git a/lld/MachO/Arch/ARM.cpp b/lld/MachO/Arch/ARM.cpp --- a/lld/MachO/Arch/ARM.cpp +++ b/lld/MachO/Arch/ARM.cpp @@ -34,7 +34,7 @@ void writeStub(uint8_t *buf, const Symbol &) const override; void writeStubHelperHeader(uint8_t *buf) const override; - void writeStubHelperEntry(uint8_t *buf, const DylibSymbol &, + void writeStubHelperEntry(uint8_t *buf, const Symbol &, uint64_t entryAddr) const override; void relaxGotLoad(uint8_t *loc, uint8_t type) const override; @@ -148,7 +148,7 @@ fatal("TODO: implement this"); } -void ARM::writeStubHelperEntry(uint8_t *buf, const DylibSymbol &sym, +void ARM::writeStubHelperEntry(uint8_t *buf, const Symbol &sym, uint64_t entryAddr) const { fatal("TODO: implement this"); } diff --git a/lld/MachO/Arch/ARM64.cpp b/lld/MachO/Arch/ARM64.cpp --- a/lld/MachO/Arch/ARM64.cpp +++ b/lld/MachO/Arch/ARM64.cpp @@ -31,7 +31,7 @@ ARM64(); void writeStub(uint8_t *buf, const Symbol &) const override; void writeStubHelperHeader(uint8_t *buf) const override; - void writeStubHelperEntry(uint8_t *buf, const DylibSymbol &, + void writeStubHelperEntry(uint8_t *buf, const Symbol &, uint64_t entryAddr) const override; const RelocAttrs &getRelocAttrs(uint8_t type) const override; void populateThunk(InputSection *thunk, Symbol *funcSym) override; @@ -100,7 +100,7 @@ 0x00000000, // 08: l0: .long 0 }; -void ARM64::writeStubHelperEntry(uint8_t *buf8, const DylibSymbol &sym, +void ARM64::writeStubHelperEntry(uint8_t *buf8, const Symbol &sym, uint64_t entryVA) const { ::writeStubHelperEntry(buf8, stubHelperEntryCode, sym, entryVA); } diff --git a/lld/MachO/Arch/ARM64Common.h b/lld/MachO/Arch/ARM64Common.h --- a/lld/MachO/Arch/ARM64Common.h +++ b/lld/MachO/Arch/ARM64Common.h @@ -135,7 +135,7 @@ inline void writeStubHelperEntry(uint8_t *buf8, const uint32_t stubHelperEntryCode[3], - const DylibSymbol &sym, uint64_t entryVA) { + const Symbol &sym, uint64_t entryVA) { auto *buf32 = reinterpret_cast(buf8); auto pcVA = [entryVA](int i) { return entryVA + i * sizeof(uint32_t); }; uint64_t stubHelperHeaderVA = in.stubHelper->addr; diff --git a/lld/MachO/Arch/ARM64_32.cpp b/lld/MachO/Arch/ARM64_32.cpp --- a/lld/MachO/Arch/ARM64_32.cpp +++ b/lld/MachO/Arch/ARM64_32.cpp @@ -31,7 +31,7 @@ ARM64_32(); void writeStub(uint8_t *buf, const Symbol &) const override; void writeStubHelperHeader(uint8_t *buf) const override; - void writeStubHelperEntry(uint8_t *buf, const DylibSymbol &, + void writeStubHelperEntry(uint8_t *buf, const Symbol &, uint64_t entryAddr) const override; const RelocAttrs &getRelocAttrs(uint8_t type) const override; }; @@ -96,7 +96,7 @@ 0x00000000, // 08: l0: .long 0 }; -void ARM64_32::writeStubHelperEntry(uint8_t *buf8, const DylibSymbol &sym, +void ARM64_32::writeStubHelperEntry(uint8_t *buf8, const Symbol &sym, uint64_t entryVA) const { ::writeStubHelperEntry(buf8, stubHelperEntryCode, sym, entryVA); } diff --git a/lld/MachO/Arch/X86_64.cpp b/lld/MachO/Arch/X86_64.cpp --- a/lld/MachO/Arch/X86_64.cpp +++ b/lld/MachO/Arch/X86_64.cpp @@ -32,7 +32,7 @@ void writeStub(uint8_t *buf, const Symbol &) const override; void writeStubHelperHeader(uint8_t *buf) const override; - void writeStubHelperEntry(uint8_t *buf, const DylibSymbol &, + void writeStubHelperEntry(uint8_t *buf, const Symbol &, uint64_t entryAddr) const override; void relaxGotLoad(uint8_t *loc, uint8_t type) const override; @@ -166,7 +166,7 @@ 0xe9, 0, 0, 0, 0, // 0x5: jmp <__stub_helper> }; -void X86_64::writeStubHelperEntry(uint8_t *buf, const DylibSymbol &sym, +void X86_64::writeStubHelperEntry(uint8_t *buf, const Symbol &sym, uint64_t entryAddr) const { memcpy(buf, stubHelperEntry, sizeof(stubHelperEntry)); write32le(buf + 1, sym.lazyBindOffset); diff --git a/lld/MachO/Symbols.h b/lld/MachO/Symbols.h --- a/lld/MachO/Symbols.h +++ b/lld/MachO/Symbols.h @@ -63,7 +63,7 @@ // Only undefined or dylib symbols can be weak references. A weak reference // need not be satisfied at runtime, e.g. due to the symbol not being // available on a given target platform. - virtual bool isWeakRef() const { llvm_unreachable("cannot be a weak ref"); } + virtual bool isWeakRef() const { return false; } virtual bool isTlv() const { llvm_unreachable("cannot be TLV"); } @@ -87,9 +87,9 @@ // on whether it is a thread-local. A given symbol cannot be referenced by // both these sections at once. uint32_t gotIndex = UINT32_MAX; - + uint32_t lazyBindOffset = UINT32_MAX; + uint32_t stubsHelperIndex = UINT32_MAX; uint32_t stubsIndex = UINT32_MAX; - uint32_t symtabIndex = UINT32_MAX; InputFile *getFile() const { return file; } @@ -258,9 +258,6 @@ static bool classof(const Symbol *s) { return s->kind() == DylibKind; } - uint32_t stubsHelperIndex = UINT32_MAX; - uint32_t lazyBindOffset = UINT32_MAX; - RefState getRefState() const { return refState; } void reference(RefState newState) { diff --git a/lld/MachO/Symbols.cpp b/lld/MachO/Symbols.cpp --- a/lld/MachO/Symbols.cpp +++ b/lld/MachO/Symbols.cpp @@ -15,13 +15,13 @@ using namespace lld; using namespace lld::macho; -static_assert(sizeof(void *) != 8 || sizeof(Symbol) == 48, +static_assert(sizeof(void *) != 8 || sizeof(Symbol) == 56, "Try to minimize Symbol's size; we create many instances"); // The Microsoft ABI doesn't support using parent class tail padding for child // members, hence the _MSC_VER check. #if !defined(_MSC_VER) -static_assert(sizeof(void *) != 8 || sizeof(Defined) == 80, +static_assert(sizeof(void *) != 8 || sizeof(Defined) == 88, "Try to minimize Defined's size; we create many instances"); #endif diff --git a/lld/MachO/SyntheticSections.h b/lld/MachO/SyntheticSections.h --- a/lld/MachO/SyntheticSections.h +++ b/lld/MachO/SyntheticSections.h @@ -192,13 +192,13 @@ bool isNeeded() const override { return !bindingsMap.empty(); } void writeTo(uint8_t *buf) const override; - void addEntry(const DylibSymbol *dysym, const InputSection *isec, - uint64_t offset, int64_t addend = 0) { + void addEntry(const Symbol *dysym, const InputSection *isec, uint64_t offset, + int64_t addend = 0) { bindingsMap[dysym].emplace_back(addend, Location(isec, offset)); } private: - BindingsMap bindingsMap; + BindingsMap bindingsMap; SmallVector contents; }; @@ -331,13 +331,13 @@ void writeTo(uint8_t *buf) const override; // Note that every entry here will by referenced by a corresponding entry in // the StubHelperSection. - void addEntry(DylibSymbol *dysym); - const llvm::SetVector &getEntries() const { return entries; } + void addEntry(Symbol *dysym); + const llvm::SetVector &getEntries() const { return entries; } private: - uint32_t encode(const DylibSymbol &); + uint32_t encode(const Symbol &); - llvm::SetVector entries; + llvm::SetVector entries; SmallVector contents; llvm::raw_svector_ostream os{contents}; }; diff --git a/lld/MachO/SyntheticSections.cpp b/lld/MachO/SyntheticSections.cpp --- a/lld/MachO/SyntheticSections.cpp +++ b/lld/MachO/SyntheticSections.cpp @@ -417,6 +417,12 @@ return dysym.getFile()->ordinal; } +static int16_t ordinalForSymbol(const Symbol &sym) { + if (const auto *dysym = dyn_cast(&sym)) + return ordinalForDylibSymbol(*dysym); + return BIND_SPECIAL_DYLIB_FLAT_LOOKUP; +} + static void encodeDylibOrdinal(int16_t ordinal, raw_svector_ostream &os) { if (ordinal <= 0) { os << static_cast(BIND_OPCODE_SET_DYLIB_SPECIAL_IMM | @@ -486,14 +492,14 @@ int16_t lastOrdinal = 0; for (auto &p : sortBindings(bindingsMap)) { - const DylibSymbol *sym = p.first; + const Symbol *sym = p.first; std::vector &bindings = p.second; uint8_t flags = BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM; if (sym->isWeakRef()) flags |= BIND_SYMBOL_FLAGS_WEAK_IMPORT; os << flags << sym->getName() << '\0' << static_cast(BIND_OPCODE_SET_TYPE_IMM | BIND_TYPE_POINTER); - int16_t ordinal = ordinalForDylibSymbol(*sym); + int16_t ordinal = ordinalForSymbol(*sym); if (ordinal != lastOrdinal) { encodeDylibOrdinal(ordinal, os); lastOrdinal = ordinal; @@ -596,7 +602,7 @@ void StubHelperSection::writeTo(uint8_t *buf) const { target->writeStubHelperHeader(buf); size_t off = target->stubHelperHeaderSize; - for (const DylibSymbol *sym : in.lazyBinding->getEntries()) { + for (const Symbol *sym : in.lazyBinding->getEntries()) { target->writeStubHelperEntry(buf + off, *sym, addr + off); off += target->stubHelperEntrySize; } @@ -667,7 +673,7 @@ void LazyBindingSection::finalizeContents() { // TODO: Just precompute output size here instead of writing to a temporary // buffer - for (DylibSymbol *sym : entries) + for (Symbol *sym : entries) sym->lazyBindOffset = encode(*sym); } @@ -675,11 +681,11 @@ memcpy(buf, contents.data(), contents.size()); } -void LazyBindingSection::addEntry(DylibSymbol *dysym) { - if (entries.insert(dysym)) { - dysym->stubsHelperIndex = entries.size() - 1; +void LazyBindingSection::addEntry(Symbol *sym) { + if (entries.insert(sym)) { + sym->stubsHelperIndex = entries.size() - 1; in.rebase->addEntry(in.lazyPointers->isec, - dysym->stubsIndex * target->wordSize); + sym->stubsIndex * target->wordSize); } } @@ -689,7 +695,7 @@ // BIND_OPCODE_DONE terminator. As such, unlike in the non-lazy-binding case, // we cannot encode just the differences between symbols; we have to emit the // complete bind information for each symbol. -uint32_t LazyBindingSection::encode(const DylibSymbol &sym) { +uint32_t LazyBindingSection::encode(const Symbol &sym) { uint32_t opstreamOffset = contents.size(); OutputSegment *dataSeg = in.lazyPointers->parent; os << static_cast(BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB | @@ -697,7 +703,7 @@ uint64_t offset = in.lazyPointers->addr - dataSeg->addr + sym.stubsIndex * target->wordSize; encodeULEB128(offset, os); - encodeDylibOrdinal(ordinalForDylibSymbol(sym), os); + encodeDylibOrdinal(ordinalForSymbol(sym), os); uint8_t flags = BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM; if (sym.isWeakRef()) diff --git a/lld/MachO/Target.h b/lld/MachO/Target.h --- a/lld/MachO/Target.h +++ b/lld/MachO/Target.h @@ -52,7 +52,7 @@ // details. virtual void writeStub(uint8_t *buf, const Symbol &) const = 0; virtual void writeStubHelperHeader(uint8_t *buf) const = 0; - virtual void writeStubHelperEntry(uint8_t *buf, const DylibSymbol &, + virtual void writeStubHelperEntry(uint8_t *buf, const Symbol &, uint64_t entryAddr) const = 0; // Symbols may be referenced via either the GOT or the stubs section,