summaryrefslogtreecommitdiffstats
path: root/llvm/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s
blob: fd4fd9acf35033b27d6cfa355b7259c2b6f8f552 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# RUN: llvm-mc -triple=arm64-apple-ios7.0.0 -code-model=small -relocation-model=pic -filetype=obj -o %T/foo.o %s
# RUN: sed "s,<filename>,%/T/foo.o,g" %s > %T/foo.s
# RUN: llvm-rtdyld -triple=arm64-apple-ios7.0.0 -verify -check=%T/foo.s %/T/foo.o
# XFAIL: mips

    .section  __TEXT,__text,regular,pure_instructions
    .ios_version_min 7, 0
    .globl  _foo
    .align  2
_foo:
    movz  w0, #0
    ret

    .globl  _test_branch_reloc
    .align  2


# Test ARM64_RELOC_BRANCH26 relocation. The branch instruction only encodes 26
# bits of the 28-bit possible branch range. The lower two bits are always zero
# and therefore ignored.
# rtdyld-check:  decode_operand(br1, 0)[25:0] = (_foo - br1)[27:2]
_test_branch_reloc:
br1:
    b _foo
    ret


# Test ARM64_RELOC_PAGE21 and ARM64_RELOC_PAGEOFF12 relocation. adrp encodes
# the PC-relative page (4 KiB) difference between the adrp instruction and the
# variable ptr. ldr encodes the offset of the variable within the page. The ldr
# instruction perfroms an implicit shift on the encoded immediate (imm<<3).
# rtdyld-check:  decode_operand(adrp1, 1) = (_ptr[32:12] - adrp1[32:12])
# rtdyld-check:  decode_operand(ldr1, 2) = (_ptr[11:3])
    .globl  _test_adrp_ldr
    .align  2
_test_adrp_ldr:
adrp1:
    adrp x0, _ptr@PAGE
ldr1:
    ldr  x0, [x0, _ptr@PAGEOFF]
    ret


# Test ARM64_RELOC_GOT_LOAD_PAGE21 and ARM64_RELOC_GOT_LOAD_PAGEOFF12
# relocation. adrp encodes the PC-relative page (4 KiB) difference between the
# adrp instruction and the GOT entry for ptr. ldr encodes the offset of the GOT
# entry within the page. The ldr instruction perfroms an implicit shift on the
# encoded immediate (imm<<3).
# rtdyld-check:  *{8}(stub_addr(<filename>, __text, _ptr)) = _ptr
# rtdyld-check:  decode_operand(adrp2, 1) = (stub_addr(<filename>, __text, _ptr)[32:12] - adrp2[32:12])
# rtdyld-check:  decode_operand(ldr2, 2) = (stub_addr(<filename>, __text, _ptr)[11:3])
    .globl  _test_adrp_ldr
    .align  2
_test_got_adrp_ldr:
adrp2:
    adrp x0, _ptr@GOTPAGE
ldr2:
    ldr  x0, [x0, _ptr@GOTPAGEOFF]
    ret


# Test ARM64_RELOC_UNSIGNED relocation. The absolute 64-bit address of the
# function should be stored at the 8-byte memory location.
# rtdyld-check: *{8}_ptr = _foo
    .section  __DATA,__data
    .globl  _ptr
    .align  3
    .fill 4096, 1, 0
_ptr:
    .quad _foo
OpenPOWER on IntegriCloud