| # REQUIRES: x86, aarch64 |
| # RUN: rm -rf %t; split-file %s %t |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/foo.s -o %t/foo.o |
| # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin --defsym PTR64=0 %t/test.s -o %t/test.o |
| # RUN: %lld -O2 -dylib %t/foo.o -o %t/libfoo.dylib |
| # RUN: %lld -O2 -lSystem %t/test.o %t/libfoo.dylib -o %t/test-x86_64 |
| |
| ## Test (64-bit): |
| ## 1/ We emit exactly one BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM per symbol. |
| ## 2/ Combine BIND_OPCODE_DO_BIND and BIND_OPCODE_ADD_ADDR_ULEB pairs. |
| ## 3/ Compact BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB |
| ## 4/ Use BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED if possible. |
| # RUN: obj2yaml %t/test-x86_64 | FileCheck %s |
| |
| # CHECK: BindOpcodes: |
| # CHECK-NEXT: Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: Symbol: _foo |
| # CHECK-NEXT: Opcode: BIND_OPCODE_SET_TYPE_IMM |
| # CHECK-NEXT: Imm: 1 |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
| # CHECK-NEXT: Imm: 2 |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB |
| # CHECK-NEXT: Imm: 2 |
| # CHECK-NEXT: ULEBExtraData: [ 0x0 ] |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: ULEBExtraData: [ 0x2, 0x8 ] |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_SET_ADDEND_SLEB |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: SLEBExtraData: [ 1 ] |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: ULEBExtraData: [ 0x1008 ] |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_SET_ADDEND_SLEB |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: SLEBExtraData: [ 0 ] |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_DO_BIND |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: Symbol: _bar |
| # CHECK-NEXT: Opcode: BIND_OPCODE_SET_TYPE_IMM |
| # CHECK-NEXT: Imm: 1 |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_ADD_ADDR_ULEB |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: ULEBExtraData: [ 0xFFFFFFFFFFFFEFD0 ] |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED |
| # CHECK-NEXT: Imm: 1 |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: ULEBExtraData: [ 0x1008 ] |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_DO_BIND |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: Symbol: '' |
| # CHECK-NEXT: Opcode: BIND_OPCODE_DONE |
| # CHECK-NEXT: Imm: 0 |
| # CHECK-NEXT: Symbol: '' |
| |
| # RUN: llvm-mc -filetype=obj -triple=arm64_32-apple-darwin %t/foo.s -o %t/foo.o |
| # RUN: llvm-mc -filetype=obj -triple=arm64_32-apple-darwin --defsym PTR32=0 %t/test.s -o %t/test.o |
| # RUN: %lld -arch arm64_32 -O2 -dylib %t/foo.o -o %t/libfoo.dylib |
| # RUN: %lld -arch arm64_32 -O2 -dylib %t/test.o %t/libfoo.dylib -o %t/libtest-arm64_32.dylib |
| |
| ## Test (32-bit): |
| ## 1/ We emit exactly one BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM per symbol. |
| ## 2/ Combine BIND_OPCODE_DO_BIND and BIND_OPCODE_ADD_ADDR_ULEB pairs. |
| ## 3/ Compact BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB |
| ## 4/ Use BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED if possible. |
| # RUN: obj2yaml %t/libtest-arm64_32.dylib | FileCheck %s --check-prefix=CHECK32 |
| |
| # CHECK32: BindOpcodes: |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: Symbol: _foo |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_SET_TYPE_IMM |
| # CHECK32-NEXT: Imm: 1 |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM |
| # CHECK32-NEXT: Imm: 1 |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB |
| # CHECK32-NEXT: Imm: 1 |
| # CHECK32-NEXT: ULEBExtraData: [ 0x0 ] |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: ULEBExtraData: [ 0x2, 0x4 ] |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_SET_ADDEND_SLEB |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: SLEBExtraData: [ 1 ] |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: ULEBExtraData: [ 0x1004 ] |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_SET_ADDEND_SLEB |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: SLEBExtraData: [ 0 ] |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_DO_BIND |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: Symbol: _bar |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_SET_TYPE_IMM |
| # CHECK32-NEXT: Imm: 1 |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_ADD_ADDR_ULEB |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: ULEBExtraData: [ 0xFFFFFFFFFFFFEFE8 ] |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED |
| # CHECK32-NEXT: Imm: 1 |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: ULEBExtraData: [ 0x1004 ] |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_DO_BIND |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: Symbol: '' |
| # CHECK32-NEXT: Opcode: BIND_OPCODE_DONE |
| # CHECK32-NEXT: Imm: 0 |
| # CHECK32-NEXT: Symbol: '' |
| |
| # RUN: llvm-objdump --macho --bind %t/test-x86_64 | FileCheck %s -D#PTR=8 --check-prefix=BIND |
| # RUN: llvm-objdump --macho --bind %t/libtest-arm64_32.dylib | FileCheck %s -D#PTR=4 --check-prefix=BIND |
| # BIND: Bind table: |
| # BIND-NEXT: segment section address type addend dylib symbol |
| # BIND-NEXT: __DATA __data 0x[[#%X,DATA:]] pointer 0 libfoo _foo |
| # BIND-NEXT: __DATA __data 0x[[#%.8X,DATA + mul(PTR, 2)]] pointer 0 libfoo _foo |
| # BIND-NEXT: __DATA __data 0x[[#%.8X,DATA + mul(PTR, 4)]] pointer 1 libfoo _foo |
| # BIND-NEXT: __DATA __data 0x[[#%.8X,DATA + 4096 + mul(PTR, 6)]] pointer 0 libfoo _foo |
| # BIND-NEXT: __DATA __data 0x[[#%.8X,DATA + PTR]] pointer 0 libfoo _bar |
| # BIND-NEXT: __DATA __data 0x[[#%.8X,DATA + mul(PTR, 3)]] pointer 0 libfoo _bar |
| # BIND-NEXT: __DATA __data 0x[[#%.8X,DATA + 4096 + mul(PTR, 5)]] pointer 0 libfoo _bar |
| # BIND-EMPTY: |
| |
| #--- foo.s |
| .globl _foo, _bar |
| _foo: |
| .space 4 |
| _bar: |
| .space 4 |
| |
| #--- test.s |
| .ifdef PTR64 |
| .macro ptr val |
| .quad \val |
| .endm |
| .endif |
| |
| .ifdef PTR32 |
| .macro ptr val |
| .int \val |
| .endm |
| .endif |
| |
| .data |
| ptr _foo |
| ptr _bar |
| ptr _foo |
| ptr _bar |
| ptr _foo+1 |
| .zero 0x1000 |
| ptr _bar |
| ptr _foo |
| |
| .globl _main |
| .text |
| _main: |