From: Pete Cooper Date: Thu, 11 Aug 2016 20:59:27 +0000 (+0000) Subject: Better compress lazy binding info to match ld64. X-Git-Tag: llvmorg-4.0.0-rc1~12691 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1ed8f1f6e5d5c6f4a1591de0e872f35a611c7f59;p=platform%2Fupstream%2Fllvm.git 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. llvm-svn: 278407 --- diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp index 188ad3b..b9633d3 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryWriter.cpp @@ -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); } diff --git a/lld/test/mach-o/bind-opcodes.yaml b/lld/test/mach-o/bind-opcodes.yaml index ad87ee6..3db20e2 100644 --- a/lld/test/mach-o/bind-opcodes.yaml +++ b/lld/test/mach-o/bind-opcodes.yaml @@ -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