summaryrefslogtreecommitdiff
path: root/test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s
diff options
context:
space:
mode:
Diffstat (limited to 'test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s')
-rw-r--r--test/ExecutionEngine/RuntimeDyld/AArch64/MachO_ARM64_relocations.s67
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