[PATCH] D97501: [ARM] support symbolic expressions as branch target

Jian Cai via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 25 16:43:09 PST 2021


jcai19 updated this revision to Diff 326551.
jcai19 added a comment.

Update the test cases.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D97501/new/

https://reviews.llvm.org/D97501

Files:
  llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
  llvm/test/MC/ARM/thumb2-b.w-target.s
  llvm/test/MC/ARM/thumb2-branch-ranges.s


Index: llvm/test/MC/ARM/thumb2-branch-ranges.s
===================================================================
--- llvm/test/MC/ARM/thumb2-branch-ranges.s
+++ llvm/test/MC/ARM/thumb2-branch-ranges.s
@@ -94,3 +94,10 @@
 // CHECK: [[@LINE+2]]:{{[0-9]}}: error: Relocation out of range
 // CHECK-LABEL: beq.w start6
         beq.w start6
+
+start7:
+// branch to thumb function resolved at assembly time
+// CHECK-NOT: error
+// CHECK: [[@LINE+1]]:{{[0-9]}}: error: Relocation out of range
+        b.w start8 - start7 + 0x1000000
+start8:
Index: llvm/test/MC/ARM/thumb2-b.w-target.s
===================================================================
--- /dev/null
+++ llvm/test/MC/ARM/thumb2-b.w-target.s
@@ -0,0 +1,20 @@
+# RUN: llvm-mc -triple=thumbv7 -filetype=obj %s | llvm-objdump --triple=thumbv7 -d - | FileCheck %s
+
+.syntax unified
+
+// arm-linux-gnueabihf-objdump produced
+//	0:	f3ff 97fc 	b.w	fffffc <.text+0xfffffc>
+//	4:	f000 b801 	b.w	a <.text+0xa>
+
+// llvm-objdump produced the following
+// CHECK:	0: ff f3 fc 97  	b.w	#16777208 <$t.0+0xfffffc>
+// CHECK-NEXT:	4: 00 f0 01 b8  	b.w	#2 <$t.0+0xa>
+1:
+  b.w 1b - 2f + 0x1000000
+2:
+  b.w . + (3f - 2b + 2)
+3:
+
+
+
+
Index: llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
===================================================================
--- llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -1069,7 +1069,6 @@
   template<unsigned width, unsigned scale>
   bool isSignedOffset() const {
     if (!isImm()) return false;
-    if (isa<MCSymbolRefExpr>(Imm.Val)) return true;
     if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Imm.Val)) {
       int64_t Val = CE->getValue();
       int64_t Align = 1LL << scale;
@@ -1077,7 +1076,8 @@
       int64_t Min = -Align * (1LL << (width-1));
       return ((Val % Align) == 0) && (Val >= Min) && (Val <= Max);
     }
-    return false;
+    // Delay the checks of symbolic values until they are resolved
+    return true;
   }
 
   // checks whether this operand is an offset suitable for the LE /


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D97501.326551.patch
Type: text/x-patch
Size: 2077 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210226/ad12a98e/attachment.bin>


More information about the llvm-commits mailing list