[lld] r278405 - Generate slightly more compressed binding opcodes when entries are the same as last time.

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


Author: pete
Date: Thu Aug 11 15:37:02 2016
New Revision: 278405

URL: http://llvm.org/viewvc/llvm-project?rev=278405&view=rev
Log:
Generate slightly more compressed binding opcodes when entries are the same as last time.

We already had logic for binding opcodes had the same addend as last time.  This adds
the cases where the ordinal, symbol name, type, and segment offsets are the same as
the last emitted ordinal.

This gets us one step closer to emitting rebase opcodes as compressed as ld64 can manage.

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=278405&r1=278404&r2=278405&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp Thu Aug 11 15:37:02 2016
@@ -1192,19 +1192,44 @@ void MachOFileLayout::buildRebaseInfo()
 void MachOFileLayout::buildBindInfo() {
   // TODO: compress bind info.
   uint64_t lastAddend = 0;
+  int lastOrdinal = 0x80000000;
+  StringRef lastSymbolName;
+  BindType lastType = (BindType)0;
+  Hex32 lastSegOffset = ~0U;
+  uint8_t lastSegIndex = (uint8_t)~0U;
   for (const BindLocation& entry : _file.bindingInfo) {
-    _bindingInfo.append_byte(BIND_OPCODE_SET_TYPE_IMM | entry.kind);
-    _bindingInfo.append_byte(BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
-                            | entry.segIndex);
-    _bindingInfo.append_uleb128(entry.segOffset);
-    if (entry.ordinal > 0)
-      _bindingInfo.append_byte(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
-                               (entry.ordinal & 0xF));
-    else
-      _bindingInfo.append_byte(BIND_OPCODE_SET_DYLIB_SPECIAL_IMM |
-                               (entry.ordinal & 0xF));
-    _bindingInfo.append_byte(BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM);
-    _bindingInfo.append_string(entry.symbolName);
+    if (entry.ordinal != lastOrdinal) {
+      if (entry.ordinal <= 0)
+        _bindingInfo.append_byte(BIND_OPCODE_SET_DYLIB_SPECIAL_IMM |
+                                 (entry.ordinal & BIND_IMMEDIATE_MASK));
+      else if (entry.ordinal <= BIND_IMMEDIATE_MASK)
+        _bindingInfo.append_byte(BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
+                                 entry.ordinal);
+      else {
+        _bindingInfo.append_byte(BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB);
+        _bindingInfo.append_uleb128(entry.ordinal);
+      }
+      lastOrdinal = entry.ordinal;
+    }
+
+    if (lastSymbolName != entry.symbolName) {
+      _bindingInfo.append_byte(BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM);
+      _bindingInfo.append_string(entry.symbolName);
+      lastSymbolName = entry.symbolName;
+    }
+
+    if (lastType != entry.kind) {
+      _bindingInfo.append_byte(BIND_OPCODE_SET_TYPE_IMM | entry.kind);
+      lastType = entry.kind;
+    }
+
+    if (lastSegIndex != entry.segIndex || lastSegOffset != entry.segOffset) {
+      _bindingInfo.append_byte(BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
+                               | entry.segIndex);
+      _bindingInfo.append_uleb128(entry.segOffset);
+      lastSegIndex = entry.segIndex;
+      lastSegOffset = entry.segOffset;
+    }
     if (entry.addend != lastAddend) {
       _bindingInfo.append_byte(BIND_OPCODE_SET_ADDEND_SLEB);
       _bindingInfo.append_sleb128(entry.addend);

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=278405&r1=278404&r2=278405&view=diff
==============================================================================
--- lld/trunk/test/mach-o/bind-opcodes.yaml (original)
+++ lld/trunk/test/mach-o/bind-opcodes.yaml Thu Aug 11 15:37:02 2016
@@ -88,37 +88,31 @@ undefined-symbols:
 
 
 # CHECK:   BindOpcodes:     
-# 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:   
-# CHECK:         - 0x0000000000000000
-# CHECK:       Symbol:          ''
 # CHECK:     - Opcode:          BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
 # CHECK:       Imm:             1
 # CHECK:       Symbol:          ''
 # CHECK:     - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
 # CHECK:       Imm:             0
 # CHECK:       Symbol:          dyld_stub_binder
-# CHECK:     - Opcode:          BIND_OPCODE_DO_BIND
-# CHECK:       Imm:             0
-# CHECK:       Symbol:          ''
 # 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:   
-# CHECK:         - 0x0000000000000010
+# CHECK:         - 0x0000000000000000
 # CHECK:       Symbol:          ''
-# CHECK:     - Opcode:          BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
-# CHECK:       Imm:             1
+# CHECK:     - Opcode:          BIND_OPCODE_DO_BIND
+# CHECK:       Imm:             0
 # CHECK:       Symbol:          ''
 # CHECK:     - Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
 # CHECK:       Imm:             0
 # CHECK:       Symbol:          ___stdoutp
+# CHECK:     - Opcode:          BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
+# CHECK:       Imm:             2
+# CHECK:       ULEBExtraData:   
+# CHECK:         - 0x0000000000000010
+# CHECK:       Symbol:          ''
 # CHECK:     - Opcode:          BIND_OPCODE_DO_BIND
 # CHECK:       Imm:             0
 # CHECK:       Symbol:          ''




More information about the llvm-commits mailing list