[lld-macho] Support larger dylib symbol ordinals in bindings
authorJez Ng <jezng@fb.com>
Thu, 13 Aug 2020 02:50:25 +0000 (19:50 -0700)
committerJez Ng <jezng@fb.com>
Thu, 13 Aug 2020 02:50:25 +0000 (19:50 -0700)
Do folks care if we don't have a test for this? Creating 16
dylibs to trigger this straightforward code path seems a little tedious

Reviewed By: #lld-macho, smeenai

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

lld/MachO/SyntheticSections.cpp

index a4ab454..9876b9d 100644 (file)
@@ -148,8 +148,8 @@ static void encodeBinding(const DylibSymbol &dysym, const OutputSection *osec,
       os << static_cast<uint8_t>(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
                                  dysym.file->ordinal);
     } else {
-      error("TODO: Support larger dylib symbol ordinals");
-      return;
+      os << static_cast<uint8_t>(MachO::BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB);
+      encodeULEB128(dysym.file->ordinal, os);
     }
     lastBinding.ordinal = dysym.file->ordinal;
   }
@@ -348,11 +348,13 @@ uint32_t LazyBindingSection::encode(const DylibSymbol &sym) {
   uint64_t offset = in.lazyPointers->addr - dataSeg->firstSection()->addr +
                     sym.stubsIndex * WordSize;
   encodeULEB128(offset, os);
-  if (sym.file->ordinal <= MachO::BIND_IMMEDIATE_MASK)
+  if (sym.file->ordinal <= MachO::BIND_IMMEDIATE_MASK) {
     os << static_cast<uint8_t>(MachO::BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
                                sym.file->ordinal);
-  else
-    fatal("TODO: Support larger dylib symbol ordinals");
+  } else {
+    os << static_cast<uint8_t>(MachO::BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB);
+    encodeULEB128(sym.file->ordinal, os);
+  }
 
   os << static_cast<uint8_t>(MachO::BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM)
      << sym.getName() << '\0'