[llvm] r333991 - [MC][ARM] Correct Thumb BL instruction range
Peter Smith via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 5 02:32:28 PDT 2018
Author: psmith
Date: Tue Jun 5 02:32:28 2018
New Revision: 333991
URL: http://llvm.org/viewvc/llvm-project?rev=333991&view=rev
Log:
[MC][ARM] Correct Thumb BL instruction range
The Thumb BL range is + or - either 16 Megabytes or 4 Megabytes depending
on whether the CPU supports Thumb2 or the v8-m baseline ops. The existing
check for BL range is incorrectly set at +- 32 Megabytes. This change
corrects the higher range and uses the lower range if the featurebits
don't have the necessary support for it.
Differential Revision: https://reviews.llvm.org/D46305
Modified:
llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
llvm/trunk/test/MC/ARM/thumb-branches.s
Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp?rev=333991&r1=333990&r2=333991&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp (original)
+++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp Tue Jun 5 02:32:28 2018
@@ -518,9 +518,11 @@ unsigned ARMAsmBackend::adjustFixupValue
return swapHalfWords(out, Endian == support::little);
}
case ARM::fixup_arm_thumb_bl: {
- // FIXME: We get both thumb1 and thumb2 in here, so we can only check for
- // the less strict thumb2 value.
- if (!isInt<26>(Value - 4)) {
+ if (!isInt<25>(Value - 4) ||
+ (!STI.getFeatureBits()[ARM::FeatureThumb2] &&
+ !STI.getFeatureBits()[ARM::HasV8MBaselineOps] &&
+ !STI.getFeatureBits()[ARM::HasV6MOps] &&
+ !isInt<23>(Value - 4))) {
Ctx.reportError(Fixup.getLoc(), "Relocation out of range");
return 0;
}
Modified: llvm/trunk/test/MC/ARM/thumb-branches.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb-branches.s?rev=333991&r1=333990&r2=333991&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/thumb-branches.s (original)
+++ llvm/trunk/test/MC/ARM/thumb-branches.s Tue Jun 5 02:32:28 2018
@@ -1,43 +1,71 @@
-@ RUN: not llvm-mc %s -triple thumbv5-linux-gnueabi -filetype=obj -o /dev/null 2>&1 | FileCheck %s
+@ RUN: not llvm-mc %s -triple thumbv7-linux-gnueabi -filetype=obj -o /dev/null 2>&1 | FileCheck %s
+@ RUN: not llvm-mc %s -triple thumbv8-m.baseline-none-eabi -filetype=obj -o /dev/null 2>&1 | FileCheck %s
+@ RUN: not llvm-mc %s -triple thumbv8-m.mainline-none-eabi -filetype=obj -o /dev/null 2>&1 | FileCheck %s
+@ RUN: not llvm-mc %s -triple thumbv6m-none-eabi -filetype=obj -o /dev/null 2>&1 | FileCheck %s
+@ RUN: not llvm-mc %s -triple thumbv5-linux-gnueabi -filetype=obj -o /dev/null 2>&1 | FileCheck -check-prefix=CHECKSHORT %s
+
+// Thumb BL has range +- 4 Megabytes if CPU does not support Thumb2 or does not
+// have v8-M baseline ops, it is +- 16 Megabytes otherwise.
.code 16
+ bl shortend
+ .space 0x3fffff
+shortend:
+// CHECKSHORT-NOT: error
+// CHECKSHORT: [[@LINE+1]]:{{[0-9]}}: error: Relocation out of range
+ bl shortend2
+ .space 0x400000
+shortend2:
+// CHECKSHORT: [[@LINE+1]]:{{[0-9]}}: error: Relocation out of range
bl end
- .space 0x1ffffff
+ .space 0xffffff
end:
-
bl end2
- .space 0x1ffffff
+ .space 0xffffff
.global end2
end2:
bl end3
- .space 0x2000000
+ .space 0x1000000
.global end3
end3:
// CHECK-NOT: error
+// CHECKSHORT-NOT: error
+// CHECKSHORT: [[@LINE+2]]:{{[0-9]}}: error: Relocation out of range
// CHECK: [[@LINE+1]]:{{[0-9]}}: error: Relocation out of range
bl end4
-// CHECK-NOT: error
- .space 0x2000000
+ .space 0x1000000
end4:
+shortstart1:
+ .space 0x3ffffc
+ bl shortstart1
+
+shortstart2:
+ .space 0x400000
+// CHECKSHORT: [[@LINE+1]]:{{[0-9]}}: error: Relocation out of range
+ bl shortstart2
+
start1:
- .space 0x1fffffc
+ .space 0xfffffc
+// CHECKSHORT: [[@LINE+1]]:{{[0-9]}}: error: Relocation out of range
bl start1
.global start2
start2:
- .space 0x1fffffc
+ .space 0xfffffc
bl start2
.global start3
start3:
- .space 0x1fffffd
+ .space 0xfffffd
bl start3
+// CHECK-NOT: error
start4:
- .space 0x1fffffd
-// CHECK: [[@LINE+1]]:{{[0-9]}}: error: Relocation out of range
+ .space 0xfffffd
+// CHECK: [[@LINE+2]]:{{[0-9]}}: error: Relocation out of range
+// CHECKSHORT: [[@LINE+1]]:{{[0-9]}}: error: Relocation out of range
bl start4
More information about the llvm-commits
mailing list