]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/ELF/aarch64-relocs.s
Vendor import of lld trunk r338150:
[FreeBSD/FreeBSD.git] / test / ELF / aarch64-relocs.s
1 # REQUIRES: aarch64
2 # RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-freebsd %s -o %t
3 # RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-freebsd %p/Inputs/uabs_label.s -o %t2.o
4 # RUN: ld.lld %t %t2.o -o %t2
5 # RUN: llvm-objdump -d %t2 | FileCheck %s
6
7 .section .R_AARCH64_ADR_PREL_LO21,"ax",@progbits
8 .globl _start
9 _start:
10   adr x1,msg
11 msg:  .asciz  "Hello, world\n"
12 msgend:
13
14 # CHECK: Disassembly of section .R_AARCH64_ADR_PREL_LO21:
15 # CHECK: _start:
16 # CHECK:        0:       21 00 00 10     adr     x1, #4
17 # CHECK: msg:
18 # CHECK:        4:
19 # #4 is the adr immediate value.
20
21 .section .R_AARCH64_ADR_PREL_PG_H121,"ax",@progbits
22   adrp x1,mystr
23 mystr:
24   .asciz "blah"
25   .size mystr, 4
26
27 # S = 0x20012, A = 0x4, P = 0x20012
28 # PAGE(S + A) = 0x11000
29 # PAGE(P) = 0x11000
30 #
31 # CHECK: Disassembly of section .R_AARCH64_ADR_PREL_PG_H121:
32 # CHECK-NEXT: $x.2:
33 # CHECK-NEXT:   20012:       01 00 00 90     adrp    x1, #0
34
35 .section .R_AARCH64_ADD_ABS_LO12_NC,"ax",@progbits
36   add x0, x0, :lo12:.L.str
37 .L.str:
38   .asciz "blah"
39   .size mystr, 4
40
41 # S = 0x2001b, A = 0x4
42 # R = (S + A) & 0xFFF = 0x1f
43 # R << 10 = 0x7c00
44 #
45 # CHECK: Disassembly of section .R_AARCH64_ADD_ABS_LO12_NC:
46 # CHECK-NEXT: $x.4:
47 # CHECK-NEXT:   2001b:       00 7c 00 91     add     x0, x0, #31
48
49 .section .R_AARCH64_LDST64_ABS_LO12_NC,"ax",@progbits
50   ldr x28, [x27, :lo12:foo]
51 foo:
52   .asciz "foo"
53   .size mystr, 3
54
55 # S = 0x20024, A = 0x4
56 # R = ((S + A) & 0xFFF) << 7 = 0x00001400
57 # 0x00001400 | 0xf940177c = 0xf940177c
58 # CHECK: Disassembly of section .R_AARCH64_LDST64_ABS_LO12_NC:
59 # CHECK-NEXT: $x.6:
60 # CHECK-NEXT:   20024:       7c 17 40 f9     ldr     x28, [x27, #40]
61
62 .section .SUB,"ax",@progbits
63   nop
64 sub:
65   nop
66
67 # CHECK: Disassembly of section .SUB:
68 # CHECK-NEXT: $x.8:
69 # CHECK-NEXT:   2002c:       1f 20 03 d5     nop
70 # CHECK: sub:
71 # CHECK-NEXT:   20030:       1f 20 03 d5     nop
72
73 .section .R_AARCH64_CALL26,"ax",@progbits
74 call26:
75         bl sub
76
77 # S = 0x2002c, A = 0x4, P = 0x20034
78 # R = S + A - P = -0x4 = 0xfffffffc
79 # (R & 0x0ffffffc) >> 2 = 0x03ffffff
80 # 0x94000000 | 0x03ffffff = 0x97ffffff
81 # CHECK: Disassembly of section .R_AARCH64_CALL26:
82 # CHECK-NEXT: call26:
83 # CHECK-NEXT:   20034:       ff ff ff 97     bl     #-4
84
85 .section .R_AARCH64_JUMP26,"ax",@progbits
86 jump26:
87         b sub
88
89 # S = 0x2002c, A = 0x4, P = 0x20038
90 # R = S + A - P = -0x8 = 0xfffffff8
91 # (R & 0x0ffffffc) >> 2 = 0x03fffffe
92 # 0x14000000 | 0x03fffffe = 0x17fffffe
93 # CHECK: Disassembly of section .R_AARCH64_JUMP26:
94 # CHECK-NEXT: jump26:
95 # CHECK-NEXT:   20038:       fe ff ff 17     b      #-8
96
97 .section .R_AARCH64_LDST32_ABS_LO12_NC,"ax",@progbits
98 ldst32:
99   ldr s4, [x5, :lo12:foo32]
100 foo32:
101   .asciz "foo"
102   .size mystr, 3
103
104 # S = 0x2003c, A = 0x4
105 # R = ((S + A) & 0xFFC) << 8 = 0x00004000
106 # 0x00004000 | 0xbd4000a4 = 0xbd4040a4
107 # CHECK: Disassembly of section .R_AARCH64_LDST32_ABS_LO12_NC:
108 # CHECK-NEXT: ldst32:
109 # CHECK-NEXT:   2003c:       a4 40 40 bd     ldr s4, [x5, #64]
110
111 .section .R_AARCH64_LDST8_ABS_LO12_NC,"ax",@progbits
112 ldst8:
113   ldrsb x11, [x13, :lo12:foo8]
114 foo8:
115   .asciz "foo"
116   .size mystr, 3
117
118 # S = 0x20044, A = 0x4
119 # R = ((S + A) & 0xFFF) << 10 = 0x00012000
120 # 0x00012000 | 0x398001ab = 0x398121ab
121 # CHECK: Disassembly of section .R_AARCH64_LDST8_ABS_LO12_NC:
122 # CHECK-NEXT: ldst8:
123 # CHECK-NEXT:   20044:       ab 21 81 39     ldrsb x11, [x13, #72]
124
125 .section .R_AARCH64_LDST128_ABS_LO12_NC,"ax",@progbits
126 ldst128:
127   ldr q20, [x19, #:lo12:foo128]
128 foo128:
129   .asciz "foo"
130   .size mystr, 3
131
132 # S = 0x2004c, A = 0x4
133 # R = ((S + A) & 0xFF8) << 6 = 0x00001400
134 # 0x00001400 | 0x3dc00274 = 0x3dc01674
135 # CHECK: Disassembly of section .R_AARCH64_LDST128_ABS_LO12_NC:
136 # CHECK: ldst128:
137 # CHECK:   2004c:       74 16 c0 3d     ldr     q20, [x19, #80]
138 #foo128:
139 #   20050:       66 6f 6f 00     .word
140
141 .section .R_AARCH64_LDST16_ABS_LO12_NC,"ax",@progbits
142 ldst16:
143   ldr h17, [x19, :lo12:foo16]
144   ldrh w1, [x19, :lo12:foo16]
145   ldrh w2, [x19, :lo12:foo16 + 2]
146 foo16:
147   .asciz "foo"
148   .size mystr, 4
149
150 # S = 0x20054, A = 0x4
151 # R = ((S + A) & 0x0FFC) << 9 = 0xb000
152 # 0xb000 | 0x7d400271 = 0x7d40b271
153 # CHECK: Disassembly of section .R_AARCH64_LDST16_ABS_LO12_NC:
154 # CHECK-NEXT: ldst16:
155 # CHECK-NEXT:   20054:       71 c2 40 7d     ldr     h17, [x19, #96]
156 # CHECK-NEXT:   20058:       61 c2 40 79     ldrh    w1, [x19, #96]
157 # CHECK-NEXT:   2005c:       62 c6 40 79     ldrh    w2, [x19, #98]
158
159 .section .R_AARCH64_MOVW_UABS,"ax",@progbits
160 movz1:
161    movk x12, #:abs_g0_nc:uabs_label
162    movk x13, #:abs_g1_nc:uabs_label
163    movk x14, #:abs_g2_nc:uabs_label
164    movz x15, #:abs_g3:uabs_label
165    movk x16, #:abs_g3:uabs_label
166
167 ## 4222124650659840 == (0xF << 48)
168 # CHECK: Disassembly of section .R_AARCH64_MOVW_UABS:
169 # CHECK-NEXT: movz1:
170 # CHECK-NEXT: 8c 01 80 f2   movk  x12, #12
171 # CHECK-NEXT: ad 01 a0 f2   movk  x13, #13, lsl #16
172 # CHECK-NEXT: ce 01 c0 f2   movk  x14, #14, lsl #32
173 # CHECK-NEXT: ef 01 e0 d2   mov x15, #4222124650659840
174 # CHECK-NEXT: f0 01 e0 f2   movk  x16, #15, lsl #48