};
void ARM64::writeStub(uint8_t *buf8, const Symbol &sym) const {
- ::writeStub<LP64, stubCode>(buf8, sym);
+ ::writeStub<LP64>(buf8, stubCode, sym);
}
static constexpr uint32_t stubHelperHeaderCode[] = {
};
void ARM64::writeStubHelperHeader(uint8_t *buf8) const {
- ::writeStubHelperHeader<LP64, stubHelperHeaderCode>(buf8);
+ ::writeStubHelperHeader<LP64>(buf8, stubHelperHeaderCode);
}
static constexpr uint32_t stubHelperEntryCode[] = {
void ARM64::writeStubHelperEntry(uint8_t *buf8, const DylibSymbol &sym,
uint64_t entryVA) const {
- ::writeStubHelperEntry<stubHelperEntryCode>(buf8, sym, entryVA);
+ ::writeStubHelperEntry(buf8, stubHelperEntryCode, sym, entryVA);
}
ARM64::ARM64() : ARM64Common(LP64()) {
return address & pageMask;
}
-template <class LP, const uint32_t stubCode[3]>
-inline void writeStub(uint8_t *buf8, const macho::Symbol &sym) {
+template <class LP>
+inline void writeStub(uint8_t *buf8, const uint32_t stubCode[3],
+ const macho::Symbol &sym) {
auto *buf32 = reinterpret_cast<uint32_t *>(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],
buf32[2] = stubCode[2];
}
-template <class LP, const uint32_t stubHelperHeaderCode[6]>
-inline void writeStubHelperHeader(uint8_t *buf8) {
+template <class LP>
+inline void writeStubHelperHeader(uint8_t *buf8,
+ const uint32_t stubHelperHeaderCode[6]) {
auto *buf32 = reinterpret_cast<uint32_t *>(buf8);
auto pcPageBits = [](int i) {
return pageBits(in.stubHelper->addr + i * sizeof(uint32_t));
buf32[5] = stubHelperHeaderCode[5];
}
-template <const uint32_t stubHelperEntryCode[3]>
-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<uint32_t *>(buf8);
auto pcVA = [entryVA](int i) { return entryVA + i * sizeof(uint32_t); };
uint64_t stubHelperHeaderVA = in.stubHelper->addr;
};
void ARM64_32::writeStub(uint8_t *buf8, const Symbol &sym) const {
- ::writeStub<ILP32, stubCode>(buf8, sym);
+ ::writeStub<ILP32>(buf8, stubCode, sym);
}
static constexpr uint32_t stubHelperHeaderCode[] = {
};
void ARM64_32::writeStubHelperHeader(uint8_t *buf8) const {
- ::writeStubHelperHeader<ILP32, stubHelperHeaderCode>(buf8);
+ ::writeStubHelperHeader<ILP32>(buf8, stubHelperHeaderCode);
}
static constexpr uint32_t stubHelperEntryCode[] = {
void ARM64_32::writeStubHelperEntry(uint8_t *buf8, const DylibSymbol &sym,
uint64_t entryVA) const {
- ::writeStubHelperEntry<stubHelperEntryCode>(buf8, sym, entryVA);
+ ::writeStubHelperEntry(buf8, stubHelperEntryCode, sym, entryVA);
}
ARM64_32::ARM64_32() : ARM64Common(ILP32()) {