[lld-macho] Don't use arrays as template parameters

MSVC from VSCode 2017 appears unhappy with it (causes an
internal compiler error.)

This also means that we need to avoid doing `sizeof(stubCode)` as
`sizeof(int[N])` on function array parameters decays into `sizeof(int *)`.

Reviewed By: #lld-macho, gkm

Differential Revision: https://reviews.llvm.org/D100605

GitOrigin-RevId: 4938b090cf0b8c0f716119a7f16205e53608cae2
diff --git a/MachO/Arch/ARM64.cpp b/MachO/Arch/ARM64.cpp
index a595363..708b12b 100644
--- a/MachO/Arch/ARM64.cpp
+++ b/MachO/Arch/ARM64.cpp
@@ -76,7 +76,7 @@
 };
 
 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[] = {
@@ -89,7 +89,7 @@
 };
 
 void ARM64::writeStubHelperHeader(uint8_t *buf8) const {
-  ::writeStubHelperHeader<LP64, stubHelperHeaderCode>(buf8);
+  ::writeStubHelperHeader<LP64>(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<stubHelperEntryCode>(buf8, sym, entryVA);
+  ::writeStubHelperEntry(buf8, stubHelperEntryCode, sym, entryVA);
 }
 
 ARM64::ARM64() : ARM64Common(LP64()) {
diff --git a/MachO/Arch/ARM64Common.h b/MachO/Arch/ARM64Common.h
index 1e858f6..934101c 100644
--- a/MachO/Arch/ARM64Common.h
+++ b/MachO/Arch/ARM64Common.h
@@ -90,11 +90,13 @@
   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],
@@ -103,8 +105,9 @@
   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));
@@ -123,9 +126,9 @@
   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;
diff --git a/MachO/Arch/ARM64_32.cpp b/MachO/Arch/ARM64_32.cpp
index f0d39c5..80bd933 100644
--- a/MachO/Arch/ARM64_32.cpp
+++ b/MachO/Arch/ARM64_32.cpp
@@ -74,7 +74,7 @@
 };
 
 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[] = {
@@ -87,7 +87,7 @@
 };
 
 void ARM64_32::writeStubHelperHeader(uint8_t *buf8) const {
-  ::writeStubHelperHeader<ILP32, stubHelperHeaderCode>(buf8);
+  ::writeStubHelperHeader<ILP32>(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<stubHelperEntryCode>(buf8, sym, entryVA);
+  ::writeStubHelperEntry(buf8, stubHelperEntryCode, sym, entryVA);
 }
 
 ARM64_32::ARM64_32() : ARM64Common(ILP32()) {