Skip to content

Commit 62f793e

Browse files
eymayweliveindetail
authored andcommitted
[JITLink][AArch32] Implement ELF::R_ARM_JUMP24 relocation
Added support and test for ELF::R_ARM_JUMP24 Reviewed By: sgraenitz Differential Revision: https://reviews.llvm.org/D157541
1 parent 142c89c commit 62f793e

File tree

4 files changed

+56
-4
lines changed

4 files changed

+56
-4
lines changed

llvm/include/llvm/ExecutionEngine/JITLink/aarch32.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ enum EdgeKind_aarch32 : Edge::Kind {
5252
/// Arm and Thumb).
5353
Arm_Call = FirstArmRelocation,
5454

55-
LastArmRelocation = Arm_Call,
55+
/// Write immediate value for (unconditional) PC-relative branch without link.
56+
Arm_Jump24,
57+
58+
LastArmRelocation = Arm_Jump24,
5659

5760
///
5861
/// Relocations of class Thumb16 and Thumb32 (covers Thumb instruction subset)
@@ -149,12 +152,16 @@ struct HalfWords {
149152
///
150153
template <EdgeKind_aarch32 Kind> struct FixupInfo {};
151154

152-
template <> struct FixupInfo<Arm_Call> {
155+
template <> struct FixupInfo<Arm_Jump24> {
153156
static constexpr uint32_t Opcode = 0x0a000000;
154-
static constexpr uint32_t OpcodeMask = 0x0e000000;
157+
static constexpr uint32_t OpcodeMask = 0x0f000000;
155158
static constexpr uint32_t ImmMask = 0x00ffffff;
156159
static constexpr uint32_t Unconditional = 0xe0000000;
157160
static constexpr uint32_t CondMask = 0xe0000000; // excluding BLX bit
161+
};
162+
163+
template <> struct FixupInfo<Arm_Call> : public FixupInfo<Arm_Jump24> {
164+
static constexpr uint32_t OpcodeMask = 0x0e000000;
158165
static constexpr uint32_t BitH = 0x01000000;
159166
static constexpr uint32_t BitBlx = 0x10000000;
160167
};

llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ Expected<aarch32::EdgeKind_aarch32> getJITLinkEdgeKind(uint32_t ELFType) {
4040
return aarch32::Data_Delta32;
4141
case ELF::R_ARM_CALL:
4242
return aarch32::Arm_Call;
43+
case ELF::R_ARM_JUMP24:
44+
return aarch32::Arm_Jump24;
4345
case ELF::R_ARM_THM_CALL:
4446
return aarch32::Thumb_Call;
4547
case ELF::R_ARM_THM_JUMP24:
@@ -64,6 +66,8 @@ Expected<uint32_t> getELFRelocationType(Edge::Kind Kind) {
6466
return ELF::R_ARM_ABS32;
6567
case aarch32::Arm_Call:
6668
return ELF::R_ARM_CALL;
69+
case aarch32::Arm_Jump24:
70+
return ELF::R_ARM_JUMP24;
6771
case aarch32::Thumb_Call:
6872
return ELF::R_ARM_THM_CALL;
6973
case aarch32::Thumb_Jump24:

llvm/lib/ExecutionEngine/JITLink/aarch32.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,11 @@ Expected<int64_t> readAddendArm(LinkGraph &G, Block &B, const Edge &E) {
292292
return makeUnexpectedOpcodeError(G, R, Kind);
293293
return decodeImmBA1BlA1BlxA2(R.Wd);
294294

295+
case Arm_Jump24:
296+
if (!checkOpcode<Arm_Jump24>(R))
297+
return makeUnexpectedOpcodeError(G, R, Kind);
298+
return decodeImmBA1BlA1BlxA2(R.Wd);
299+
295300
default:
296301
return make_error<JITLinkError>(
297302
"In graph " + G.getName() + ", section " + B.getSection().getName() +
@@ -399,10 +404,25 @@ Error applyFixupArm(LinkGraph &G, Block &B, const Edge &E) {
399404
TargetAddress |= 0x01;
400405

401406
switch (Kind) {
407+
case Arm_Jump24: {
408+
if (!checkOpcode<Arm_Jump24>(R))
409+
return makeUnexpectedOpcodeError(G, R, Kind);
410+
if (hasTargetFlags(TargetSymbol, ThumbSymbol))
411+
return make_error<JITLinkError>("Branch relocation needs interworking "
412+
"stub when bridging to Thumb: " +
413+
StringRef(G.getEdgeKindName(Kind)));
414+
415+
int64_t Value = TargetAddress - FixupAddress + Addend;
416+
417+
if (!isInt<26>(Value))
418+
return makeTargetOutOfRangeError(G, B, E);
419+
writeImmediate<Arm_Jump24>(R, encodeImmBA1BlA1BlxA2(Value));
420+
421+
return Error::success();
422+
}
402423
case Arm_Call: {
403424
if (!checkOpcode<Arm_Call>(R))
404425
return makeUnexpectedOpcodeError(G, R, Kind);
405-
406426
if ((R.Wd & FixupInfo<Arm_Call>::CondMask) !=
407427
FixupInfo<Arm_Call>::Unconditional)
408428
return make_error<JITLinkError>("Relocation expects an unconditional "
@@ -577,6 +597,7 @@ const char *getEdgeKindName(Edge::Kind K) {
577597
KIND_NAME_CASE(Data_Delta32)
578598
KIND_NAME_CASE(Data_Pointer32)
579599
KIND_NAME_CASE(Arm_Call)
600+
KIND_NAME_CASE(Arm_Jump24)
580601
KIND_NAME_CASE(Thumb_Call)
581602
KIND_NAME_CASE(Thumb_Jump24)
582603
KIND_NAME_CASE(Thumb_MovwAbsNC)

llvm/test/ExecutionEngine/JITLink/AArch32/ELF_static_arm_reloc.s

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,26 @@ call_target:
3030
bx lr
3131
.size call_target, .-call_target
3232

33+
# CHECK-TYPE: {{[0-9a-f]+}} R_ARM_JUMP24 jump24_target
34+
# CHECK-INSTR: 00000008 <jump24_site>:
35+
# CHECK-INSTR: 8: eafffffe b 0x8 <jump24_site>
36+
# CHECK-INSTR: 0000000c <jump24_target>:
37+
# CHECK-INSTR: c: e12fff1e bx lr
38+
# jitlink-check: decode_operand(jump24_site, 0) = jump24_target - (jump24_site + 8)
39+
.globl jump24_site
40+
.type jump24_site,%function
41+
.p2align 2
42+
jump24_site:
43+
b.w jump24_target
44+
.size jump24_site, .-jump24_site
45+
46+
.globl jump24_target
47+
.type jump24_target,%function
48+
.p2align 2
49+
jump24_target:
50+
bx lr
51+
.size jump24_target, .-jump24_target
52+
3353
# Empty main function for jitlink to be happy
3454
.globl main
3555
.type main,%function

0 commit comments

Comments
 (0)