xref: /llvm-project/lld/test/MachO/bind-opcodes.s (revision 0634a8440d63359e8f0e6674c192524bb404909f)
1# REQUIRES: x86, aarch64
2# RUN: rm -rf %t; split-file %s %t
3# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/foo.s -o %t/foo.o
4# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin --defsym PTR64=0 %t/test.s -o %t/test.o
5# RUN: %lld -O2 -dylib %t/foo.o -o %t/libfoo.dylib
6# RUN: %lld -O2 -lSystem %t/test.o %t/libfoo.dylib -o %t/test-x86_64
7
8## Test (64-bit):
9## 1/ We emit exactly one BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM per symbol.
10## 2/ Combine BIND_OPCODE_DO_BIND and BIND_OPCODE_ADD_ADDR_ULEB pairs.
11## 3/ Compact BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB
12## 4/ Use BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED if possible.
13# RUN: obj2yaml %t/test-x86_64 | FileCheck %s
14
15# CHECK:      BindOpcodes:
16# CHECK-NEXT:   Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
17# CHECK-NEXT:   Imm:             0
18# CHECK-NEXT:   Symbol:          _foo
19# CHECK-NEXT:   Opcode:          BIND_OPCODE_SET_TYPE_IMM
20# CHECK-NEXT:   Imm:             1
21# CHECK-NEXT:   Symbol:          ''
22# CHECK-NEXT:   Opcode:          BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
23# CHECK-NEXT:   Imm:             2
24# CHECK-NEXT:   Symbol:          ''
25# CHECK-NEXT:   Opcode:          BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
26# CHECK-NEXT:   Imm:             2
27# CHECK-NEXT:   ULEBExtraData:   [ 0x0 ]
28# CHECK-NEXT:   Symbol:          ''
29# CHECK-NEXT:   Opcode:          BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB
30# CHECK-NEXT:   Imm:             0
31# CHECK-NEXT:   ULEBExtraData:   [ 0x2, 0x8 ]
32# CHECK-NEXT:   Symbol:          ''
33# CHECK-NEXT:   Opcode:          BIND_OPCODE_SET_ADDEND_SLEB
34# CHECK-NEXT:   Imm:             0
35# CHECK-NEXT:   SLEBExtraData:   [ 1 ]
36# CHECK-NEXT:   Symbol:          ''
37# CHECK-NEXT:   Opcode:          BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB
38# CHECK-NEXT:   Imm:             0
39# CHECK-NEXT:   ULEBExtraData:   [ 0x1008 ]
40# CHECK-NEXT:   Symbol:          ''
41# CHECK-NEXT:   Opcode:          BIND_OPCODE_SET_ADDEND_SLEB
42# CHECK-NEXT:   Imm:             0
43# CHECK-NEXT:   SLEBExtraData:   [ 0 ]
44# CHECK-NEXT:   Symbol:          ''
45# CHECK-NEXT:   Opcode:          BIND_OPCODE_DO_BIND
46# CHECK-NEXT:   Imm:             0
47# CHECK-NEXT:   Symbol:          ''
48# CHECK-NEXT:   Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
49# CHECK-NEXT:   Imm:             0
50# CHECK-NEXT:   Symbol:          _bar
51# CHECK-NEXT:   Opcode:          BIND_OPCODE_SET_TYPE_IMM
52# CHECK-NEXT:   Imm:             1
53# CHECK-NEXT:   Symbol:          ''
54# CHECK-NEXT:   Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
55# CHECK-NEXT:   Imm:             0
56# CHECK-NEXT:   ULEBExtraData:   [ 0xFFFFFFFFFFFFEFD0 ]
57# CHECK-NEXT:   Symbol:          ''
58# CHECK-NEXT:   Opcode:          BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED
59# CHECK-NEXT:   Imm:             1
60# CHECK-NEXT:   Symbol:          ''
61# CHECK-NEXT:   Opcode:          BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB
62# CHECK-NEXT:   Imm:             0
63# CHECK-NEXT:   ULEBExtraData:   [ 0x1008 ]
64# CHECK-NEXT:   Symbol:          ''
65# CHECK-NEXT:   Opcode:          BIND_OPCODE_DO_BIND
66# CHECK-NEXT:   Imm:             0
67# CHECK-NEXT:   Symbol:          ''
68# CHECK-NEXT:   Opcode:          BIND_OPCODE_DONE
69# CHECK-NEXT:   Imm:             0
70# CHECK-NEXT:   Symbol:          ''
71
72# RUN: llvm-mc -filetype=obj -triple=arm64_32-apple-darwin %t/foo.s -o %t/foo.o
73# RUN: llvm-mc -filetype=obj -triple=arm64_32-apple-darwin --defsym PTR32=0 %t/test.s -o %t/test.o
74# RUN: %lld-watchos -O2 -dylib %t/foo.o -o %t/libfoo.dylib
75# RUN: %lld-watchos -O2 -dylib %t/test.o %t/libfoo.dylib -o %t/libtest-arm64_32.dylib
76
77## Test (32-bit):
78## 1/ We emit exactly one BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM per symbol.
79## 2/ Combine BIND_OPCODE_DO_BIND and BIND_OPCODE_ADD_ADDR_ULEB pairs.
80## 3/ Compact BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB
81## 4/ Use BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED if possible.
82# RUN: obj2yaml %t/libtest-arm64_32.dylib | FileCheck %s --check-prefix=CHECK32
83
84# CHECK32:      BindOpcodes:
85# CHECK32-NEXT:   Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
86# CHECK32-NEXT:   Imm:             0
87# CHECK32-NEXT:   Symbol:          _foo
88# CHECK32-NEXT:   Opcode:          BIND_OPCODE_SET_TYPE_IMM
89# CHECK32-NEXT:   Imm:             1
90# CHECK32-NEXT:   Symbol:          ''
91# CHECK32-NEXT:   Opcode:          BIND_OPCODE_SET_DYLIB_ORDINAL_IMM
92# CHECK32-NEXT:   Imm:             2
93# CHECK32-NEXT:   Symbol:          ''
94# CHECK32-NEXT:   Opcode:          BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB
95# CHECK32-NEXT:   Imm:             1
96# CHECK32-NEXT:   ULEBExtraData:   [ 0x0 ]
97# CHECK32-NEXT:   Symbol:          ''
98# CHECK32-NEXT:   Opcode:          BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB
99# CHECK32-NEXT:   Imm:             0
100# CHECK32-NEXT:   ULEBExtraData:   [ 0x2, 0x4 ]
101# CHECK32-NEXT:   Symbol:          ''
102# CHECK32-NEXT:   Opcode:          BIND_OPCODE_SET_ADDEND_SLEB
103# CHECK32-NEXT:   Imm:             0
104# CHECK32-NEXT:   SLEBExtraData:   [ 1 ]
105# CHECK32-NEXT:   Symbol:          ''
106# CHECK32-NEXT:   Opcode:          BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB
107# CHECK32-NEXT:   Imm:             0
108# CHECK32-NEXT:   ULEBExtraData:   [ 0x1004 ]
109# CHECK32-NEXT:   Symbol:          ''
110# CHECK32-NEXT:   Opcode:          BIND_OPCODE_SET_ADDEND_SLEB
111# CHECK32-NEXT:   Imm:             0
112# CHECK32-NEXT:   SLEBExtraData:   [ 0 ]
113# CHECK32-NEXT:   Symbol:          ''
114# CHECK32-NEXT:   Opcode:          BIND_OPCODE_DO_BIND
115# CHECK32-NEXT:   Imm:             0
116# CHECK32-NEXT:   Symbol:          ''
117# CHECK32-NEXT:   Opcode:          BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM
118# CHECK32-NEXT:   Imm:             0
119# CHECK32-NEXT:   Symbol:          _bar
120# CHECK32-NEXT:   Opcode:          BIND_OPCODE_SET_TYPE_IMM
121# CHECK32-NEXT:   Imm:             1
122# CHECK32-NEXT:   Symbol:          ''
123# CHECK32-NEXT:   Opcode:          BIND_OPCODE_ADD_ADDR_ULEB
124# CHECK32-NEXT:   Imm:             0
125# CHECK32-NEXT:   ULEBExtraData:   [ 0xFFFFFFFFFFFFEFE8 ]
126# CHECK32-NEXT:   Symbol:          ''
127# CHECK32-NEXT:   Opcode:          BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED
128# CHECK32-NEXT:   Imm:             1
129# CHECK32-NEXT:   Symbol:          ''
130# CHECK32-NEXT:   Opcode:          BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB
131# CHECK32-NEXT:   Imm:             0
132# CHECK32-NEXT:   ULEBExtraData:   [ 0x1004 ]
133# CHECK32-NEXT:   Symbol:          ''
134# CHECK32-NEXT:   Opcode:          BIND_OPCODE_DO_BIND
135# CHECK32-NEXT:   Imm:             0
136# CHECK32-NEXT:   Symbol:          ''
137# CHECK32-NEXT:   Opcode:          BIND_OPCODE_DONE
138# CHECK32-NEXT:   Imm:             0
139# CHECK32-NEXT:   Symbol:          ''
140
141# RUN: llvm-objdump --macho --bind %t/test-x86_64 | FileCheck %s -D#PTR=8 --check-prefix=BIND
142# RUN: llvm-objdump --macho --bind %t/libtest-arm64_32.dylib | FileCheck %s -D#PTR=4 --check-prefix=BIND
143# BIND:       Bind table:
144# BIND-NEXT:  segment  section   address                               type       addend dylib     symbol
145# BIND-NEXT:  __DATA   __data    0x[[#%X,DATA:]]                       pointer         0 libfoo    _foo
146# BIND-NEXT:  __DATA   __data    0x[[#%.8X,DATA + mul(PTR, 2)]]        pointer         0 libfoo    _foo
147# BIND-NEXT:  __DATA   __data    0x[[#%.8X,DATA + mul(PTR, 4)]]        pointer         1 libfoo    _foo
148# BIND-NEXT:  __DATA   __data    0x[[#%.8X,DATA + 4096 + mul(PTR, 6)]] pointer         0 libfoo    _foo
149# BIND-NEXT:  __DATA   __data    0x[[#%.8X,DATA + PTR]]                pointer         0 libfoo    _bar
150# BIND-NEXT:  __DATA   __data    0x[[#%.8X,DATA + mul(PTR, 3)]]        pointer         0 libfoo    _bar
151# BIND-NEXT:  __DATA   __data    0x[[#%.8X,DATA + 4096 + mul(PTR, 5)]] pointer         0 libfoo    _bar
152# BIND-EMPTY:
153
154#--- foo.s
155.globl _foo, _bar
156_foo:
157  .space 4
158_bar:
159  .space 4
160
161#--- test.s
162.ifdef PTR64
163.macro ptr val
164  .quad \val
165.endm
166.endif
167
168.ifdef PTR32
169.macro ptr val
170  .int \val
171.endm
172.endif
173
174.data
175ptr _foo
176ptr _bar
177ptr _foo
178ptr _bar
179ptr _foo+1
180.zero 0x1000
181ptr _bar
182ptr _foo
183
184.globl _main
185.text
186_main:
187