1// REQUIRES: arm
2// RUN: llvm-mc --triple=thumbv7m-none-eabi --arm-add-build-attributes -filetype=obj -o %t.o %s
3// RUN: echo "SECTIONS { \
4// RUN:                 .rodata.low 0x8012  : { *(.rodata.low) } \
5// RUN:                 .text.low   0x8f00  : { *(.text.low) } \
6// RUN:                 .text.neg   0x9000  : { *(.text.neg) } \
7// RUN:                 .text.pos   0x10000 : { *(.text.pos) } \
8// RUN:                 .text.high  0x10100 : { *(.text.high) } \
9// RUN:                 .data_high  0x1100f : { *(.data.high) } \
10// RUN:               } " > %t.script
11// RUN: ld.lld --script %t.script %t.o -o %t
12// RUN: llvm-readobj --symbols %t | FileCheck %s --check-prefix=SYMS
13// RUN: llvm-objdump -d --no-show-raw-insn --triple=thumbv7m-none-eabi %t | FileCheck %s
14
15/// Test the various legal cases for the R_ARM_THM_ALU_PREL_11_0 relocation
16/// Interesting things to note
17/// Range is +- 4095 bytes
18/// The expression is S + A - Pa where Pa is AlignDown(PC, 4) so we will use
19/// 2-byte nops to make some of the adr psuedo instructions 2-byte aligned.
20 .section .rodata.low, "a", %progbits
21dat1:
22 .byte 0
23dat2:
24 .byte 1
25dat3:
26 .byte 2
27dat4:
28 .byte 3
29
30 .section .text.low, "ax", %progbits
31 .balign 4
32 .global target1
33 .type target1, %function
34target1:
35 bx lr
36 .type target2, %function
37target2:
38 bx lr
39
40 .section .text.neg, "ax", %progbits
41 .balign 4
42 .global _start
43 .thumb_func
44_start:
45 nop
46///  adr.w r0, dat1
47 .inst.w 0xf2af0004
48 .reloc 2, R_ARM_THM_ALU_PREL_11_0, dat1
49/// adr.w r1, dat2
50 .inst.w 0xf2af0104
51 .reloc 6, R_ARM_THM_ALU_PREL_11_0, dat2
52 nop
53/// adr.w r2, dat3
54 .inst.w 0xf2af0204
55 .reloc 0xc, R_ARM_THM_ALU_PREL_11_0, dat3
56/// adr.w r3, dat4
57 .inst.w 0xf2af0304
58 .reloc 0x10, R_ARM_THM_ALU_PREL_11_0, dat4
59/// adr.w r0, target1
60 .inst.w 0xf2af0004
61 .reloc 0x14, R_ARM_THM_ALU_PREL_11_0, target1
62 nop
63/// adr.w r1, target2
64 .inst.w 0xf2af0104
65 .reloc 0x1a, R_ARM_THM_ALU_PREL_11_0, target2
66 .section .text.pos, "ax", %progbits
67 .balign 4
68 .global pos
69 .thumb_func
70pos:
71/// adr.w r2, target3
72 .inst.w 0xf2af0204
73 .reloc 0, R_ARM_THM_ALU_PREL_11_0, target3
74 nop
75/// adr.w r3, target4
76 .inst.w 0xf2af0304
77 .reloc 6, R_ARM_THM_ALU_PREL_11_0, target4
78 nop
79/// adr.w r0, dat5
80 .inst.w 0xf2af0004
81 .reloc 0xc, R_ARM_THM_ALU_PREL_11_0, dat5
82/// adr.w r1, dat6
83 .inst.w 0xf2af0104
84 .reloc 0x10, R_ARM_THM_ALU_PREL_11_0, dat6
85
86 nop
87/// adr.w r2, dat7
88 .inst.w 0xf2af0204
89 .reloc 0x16, R_ARM_THM_ALU_PREL_11_0, dat7
90
91/// adr.w r3, dat8
92 .inst.w 0xf2af0304
93 .reloc 0x1a, R_ARM_THM_ALU_PREL_11_0, dat8
94/// positive addend in instruction, all others are -4 (PC bias)
95/// adr.w r4, dat5 + 8
96 .inst.w 0xf20f0404
97 .reloc 0x1e, R_ARM_THM_ALU_PREL_11_0, dat5 + 8
98
99 .section .text.high, "ax", %progbits
100 .balign 4
101 .thumb_func
102 .global target3
103target3:
104 bx lr
105 .thumb_func
106target4:
107 bx lr
108
109 .section .data.high, "aw", %progbits
110dat5:
111 .byte 0
112dat6:
113 .byte 1
114dat7:
115 .byte 2
116dat8:
117 .byte 3
118
119// SYMS:     Name: dat1
120// SYMS-NEXT:     Value: 0x8012
121// SYMS:     Name: dat2
122// SYMS-NEXT:     Value: 0x8013
123// SYMS:     Name: dat3
124// SYMS-NEXT:     Value: 0x8014
125// SYMS:     Name: dat4
126// SYMS-NEXT:     Value: 0x8015
127
128// CHECK: 00008f00 <target1>:
129// CHECK-NEXT:     8f00: bx      lr
130// CHECK: 00008f02 <target2>:
131// CHECK-NEXT:     8f02: bx      lr
132
133// CHECK: 00009000 <_start>:
134// CHECK-NEXT:     9000: nop
135/// AlignDown(0x9002+4, 4) - 0xff2 = 0x8012
136// CHECK-NEXT:     9002: adr.w   r0, #-4082
137/// AlignDown(0x9006+4, 4) - 0xff5 = 0x8013
138// CHECK-NEXT:     9006: adr.w   r1, #-4085
139// CHECK-NEXT:     900a: nop
140/// AlignDown(0x900c+4, 4) - 0xffc = 0x8014
141// CHECK-NEXT:     900c: adr.w   r2, #-4092
142/// AlignDown(0x9010+4, 4) - 0xfff = 0x8015
143// CHECK-NEXT:     9010: adr.w   r3, #-4095
144/// AlignDown(0x9014+4, 4) - 0x117 = 0x8f01
145// CHECK-NEXT:     9014: adr.w   r0, #-279
146// CHECK-NEXT:     9018: nop
147/// AlignDown(0x901a+4, 4) - 0x119 = 0x8f03
148// CHECK-NEXT:     901a: adr.w   r1, #-281
149
150// CHECK: 00010000 <pos>:
151/// AlignDown(0x10000+4, 4) + 0xfd = 0x10101
152// CHECK-NEXT:    10000: adr.w   r2, #253
153// CHECK-NEXT:    10004: nop
154/// AlignDown(0x10006+4, 4) + 0xfb = 0x10103
155// CHECK-NEXT:    10006: adr.w   r3, #251
156// CHECK-NEXT:    1000a: nop
157/// AlignDown(0x1000c+4, 4) + 0xfff = 0x1100f
158// CHECK-NEXT:    1000c: adr.w   r0, #4095
159/// AlignDown(0x10010+4, 4) + 0xffc = 0x11010
160// CHECK-NEXT:    10010: adr.w   r1, #4092
161// CHECK-NEXT:    10014: nop
162/// AlignDown(0x10016+4, 4) + 0xff9 = 0x11011
163// CHECK-NEXT:    10016: adr.w   r2, #4089
164/// AlignDown(0x1001a+4, 4) + 0xff6 = 0x11012
165// CHECK-NEXT:    1001a: adr.w   r3, #4086
166/// AlignDown(0x1001e+4, 4) + 0xff7 = 0x11017 = dat5 + 8
167// CHECK-NEXT:   1001e:  adr.w  r4, #4087
168
169// CHECK: 00010100 <target3>:
170// CHECK-NEXT:    10100: bx      lr
171
172// CHECK: 00010102 <target4>:
173// CHECK-NEXT:    10102: bx      lr
174
175// SYMS:     Name: dat5
176// SYMS-NEXT:     Value: 0x1100F
177// SYMS:     Name: dat6
178// SYMS-NEXT:     Value: 0x11010
179// SYMS:     Name: dat7
180// SYMS-NEXT:     Value: 0x11011
181// SYMS:     Name: dat8
182// SYMS-NEXT:     Value: 0x11012
183