Better compress lazy binding info to match ld64.
authorPete Cooper <peter_cooper@apple.com>
Thu, 11 Aug 2016 20:59:27 +0000 (20:59 +0000)
committerPete Cooper <peter_cooper@apple.com>
Thu, 11 Aug 2016 20:59:27 +0000 (20:59 +0000)
We should be using one of BIND_OPCODE_SET_DYLIB_SPECIAL_IMM, BIND_OPCODE_SET_DYLIB_ORDINAL_IMM,
and BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB depending on whether ordinals are <= 0, <= 15, > 15.

This matches the behaviour of ld64.

llvm-svn: 278407

lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
lld/test/mach-o/bind-opcodes.yaml

index 188ad3b..b9633d3 100644 (file)
@@ -1243,22 +1243,25 @@ void MachOFileLayout::buildBindInfo() {
 
 void MachOFileLayout::buildLazyBindInfo() {
   for (const BindLocation& entry : _file.lazyBindingInfo) {
-    _lazyBindingInfo.append_byte(BIND_OPCODE_SET_TYPE_IMM | entry.kind);
     _lazyBindingInfo.append_byte(BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
                             | entry.segIndex);
-    _lazyBindingInfo.append_uleb128Fixed(entry.segOffset, 5);
-    if (entry.ordinal > 0)
-      _lazyBindingInfo.append_byte(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
-                                   (entry.ordinal & 0xF));
-    else
+    _lazyBindingInfo.append_uleb128(entry.segOffset);
+    if (entry.ordinal <= 0)
       _lazyBindingInfo.append_byte(BIND_OPCODE_SET_DYLIB_SPECIAL_IMM |
-                                   (entry.ordinal & 0xF));
+                                   (entry.ordinal & BIND_IMMEDIATE_MASK));
+    else if (entry.ordinal <= BIND_IMMEDIATE_MASK)
+      _lazyBindingInfo.append_byte(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
+                                   entry.ordinal);
+    else {
+      _lazyBindingInfo.append_byte(BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB);
+      _lazyBindingInfo.append_uleb128(entry.ordinal);
+    }
+    // FIXME: We need to | the opcode here with flags.
     _lazyBindingInfo.append_byte(BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM);
     _lazyBindingInfo.append_string(entry.symbolName);
     _lazyBindingInfo.append_byte(BIND_OPCODE_DO_BIND);
     _lazyBindingInfo.append_byte(BIND_OPCODE_DONE);
   }
-  _lazyBindingInfo.append_byte(BIND_OPCODE_DONE);
   _lazyBindingInfo.align(_is64 ? 8 : 4);
 }
 
index ad87ee6..3db20e2 100644 (file)
@@ -121,9 +121,6 @@ undefined-symbols:
 # CHECK:       Symbol:          ''
 
 # CHECK:   LazyBindOpcodes: 
-# CHECK:     - Opcode:          BIND_OPCODE_SET_TYPE_IMM
-# CHECK:       Imm:             1
-# CHECK:       Symbol:          ''
 # CHECK:     - Opcode:          BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
 # CHECK:       Imm:             2
 # CHECK:       ULEBExtraData:   
@@ -143,13 +140,4 @@ undefined-symbols:
 # CHECK:       Symbol:          ''
 # CHECK:     - Opcode:          BIND_OPCODE_DONE
 # CHECK:       Imm:             0
-# CHECK:       Symbol:          ''
-# CHECK:     - Opcode:          BIND_OPCODE_DONE
-# CHECK:       Imm:             0
-# CHECK:       Symbol:          ''
-# CHECK:     - Opcode:          BIND_OPCODE_DONE
-# CHECK:       Imm:             0
-# CHECK:       Symbol:          ''
-# CHECK:     - Opcode:          BIND_OPCODE_DONE
-# CHECK:       Imm:             0
 # CHECK:       Symbol:          ''
\ No newline at end of file