| # RUN: rm -rf %t && mkdir -p %t |
| # RUN: llvm-mc -triple=arm64-apple-ios7.0.0 -filetype=obj -o %t/foo.o %s |
| # 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 |
| |
| .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 |
| |
| .globl _test_branch_reloc_bl |
| .align 2 |
| # rtdyld-check: decode_operand(br2, 0)[25:0] = (_foo - br2)[27:2] |
| _test_branch_reloc_bl: |
| br2: |
| bl _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(foo.o, __text, _ptr)) = _ptr |
| # rtdyld-check: decode_operand(adrp2, 1) = (stub_addr(foo.o, __text, _ptr)[32:12] - adrp2[32:12]) |
| # rtdyld-check: decode_operand(ldr2, 2) = stub_addr(foo.o, __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 |
| |
| # rtdyld-check: decode_operand(add1, 2) = (tgt+8)[11:2] << 2 |
| .globl _test_explicit_addend_reloc |
| .align 4 |
| _test_explicit_addend_reloc: |
| add1: |
| add x0, x0, tgt@PAGEOFF+8 |
| |
| .align 3 |
| tgt: |
| .long 0 |
| .long 0 |
| .long 7 |
| |
| # 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 |
| |
| # Test ARM64_RELOC_SUBTRACTOR. |
| # rtdyld-check: *{8}_subtractor_result = _test_branch_reloc - _foo |
| _subtractor_result: |
| .quad _test_branch_reloc - _foo |
| |
| # Test 32-bit relative ARM64_RELOC_POINTER_TO_GOT |
| # rtdyld-check: *{4}_pointer_to_got_32_rel = (stub_addr(foo.o, __data, _dummy1) - _pointer_to_got_32_rel) |
| _pointer_to_got_32_rel: |
| .long _dummy1@got - . |
| |
| # Test 64-bit absolute ARM64_RELOC_POINTER_TO_GOT |
| # rtdyld-check: *{8}_pointer_to_got_64_abs = stub_addr(foo.o, __data, _dummy1) |
| _pointer_to_got_64_abs: |
| .quad _dummy1@got |
| |
| .subsections_via_symbols |