1 # RUN: rm -rf %t && mkdir -p %t
2 # RUN: llvm-mc -triple=arm64-apple-ios7.0.0 -filetype=obj -o %t/foo.o %s
3 # RUN: llvm-rtdyld -triple=arm64-apple-ios7.0.0 -map-section foo.o,__text=0x10bc0 -dummy-extern _dummy1=0x100000 -verify -check=%s %t/foo.o
5 .section __TEXT,__text,regular,pure_instructions
13 .globl _test_branch_reloc
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]
26 .globl _test_branch_reloc_bl
28 # rtdyld-check: decode_operand(br2, 0)[25:0] = (_foo - br2)[27:2]
29 _test_branch_reloc_bl
:
34 # Test ARM64_RELOC_PAGE21 and ARM64_RELOC_PAGEOFF12 relocation. adrp encodes
35 # the PC-relative page (4 KiB) difference between the adrp instruction and the
36 # variable ptr. ldr encodes the offset of the variable within the page. The ldr
37 # instruction perfroms an implicit shift on the encoded immediate (imm<<3).
38 # rtdyld-check: decode_operand(adrp1, 1) = (_ptr[32:12] - adrp1[32:12])
39 # rtdyld-check: decode_operand(ldr1, 2) = _ptr[11:3]
46 ldr x0
, [x0
, _ptr@PAGEOFF
]
49 # Test ARM64_RELOC_GOT_LOAD_PAGE21 and ARM64_RELOC_GOT_LOAD_PAGEOFF12
50 # relocation. adrp encodes the PC-relative page (4 KiB) difference between the
51 # adrp instruction and the GOT entry for ptr. ldr encodes the offset of the GOT
52 # entry within the page. The ldr instruction perfroms an implicit shift on the
53 # encoded immediate (imm<<3).
54 # rtdyld-check: *{8}(stub_addr(foo.o/__text, _ptr)) = _ptr
55 # rtdyld-check: decode_operand(adrp2, 1) = (stub_addr(foo.o/__text, _ptr)[32:12] - adrp2[32:12])
56 # rtdyld-check: decode_operand(ldr2, 2) = stub_addr(foo.o/__text, _ptr)[11:3]
63 ldr x0
, [x0
, _ptr@GOTPAGEOFF
]
66 # rtdyld-check: decode_operand(add1, 2) = (tgt+8)[11:2] << 2
67 .globl _test_explicit_addend_reloc
69 _test_explicit_addend_reloc
:
71 add x0
, x0
, tgt@PAGEOFF+
8
79 # Test ARM64_RELOC_UNSIGNED relocation. The absolute 64-bit address of the
80 # function should be stored at the 8-byte memory location.
81 # rtdyld-check: *{8}_ptr = _foo
82 .section __DATA,__data
89 # Test ARM64_RELOC_SUBTRACTOR.
90 # rtdyld-check: *{8}_subtractor_result = _test_branch_reloc - _foo
92 .quad _test_branch_reloc - _foo
94 # Test 32-bit relative ARM64_RELOC_POINTER_TO_GOT
95 # rtdyld-check: *{4}_pointer_to_got_32_rel = (stub_addr(foo.o/__data, _dummy1) - _pointer_to_got_32_rel)
96 _pointer_to_got_32_rel
:
99 # Test 64-bit absolute ARM64_RELOC_POINTER_TO_GOT
100 # rtdyld-check: *{8}_pointer_to_got_64_abs = stub_addr(foo.o/__data, _dummy1)
101 _pointer_to_got_64_abs
:
104 .subsections_via_symbols