diff options
Diffstat (limited to 'test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s')
-rw-r--r-- | test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s b/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s new file mode 100644 index 000000000000..04d269e2aebf --- /dev/null +++ b/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s @@ -0,0 +1,67 @@ +# RUN: llvm-mc -triple=arm64-apple-ios7.0.0 -code-model=small -relocation-model=pic -filetype=obj -o %T/foo.o %s +# RUN: llvm-rtdyld -triple=arm64-apple-ios7.0.0 -map-section foo.o,__text=0x10bc0 -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 + + +# 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 + + +# 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 |