Skip to content

Commit 47cfffe

Browse files
committed
[JITLink][AArch64] Handle addends on PAGE21 / PAGEOFF12 relocations.
1 parent d561d1b commit 47cfffe

File tree

2 files changed

+29
-27
lines changed

2 files changed

+29
-27
lines changed

llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -587,10 +587,12 @@ class MachOJITLinker_arm64 : public JITLinker<MachOJITLinker_arm64> {
587587
}
588588
case Page21:
589589
case GOTPage21: {
590-
assert(E.getAddend() == 0 && "PAGE21/GOTPAGE21 with non-zero addend");
590+
assert((E.getKind() != GOTPage21 || E.getAddend() == 0) &&
591+
"GOTPAGE21 with non-zero addend");
591592
uint64_t TargetPage =
592-
E.getTarget().getAddress() & ~static_cast<uint64_t>(4096 - 1);
593-
uint64_t PCPage = B.getAddress() & ~static_cast<uint64_t>(4096 - 1);
593+
(E.getTarget().getAddress() + E.getAddend()) &
594+
~static_cast<uint64_t>(4096 - 1);
595+
uint64_t PCPage = FixupAddress & ~static_cast<uint64_t>(4096 - 1);
594596

595597
int64_t PageDelta = TargetPage - PCPage;
596598
if (PageDelta < -(1 << 30) || PageDelta > ((1 << 30) - 1))
@@ -606,8 +608,8 @@ class MachOJITLinker_arm64 : public JITLinker<MachOJITLinker_arm64> {
606608
break;
607609
}
608610
case PageOffset12: {
609-
assert(E.getAddend() == 0 && "PAGEOFF12 with non-zero addend");
610-
uint64_t TargetOffset = E.getTarget().getAddress() & 0xfff;
611+
uint64_t TargetOffset =
612+
(E.getTarget().getAddress() + E.getAddend()) & 0xfff;
611613

612614
uint32_t RawInstr = *(ulittle32_t *)FixupPtr;
613615
unsigned ImmShift = getPageOffset12Shift(RawInstr);

llvm/test/ExecutionEngine/JITLink/AArch64/MachO_arm64_relocations.s

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -58,61 +58,61 @@ test_gotpageoff12:
5858
# For the GOTPAGEOFF12 relocation we test the ADD instruction, all LDR/GPR
5959
# variants and all LDR/Neon variants.
6060
#
61-
# jitlink-check: decode_operand(test_page21, 1) = (named_data[32:12] - test_page21[32:12])
62-
# jitlink-check: decode_operand(test_pageoff12add, 2) = named_data[11:0]
63-
# jitlink-check: decode_operand(test_pageoff12gpr8, 2) = named_data[11:0]
64-
# jitlink-check: decode_operand(test_pageoff12gpr16, 2) = named_data[11:1]
65-
# jitlink-check: decode_operand(test_pageoff12gpr32, 2) = named_data[11:2]
66-
# jitlink-check: decode_operand(test_pageoff12gpr64, 2) = named_data[11:3]
67-
# jitlink-check: decode_operand(test_pageoff12neon8, 2) = named_data[11:0]
68-
# jitlink-check: decode_operand(test_pageoff12neon16, 2) = named_data[11:1]
69-
# jitlink-check: decode_operand(test_pageoff12neon32, 2) = named_data[11:2]
70-
# jitlink-check: decode_operand(test_pageoff12neon64, 2) = named_data[11:3]
71-
# jitlink-check: decode_operand(test_pageoff12neon128, 2) = named_data[11:4]
61+
# jitlink-check: decode_operand(test_page21, 1) = ((named_data + 256) - test_page21)[32:12]
62+
# jitlink-check: decode_operand(test_pageoff12add, 2) = (named_data + 256)[11:0]
63+
# jitlink-check: decode_operand(test_pageoff12gpr8, 2) = (named_data + 256)[11:0]
64+
# jitlink-check: decode_operand(test_pageoff12gpr16, 2) = (named_data + 256)[11:1]
65+
# jitlink-check: decode_operand(test_pageoff12gpr32, 2) = (named_data + 256)[11:2]
66+
# jitlink-check: decode_operand(test_pageoff12gpr64, 2) = (named_data + 256)[11:3]
67+
# jitlink-check: decode_operand(test_pageoff12neon8, 2) = (named_data + 256)[11:0]
68+
# jitlink-check: decode_operand(test_pageoff12neon16, 2) = (named_data + 256)[11:1]
69+
# jitlink-check: decode_operand(test_pageoff12neon32, 2) = (named_data + 256)[11:2]
70+
# jitlink-check: decode_operand(test_pageoff12neon64, 2) = (named_data + 256)[11:3]
71+
# jitlink-check: decode_operand(test_pageoff12neon128, 2) = (named_data + 256)[11:4]
7272
.globl test_page21
7373
.p2align 2
7474
test_page21:
75-
adrp x0, named_data@PAGE
75+
adrp x0, named_data@PAGE + 256
7676

7777
.globl test_pageoff12add
7878
test_pageoff12add:
79-
add x0, x0, named_data@PAGEOFF
79+
add x0, x0, named_data@PAGEOFF + 256
8080

8181
.globl test_pageoff12gpr8
8282
test_pageoff12gpr8:
83-
ldrb w0, [x0, named_data@PAGEOFF]
83+
ldrb w0, [x0, named_data@PAGEOFF + 256]
8484

8585
.globl test_pageoff12gpr16
8686
test_pageoff12gpr16:
87-
ldrh w0, [x0, named_data@PAGEOFF]
87+
ldrh w0, [x0, named_data@PAGEOFF + 256]
8888

8989
.globl test_pageoff12gpr32
9090
test_pageoff12gpr32:
91-
ldr w0, [x0, named_data@PAGEOFF]
91+
ldr w0, [x0, named_data@PAGEOFF + 256]
9292

9393
.globl test_pageoff12gpr64
9494
test_pageoff12gpr64:
95-
ldr x0, [x0, named_data@PAGEOFF]
95+
ldr x0, [x0, named_data@PAGEOFF + 256]
9696

9797
.globl test_pageoff12neon8
9898
test_pageoff12neon8:
99-
ldr b0, [x0, named_data@PAGEOFF]
99+
ldr b0, [x0, named_data@PAGEOFF + 256]
100100

101101
.globl test_pageoff12neon16
102102
test_pageoff12neon16:
103-
ldr h0, [x0, named_data@PAGEOFF]
103+
ldr h0, [x0, named_data@PAGEOFF + 256]
104104

105105
.globl test_pageoff12neon32
106106
test_pageoff12neon32:
107-
ldr s0, [x0, named_data@PAGEOFF]
107+
ldr s0, [x0, named_data@PAGEOFF + 256]
108108

109109
.globl test_pageoff12neon64
110110
test_pageoff12neon64:
111-
ldr d0, [x0, named_data@PAGEOFF]
111+
ldr d0, [x0, named_data@PAGEOFF + 256]
112112

113113
.globl test_pageoff12neon128
114114
test_pageoff12neon128:
115-
ldr q0, [x0, named_data@PAGEOFF]
115+
ldr q0, [x0, named_data@PAGEOFF + 256]
116116

117117
# Check that calls to external functions trigger the generation of stubs and GOT
118118
# entries.

0 commit comments

Comments
 (0)