[lld] r278407 - Better compress lazy binding info to match ld64.

Pete Cooper via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 11 13:59:27 PDT 2016


Author: pete
Date: Thu Aug 11 15:59:27 2016
New Revision: 278407

URL: http://llvm.org/viewvc/llvm-project?rev=278407&view=rev
Log:
Better compress lazy binding info to match ld64.

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.

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

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp?rev=278407&r1=278406&r2=278407&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp Thu Aug 11 15:59:27 2016
@@ -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);
 }
 

Modified: lld/trunk/test/mach-o/bind-opcodes.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/bind-opcodes.yaml?rev=278407&r1=278406&r2=278407&view=diff
==============================================================================
--- lld/trunk/test/mach-o/bind-opcodes.yaml (original)
+++ lld/trunk/test/mach-o/bind-opcodes.yaml Thu Aug 11 15:59:27 2016
@@ -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:   
@@ -139,15 +136,6 @@ undefined-symbols:
 # 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:          ''
-# CHECK:     - Opcode:          BIND_OPCODE_DONE
 # CHECK:       Imm:             0
 # CHECK:       Symbol:          ''
 # CHECK:     - Opcode:          BIND_OPCODE_DONE




More information about the llvm-commits mailing list