forked from OSchip/llvm-project
[JITLink][AArch64] Handle addends on PAGE21 / PAGEOFF12 relocations.
This commit is contained in:
parent
d561d1bf96
commit
47cfffe893
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue