104 lines
3.2 KiB
ArmAsm
104 lines
3.2 KiB
ArmAsm
# 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 |