[JITLink][AArch64] Handle addends on PAGE21 / PAGEOFF12 relocations.

This commit is contained in:
Lang Hames 2020-08-04 21:25:48 -07:00
parent d561d1bf96
commit 47cfffe893
2 changed files with 29 additions and 27 deletions

View File

@ -587,10 +587,12 @@ private:
}
case Page21:
case GOTPage21: {
assert(E.getAddend() == 0 && "PAGE21/GOTPAGE21 with non-zero addend");
assert((E.getKind() != GOTPage21 || E.getAddend() == 0) &&
"GOTPAGE21 with non-zero addend");
uint64_t TargetPage =
E.getTarget().getAddress() & ~static_cast<uint64_t>(4096 - 1);
uint64_t PCPage = B.getAddress() & ~static_cast<uint64_t>(4096 - 1);
(E.getTarget().getAddress() + E.getAddend()) &
~static_cast<uint64_t>(4096 - 1);
uint64_t PCPage = FixupAddress & ~static_cast<uint64_t>(4096 - 1);
int64_t PageDelta = TargetPage - PCPage;
if (PageDelta < -(1 << 30) || PageDelta > ((1 << 30) - 1))
@ -606,8 +608,8 @@ private:
break;
}
case PageOffset12: {
assert(E.getAddend() == 0 && "PAGEOFF12 with non-zero addend");
uint64_t TargetOffset = E.getTarget().getAddress() & 0xfff;
uint64_t TargetOffset =
(E.getTarget().getAddress() + E.getAddend()) & 0xfff;
uint32_t RawInstr = *(ulittle32_t *)FixupPtr;
unsigned ImmShift = getPageOffset12Shift(RawInstr);

View File

@ -58,61 +58,61 @@ test_gotpageoff12:
# For the GOTPAGEOFF12 relocation we test the ADD instruction, all LDR/GPR
# variants and all LDR/Neon variants.
#
# jitlink-check: decode_operand(test_page21, 1) = (named_data[32:12] - test_page21[32:12])
# jitlink-check: decode_operand(test_pageoff12add, 2) = named_data[11:0]
# jitlink-check: decode_operand(test_pageoff12gpr8, 2) = named_data[11:0]
# jitlink-check: decode_operand(test_pageoff12gpr16, 2) = named_data[11:1]
# jitlink-check: decode_operand(test_pageoff12gpr32, 2) = named_data[11:2]
# jitlink-check: decode_operand(test_pageoff12gpr64, 2) = named_data[11:3]
# jitlink-check: decode_operand(test_pageoff12neon8, 2) = named_data[11:0]
# jitlink-check: decode_operand(test_pageoff12neon16, 2) = named_data[11:1]
# jitlink-check: decode_operand(test_pageoff12neon32, 2) = named_data[11:2]
# jitlink-check: decode_operand(test_pageoff12neon64, 2) = named_data[11:3]
# jitlink-check: decode_operand(test_pageoff12neon128, 2) = named_data[11:4]
# jitlink-check: decode_operand(test_page21, 1) = ((named_data + 256) - test_page21)[32:12]
# jitlink-check: decode_operand(test_pageoff12add, 2) = (named_data + 256)[11:0]
# jitlink-check: decode_operand(test_pageoff12gpr8, 2) = (named_data + 256)[11:0]
# jitlink-check: decode_operand(test_pageoff12gpr16, 2) = (named_data + 256)[11:1]
# jitlink-check: decode_operand(test_pageoff12gpr32, 2) = (named_data + 256)[11:2]
# jitlink-check: decode_operand(test_pageoff12gpr64, 2) = (named_data + 256)[11:3]
# jitlink-check: decode_operand(test_pageoff12neon8, 2) = (named_data + 256)[11:0]
# jitlink-check: decode_operand(test_pageoff12neon16, 2) = (named_data + 256)[11:1]
# jitlink-check: decode_operand(test_pageoff12neon32, 2) = (named_data + 256)[11:2]
# jitlink-check: decode_operand(test_pageoff12neon64, 2) = (named_data + 256)[11:3]
# jitlink-check: decode_operand(test_pageoff12neon128, 2) = (named_data + 256)[11:4]
.globl test_page21
.p2align 2
test_page21:
adrp x0, named_data@PAGE
adrp x0, named_data@PAGE + 256
.globl test_pageoff12add
test_pageoff12add:
add x0, x0, named_data@PAGEOFF
add x0, x0, named_data@PAGEOFF + 256
.globl test_pageoff12gpr8
test_pageoff12gpr8:
ldrb w0, [x0, named_data@PAGEOFF]
ldrb w0, [x0, named_data@PAGEOFF + 256]
.globl test_pageoff12gpr16
test_pageoff12gpr16:
ldrh w0, [x0, named_data@PAGEOFF]
ldrh w0, [x0, named_data@PAGEOFF + 256]
.globl test_pageoff12gpr32
test_pageoff12gpr32:
ldr w0, [x0, named_data@PAGEOFF]
ldr w0, [x0, named_data@PAGEOFF + 256]
.globl test_pageoff12gpr64
test_pageoff12gpr64:
ldr x0, [x0, named_data@PAGEOFF]
ldr x0, [x0, named_data@PAGEOFF + 256]
.globl test_pageoff12neon8
test_pageoff12neon8:
ldr b0, [x0, named_data@PAGEOFF]
ldr b0, [x0, named_data@PAGEOFF + 256]
.globl test_pageoff12neon16
test_pageoff12neon16:
ldr h0, [x0, named_data@PAGEOFF]
ldr h0, [x0, named_data@PAGEOFF + 256]
.globl test_pageoff12neon32
test_pageoff12neon32:
ldr s0, [x0, named_data@PAGEOFF]
ldr s0, [x0, named_data@PAGEOFF + 256]
.globl test_pageoff12neon64
test_pageoff12neon64:
ldr d0, [x0, named_data@PAGEOFF]
ldr d0, [x0, named_data@PAGEOFF + 256]
.globl test_pageoff12neon128
test_pageoff12neon128:
ldr q0, [x0, named_data@PAGEOFF]
ldr q0, [x0, named_data@PAGEOFF + 256]
# Check that calls to external functions trigger the generation of stubs and GOT
# entries.