xref: /llvm-project/lld/test/ELF/arm-ldrlit.s (revision 75cdab6dc2453a508157a9c383b93373a93078d6)
1// REQUIRES: arm
2// RUN: llvm-mc --triple=armv7a-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 -n --script %t.script %t.o -o %t
12// RUN: llvm-readobj --symbols %t | FileCheck %s --check-prefix=SYMS
13// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn --triple=armv7a-none-eabi %t | FileCheck %s
14
15/// Test the various legal cases for the R_ARM_LDR_PC_G0 relocation
16/// Range is +- 4095 bytes
17/// The Thumb bit for function symbols is ignored
18 .section .rodata.low, "a", %progbits
19dat1:
20 .byte 0
21dat2:
22 .byte 1
23dat3:
24 .byte 2
25dat4:
26 .byte 3
27
28 .section .text.low, "ax", %progbits
29 .balign 4
30 .global target1
31 .type target1, %function
32target1:
33 bx lr
34 .type target2, %function
35target2:
36 bx lr
37
38 .section .text.neg, "ax", %progbits
39 .balign 4
40 .global _start
41 .type _start, %function
42_start:
43/// ldr r0, dat1
44 .inst 0xe51f0008
45 .reloc 0, R_ARM_LDR_PC_G0, dat1
46/// ldr r1, dat2
47 .inst 0xe51f1008
48 .reloc 4, R_ARM_LDR_PC_G0, dat2
49/// ldr r2, dat3
50 .inst 0xe51f2008
51 .reloc 8, R_ARM_LDR_PC_G0, dat3
52/// ldr r3, dat4
53 .inst 0xe51f3008
54 .reloc 0xc, R_ARM_LDR_PC_G0, dat4
55/// ldr r0, target1
56 .inst 0xe51f0008
57 .reloc 0x10, R_ARM_LDR_PC_G0, target1
58/// ldr r1, target2
59 .inst 0xe51f1008
60 .reloc 0x14, R_ARM_LDR_PC_G0, target2
61
62 .section .text.pos, "ax", %progbits
63 .balign 4
64 .global pos
65 .type pos, %function
66pos:
67/// ldr r2, target3
68 .inst 0xe51f2008
69 .reloc 0, R_ARM_LDR_PC_G0, target3
70/// ldr r3, target4
71 .inst 0xe51f3008
72 .reloc 4, R_ARM_LDR_PC_G0, target4
73/// ldr r0, dat5
74 .inst 0xe51f0008
75 .reloc 8, R_ARM_LDR_PC_G0, dat5
76/// ldr r1, dat6
77 .inst 0xe51f1008
78 .reloc 0xc, R_ARM_LDR_PC_G0, dat6
79/// ldr r2, dat7
80 .inst 0xe51f2008
81 .reloc 0x10, R_ARM_LDR_PC_G0, dat7
82/// ldr r3, dat8
83 .inst 0xe51f3008
84 .reloc 0x14, R_ARM_LDR_PC_G0, dat8
85
86/// positive addend in instruction, all others are -4 (PC bias)
87///ldr r4, dat5 + 8
88 .inst 0xe59f4000
89 .reloc 0x18, R_ARM_LDR_PC_G0, dat5
90
91 .section .text.high, "ax", %progbits
92 .balign 4
93 .type target3, %function
94 .global target3
95target3:
96 bx lr
97 .thumb_func
98target4:
99 bx lr
100
101 .section .data.high, "aw", %progbits
102dat5:
103 .byte 0
104dat6:
105 .byte 1
106dat7:
107 .byte 2
108dat8:
109 .byte 3
110
111// SYMS:     Name: dat1
112// SYMS-NEXT:     Value: 0x8012
113// SYMS:     Name: dat2
114// SYMS-NEXT:     Value: 0x8013
115// SYMS:     Name: dat3
116// SYMS-NEXT:     Value: 0x8014
117// SYMS:     Name: dat4
118// SYMS-NEXT:     Value: 0x8015
119
120// CHECK: 00008f00 <target1>:
121// CHECK-NEXT:     8f00:        bx      lr
122
123// CHECK: 00008f04 <target2>:
124// CHECK-NEXT:     8f04:        bx      lr
125
126// CHECK: 00009000 <_start>:
127/// 0x9000 + 0x8 - 0xff6 = 0x8012
128// CHECK-NEXT: 9000:  ldr     r0, [pc, #-4086]
129/// 0x9004 + 0x8 - 0xff9 = 0x8013
130// CHECK-NEXT: 9004:  ldr     r1, [pc, #-4089]
131/// 0x9008 + 0x8 - 0xffc = 0x8014
132// CHECK-NEXT: 9008:  ldr     r2, [pc, #-4092]
133/// 0x900c + 0x8 - 0xfff = 0x8015
134// CHECK-NEXT: 900c:  ldr     r3, [pc, #-4095]
135/// 0x9010 + 0x8 - 0x118 = 0x8f00
136// CHECK-NEXT: 9010:  ldr     r0, [pc, #-280]
137/// 0x9014 + 0x8 - 0x118 = 0x8f04
138// CHECK-NEXT: 9014:  ldr     r1, [pc, #-280]
139///
140// CHECK: 00010000 <pos>:
141/// 0x10000 + 0x8 + 0xf8 = 0x10100
142// CHECK-NEXT: 10000:  ldr     r2, [pc, #248]
143/// 0x10004 + 0x8 + 0xf8 = 0x10104
144// CHECK-NEXT: 10004: ldr     r3, [pc, #248]
145/// 0x10008 + 0x8 + 0xfff = 0x1100f
146// CHECK-NEXT: 10008: ldr     r0, [pc, #4095]
147/// 0x1000c + 0x8 + 0xffc = 0x11010
148// CHECK-NEXT: 1000c: ldr     r1, [pc, #4092]
149/// 0x10010 + 0x8 + 0xff9 = 0x11011
150// CHECK-NEXT: 10010: ldr     r2, [pc, #4089]
151/// 0x10014 + 0x8 + 0xff6 = 0x11012
152// CHECK-NEXT: 10014: ldr     r3, [pc, #4086]
153/// 0x10018 + 0x8 + 0xff7 = 0x11017 = dat5 + 8
154// CHECK-NEXT: 10018: ldr     r4, [pc, #4087]
155
156// CHECK: 00010100 <target3>:
157// CHECK-NEXT: 10100: bx      lr
158
159// CHECK: 00010104 <target4>:
160// CHECK-NEXT: 10104: bx      lr
161
162// SYMS:     Name: dat5
163// SYMS-NEXT:     Value: 0x1100F
164// SYMS:     Name: dat6
165// SYMS-NEXT:     Value: 0x11010
166// SYMS:     Name: dat7
167// SYMS-NEXT:     Value: 0x11011
168// SYMS:     Name: dat8
169// SYMS-NEXT:     Value: 0x11012
170