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 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: 22br1: 23 b _foo 24 ret 25 26 .globl _test_branch_reloc_bl 27 .align 2 28# rtdyld-check: decode_operand(br2, 0)[25:0] = (_foo - br2)[27:2] 29_test_branch_reloc_bl: 30br2: 31 bl _foo 32 ret 33 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] 40 .globl _test_adrp_ldr 41 .align 2 42_test_adrp_ldr: 43adrp1: 44 adrp x0, _ptr@PAGE 45ldr1: 46 ldr x0, [x0, _ptr@PAGEOFF] 47 ret 48 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] 57 .globl _test_adrp_ldr 58 .align 2 59_test_got_adrp_ldr: 60adrp2: 61 adrp x0, _ptr@GOTPAGE 62ldr2: 63 ldr x0, [x0, _ptr@GOTPAGEOFF] 64 ret 65 66# rtdyld-check: decode_operand(add1, 2) = (tgt+8)[11:2] << 2 67 .globl _test_explicit_addend_reloc 68 .align 4 69_test_explicit_addend_reloc: 70add1: 71 add x0, x0, tgt@PAGEOFF+8 72 73 .align 3 74tgt: 75 .long 0 76 .long 0 77 .long 7 78 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 83 .globl _ptr 84 .align 3 85 .fill 4096, 1, 0 86_ptr: 87 .quad _foo 88 89# Test ARM64_RELOC_SUBTRACTOR. 90# rtdyld-check: *{8}_subtractor_result = _test_branch_reloc - _foo 91_subtractor_result: 92 .quad _test_branch_reloc - _foo 93 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: 97 .long _dummy1@got - . 98 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: 102 .quad _dummy1@got 103 104.subsections_via_symbols