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 @@ -76,7 +76,7 @@ }; void ARM64::writeStub(uint8_t *buf8, const Symbol &sym) const { - ::writeStub(buf8, sym); + ::writeStub(buf8, stubCode, sym); } static constexpr uint32_t stubHelperHeaderCode[] = { @@ -89,7 +89,7 @@ }; void ARM64::writeStubHelperHeader(uint8_t *buf8) const { - ::writeStubHelperHeader(buf8); + ::writeStubHelperHeader(buf8, stubHelperHeaderCode); } static constexpr uint32_t stubHelperEntryCode[] = { @@ -100,7 +100,7 @@ void ARM64::writeStubHelperEntry(uint8_t *buf8, const DylibSymbol &sym, uint64_t entryVA) const { - ::writeStubHelperEntry(buf8, sym, entryVA); + ::writeStubHelperEntry(buf8, stubHelperEntryCode, sym, entryVA); } ARM64::ARM64() : ARM64Common(LP64()) { 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 @@ -90,11 +90,13 @@ return address & pageMask; } -template -inline void writeStub(uint8_t *buf8, const macho::Symbol &sym) { +template +inline void writeStub(uint8_t *buf8, const uint32_t stubCode[3], + const macho::Symbol &sym) { auto *buf32 = reinterpret_cast(buf8); + constexpr size_t stubCodeSize = 3 * sizeof(uint32_t); uint64_t pcPageBits = - pageBits(in.stubs->addr + sym.stubsIndex * sizeof(stubCode)); + pageBits(in.stubs->addr + sym.stubsIndex * stubCodeSize); uint64_t lazyPointerVA = in.lazyPointers->addr + sym.stubsIndex * LP::wordSize; buf32[0] = encodePage21({&sym, "stub"}, stubCode[0], @@ -103,8 +105,9 @@ buf32[2] = stubCode[2]; } -template -inline void writeStubHelperHeader(uint8_t *buf8) { +template +inline void writeStubHelperHeader(uint8_t *buf8, + const uint32_t stubHelperHeaderCode[6]) { auto *buf32 = reinterpret_cast(buf8); auto pcPageBits = [](int i) { return pageBits(in.stubHelper->addr + i * sizeof(uint32_t)); @@ -123,9 +126,9 @@ buf32[5] = stubHelperHeaderCode[5]; } -template -void writeStubHelperEntry(uint8_t *buf8, const DylibSymbol &sym, - uint64_t entryVA) { +inline void writeStubHelperEntry(uint8_t *buf8, + const uint32_t stubHelperEntryCode[3], + const DylibSymbol &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 @@ -74,7 +74,7 @@ }; void ARM64_32::writeStub(uint8_t *buf8, const Symbol &sym) const { - ::writeStub(buf8, sym); + ::writeStub(buf8, stubCode, sym); } static constexpr uint32_t stubHelperHeaderCode[] = { @@ -87,7 +87,7 @@ }; void ARM64_32::writeStubHelperHeader(uint8_t *buf8) const { - ::writeStubHelperHeader(buf8); + ::writeStubHelperHeader(buf8, stubHelperHeaderCode); } static constexpr uint32_t stubHelperEntryCode[] = { @@ -98,7 +98,7 @@ void ARM64_32::writeStubHelperEntry(uint8_t *buf8, const DylibSymbol &sym, uint64_t entryVA) const { - ::writeStubHelperEntry(buf8, sym, entryVA); + ::writeStubHelperEntry(buf8, stubHelperEntryCode, sym, entryVA); } ARM64_32::ARM64_32() : ARM64Common(ILP32()) {