[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