31f2442acccb90177fc630fc3c4d8c676f3feee1
[oota-llvm.git] / test / ExecutionEngine / RuntimeDyld / AArch64 / MachO_ARM64_relocations.s
1 # RUN: llvm-mc -triple=arm64-apple-ios7.0.0 -code-model=small -relocation-model=pic -filetype=obj -o %T/foo.o %s
2 # RUN: llvm-rtdyld -triple=arm64-apple-ios7.0.0 -verify -check=%s %/T/foo.o
3 # XFAIL: mips
4
5     .section  __TEXT,__text,regular,pure_instructions
6     .ios_version_min 7, 0
7     .globl  _foo
8     .align  2
9 _foo:
10     movz  w0, #0
11     ret
12
13     .globl  _test_branch_reloc
14     .align  2
15
16
17 # Test ARM64_RELOC_BRANCH26 relocation. The branch instruction only encodes 26
18 # bits of the 28-bit possible branch range. The lower two bits are always zero
19 # and therefore ignored.
20 # rtdyld-check:  decode_operand(br1, 0)[25:0] = (_foo - br1)[27:2]
21 _test_branch_reloc:
22 br1:
23     b _foo
24     ret
25
26
27 # Test ARM64_RELOC_PAGE21 and ARM64_RELOC_PAGEOFF12 relocation. adrp encodes
28 # the PC-relative page (4 KiB) difference between the adrp instruction and the
29 # variable ptr. ldr encodes the offset of the variable within the page. The ldr
30 # instruction perfroms an implicit shift on the encoded immediate (imm<<3).
31 # rtdyld-check:  decode_operand(adrp1, 1) = (_ptr[32:12] - adrp1[32:12])
32 # rtdyld-check:  decode_operand(ldr1, 2) = _ptr[11:3]
33     .globl  _test_adrp_ldr
34     .align  2
35 _test_adrp_ldr:
36 adrp1:
37     adrp x0, _ptr@PAGE
38 ldr1:
39     ldr  x0, [x0, _ptr@PAGEOFF]
40     ret
41
42 # Test ARM64_RELOC_GOT_LOAD_PAGE21 and ARM64_RELOC_GOT_LOAD_PAGEOFF12
43 # relocation. adrp encodes the PC-relative page (4 KiB) difference between the
44 # adrp instruction and the GOT entry for ptr. ldr encodes the offset of the GOT
45 # entry within the page. The ldr instruction perfroms an implicit shift on the
46 # encoded immediate (imm<<3).
47 # rtdyld-check:  *{8}(stub_addr(foo.o, __text, _ptr)) = _ptr
48 # rtdyld-check:  decode_operand(adrp2, 1) = (stub_addr(foo.o, __text, _ptr)[32:12] - adrp2[32:12])
49 # rtdyld-check:  decode_operand(ldr2, 2) = stub_addr(foo.o, __text, _ptr)[11:3]
50     .globl  _test_adrp_ldr
51     .align  2
52 _test_got_adrp_ldr:
53 adrp2:
54     adrp x0, _ptr@GOTPAGE
55 ldr2:
56     ldr  x0, [x0, _ptr@GOTPAGEOFF]
57     ret
58
59
60 # Test ARM64_RELOC_UNSIGNED relocation. The absolute 64-bit address of the
61 # function should be stored at the 8-byte memory location.
62 # rtdyld-check: *{8}_ptr = _foo
63     .section  __DATA,__data
64     .globl  _ptr
65     .align  3
66     .fill 4096, 1, 0
67 _ptr:
68     .quad _foo