Skip to content

Commit 3e7cd5e

Browse files
eymayweliveindetail
authored andcommitted
[JITLink][AArch32] Fixes for initial AArch32 backend
Fix masking error in Thumb_Jump24 Fix halfword comparisons in asserts Add Data_Pointer32 to getEdgeKindName Reviewed By: sgraenitz Differential Revision: https://reviews.llvm.org/D157540
1 parent 43d729d commit 3e7cd5e

File tree

2 files changed

+3
-11
lines changed

2 files changed

+3
-11
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ template <> struct FixupInfo<Thumb_Jump24> {
149149
static constexpr HalfWords Opcode{0xf000, 0x8000};
150150
static constexpr HalfWords OpcodeMask{0xf800, 0x8000};
151151
static constexpr HalfWords ImmMask{0x07ff, 0x2fff};
152-
static constexpr uint16_t LoBitConditional = 0x1000;
153152
};
154153

155154
template <> struct FixupInfo<Thumb_Call> {

llvm/lib/ExecutionEngine/JITLink/aarch32.cpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ bool checkRegister(const ThumbRelocation &R, HalfWords Reg) {
175175
template <EdgeKind_aarch32 Kind>
176176
void writeRegister(WritableThumbRelocation &R, HalfWords Reg) {
177177
static constexpr HalfWords Mask = FixupInfo<Kind>::RegMask;
178-
assert((Mask.Hi & Reg.Hi) == Reg.Hi && (Mask.Hi & Reg.Hi) == Reg.Hi &&
178+
assert((Mask.Hi & Reg.Hi) == Reg.Hi && (Mask.Lo & Reg.Lo) == Reg.Lo &&
179179
"Value bits exceed bit range of given mask");
180180
R.Hi = (R.Hi & ~Mask.Hi) | Reg.Hi;
181181
R.Lo = (R.Lo & ~Mask.Lo) | Reg.Lo;
@@ -184,7 +184,7 @@ void writeRegister(WritableThumbRelocation &R, HalfWords Reg) {
184184
template <EdgeKind_aarch32 Kind>
185185
void writeImmediate(WritableThumbRelocation &R, HalfWords Imm) {
186186
static constexpr HalfWords Mask = FixupInfo<Kind>::ImmMask;
187-
assert((Mask.Hi & Imm.Hi) == Imm.Hi && (Mask.Hi & Imm.Hi) == Imm.Hi &&
187+
assert((Mask.Hi & Imm.Hi) == Imm.Hi && (Mask.Lo & Imm.Lo) == Imm.Lo &&
188188
"Value bits exceed bit range of given mask");
189189
R.Hi = (R.Hi & ~Mask.Hi) | Imm.Hi;
190190
R.Lo = (R.Lo & ~Mask.Lo) | Imm.Lo;
@@ -242,10 +242,6 @@ Expected<int64_t> readAddendThumb(LinkGraph &G, Block &B, const Edge &E,
242242
case Thumb_Jump24:
243243
if (!checkOpcode<Thumb_Jump24>(R))
244244
return makeUnexpectedOpcodeError(G, R, Kind);
245-
if (R.Lo & FixupInfo<Thumb_Jump24>::LoBitConditional)
246-
return make_error<JITLinkError>("Relocation expects an unconditional "
247-
"B.W branch instruction: " +
248-
StringRef(G.getEdgeKindName(Kind)));
249245
return LLVM_LIKELY(ArmCfg.J1J2BranchEncoding)
250246
? decodeImmBT4BlT1BlxT2_J1J2(R.Hi, R.Lo)
251247
: decodeImmBT4BlT1BlxT2(R.Hi, R.Lo);
@@ -352,10 +348,6 @@ Error applyFixupThumb(LinkGraph &G, Block &B, const Edge &E,
352348
case Thumb_Jump24: {
353349
if (!checkOpcode<Thumb_Jump24>(R))
354350
return makeUnexpectedOpcodeError(G, R, Kind);
355-
if (R.Lo & FixupInfo<Thumb_Jump24>::LoBitConditional)
356-
return make_error<JITLinkError>("Relocation expects an unconditional "
357-
"B.W branch instruction: " +
358-
StringRef(G.getEdgeKindName(Kind)));
359351
if (!(TargetSymbol.hasTargetFlags(ThumbSymbol)))
360352
return make_error<JITLinkError>("Branch relocation needs interworking "
361353
"stub when bridging to ARM: " +
@@ -471,6 +463,7 @@ const char *getEdgeKindName(Edge::Kind K) {
471463

472464
switch (K) {
473465
KIND_NAME_CASE(Data_Delta32)
466+
KIND_NAME_CASE(Data_Pointer32)
474467
KIND_NAME_CASE(Arm_Call)
475468
KIND_NAME_CASE(Thumb_Call)
476469
KIND_NAME_CASE(Thumb_Jump24)

0 commit comments

Comments
 (0)