[PATCH] D113509: [lld][ELF] Support for R_ARM_THM_JUMP8
Petr Hosek via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 9 12:38:26 PST 2021
phosek created this revision.
phosek added reviewers: MaskRay, mcgrathr.
Herald added subscribers: kristof.beyls, arichardson, emaste.
phosek requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
This change implements support for R_ARM_THM_JUMP8 relocation in
addition to R_ARM_THM_JUMP11 which is already supported by LLD.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D113509
Files:
lld/ELF/Arch/ARM.cpp
lld/ELF/InputSection.cpp
lld/test/ELF/arm-thumb-undefined-weak-narrow.test
Index: lld/test/ELF/arm-thumb-undefined-weak-narrow.test
===================================================================
--- lld/test/ELF/arm-thumb-undefined-weak-narrow.test
+++ lld/test/ELF/arm-thumb-undefined-weak-narrow.test
@@ -7,11 +7,12 @@
# CHECK-EMPTY:
# CHECK-NEXT: <_start>:
# CHECK-NEXT: ff e7 b 0x200b6 <_start+0x2> @ imm = #-2
+# CHECK-NEXT: ff e7 b 0x200b8 <_start+0x4> @ imm = #-2
-# Test the R_ARM_THM_JUMP11 relocation (102) to an undefined weak reference
-# It should resolve to the next instruction, which is an offset of -2 which
-# when added to the Thumb PC-bias of 4 is +2. We can't use llvm-mc to construct
-# the object as it relaxes b.n to b.w (R_ARM_JUMP24).
+# Test the R_ARM_THM_JUMP11 (102) and R_ARM_THM_JUMP8 (103) relocations to an
+# undefined weak reference. It should resolve to the next instruction, which
+# is an offset of -2 which when added to the Thumb PC-bias of 4 is +2. We can't
+# use llvm-mc to construct the object as it relaxes b.n to b.w (R_ARM_JUMP24).
!ELF
FileHeader:
@@ -23,7 +24,7 @@
- Type: SHT_PROGBITS
Name: .text
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
- Content: "fee7"
+ Content: "fee7ffe7"
- Type: SHT_REL
Name: .rel.text
Link: .symtab
@@ -31,6 +32,8 @@
Relocations:
- Symbol: undefined_weak
Type: R_ARM_THM_JUMP11
+ - Symbol: undefined_weak
+ Type: R_ARM_THM_JUMP8
Symbols:
- Type: STT_NOTYPE
Index: lld/ELF/InputSection.cpp
===================================================================
--- lld/ELF/InputSection.cpp
+++ lld/ELF/InputSection.cpp
@@ -495,6 +495,7 @@
switch (type) {
// Unresolved branch relocations to weak references resolve to next
// instruction, this will be either 2 or 4 bytes on from P.
+ case R_ARM_THM_JUMP8:
case R_ARM_THM_JUMP11:
return p + 2 + a;
case R_ARM_CALL:
Index: lld/ELF/Arch/ARM.cpp
===================================================================
--- lld/ELF/Arch/ARM.cpp
+++ lld/ELF/Arch/ARM.cpp
@@ -90,6 +90,7 @@
case R_ARM_THM_MOVW_ABS_NC:
case R_ARM_THM_MOVT_ABS:
return R_ABS;
+ case R_ARM_THM_JUMP8:
case R_ARM_THM_JUMP11:
return R_PC;
case R_ARM_CALL:
@@ -520,7 +521,13 @@
checkInt(loc, val, 26, rel);
write32le(loc, (read32le(loc) & ~0x00ffffff) | ((val >> 2) & 0x00ffffff));
break;
+ case R_ARM_THM_JUMP8:
+ // We do a 9 bit check because val is right-shifted by 1 bit.
+ checkInt(loc, val, 9, rel);
+ write16le(loc, (read32le(loc) & 0xff00) | ((val >> 1) & 0x00ff));
+ break;
case R_ARM_THM_JUMP11:
+ // We do a 12 bit check because val is right-shifted by 1 bit.
checkInt(loc, val, 12, rel);
write16le(loc, (read32le(loc) & 0xf800) | ((val >> 1) & 0x07ff));
break;
@@ -748,6 +755,8 @@
case R_ARM_PC24:
case R_ARM_PLT32:
return SignExtend64<26>(read32le(buf) << 2);
+ case R_ARM_THM_JUMP8:
+ return SignExtend64<9>(read16le(buf) << 1);
case R_ARM_THM_JUMP11:
return SignExtend64<12>(read16le(buf) << 1);
case R_ARM_THM_JUMP19: {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D113509.385940.patch
Type: text/x-patch
Size: 3204 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211109/d1aa0d4e/attachment.bin>
More information about the llvm-commits
mailing list