]> granicus.if.org Git - llvm/commitdiff
[ARM][AsmParser] handles offset expression in parentheses
authorJian Cai <caij2003@gmail.com>
Mon, 14 Oct 2019 22:22:26 +0000 (22:22 +0000)
committerJian Cai <caij2003@gmail.com>
Mon, 14 Oct 2019 22:22:26 +0000 (22:22 +0000)
Summary:
Integrated assembler does not accept offset expressions surrounded by
parenthesis. Handle this case for GAS compability.
https://bugs.llvm.org/show_bug.cgi?id=43631

Subscribers: kristof.beyls, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D68764

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374832 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/AsmParser/ARMAsmParser.cpp
test/MC/ARM/gas-compl-mem-offset-paren.s [new file with mode: 0644]

index 4d2c9dad7099ea2f8086e261c75dc1597523c89f..d2c355c1da75a2435af4b2753ddaf5cca348a669 100644 (file)
@@ -5733,14 +5733,16 @@ bool ARMAsmParser::parseMemory(OperandVector &Operands) {
     return false;
   }
 
-  // If we have a '#', it's an immediate offset, else assume it's a register
-  // offset. Be friendly and also accept a plain integer (without a leading
-  // hash) for gas compatibility.
+  // If we have a '#' or '$', it's an immediate offset, else assume it's a
+  // register offset. Be friendly and also accept a plain integer or expression
+  // (without a leading hash) for gas compatibility.
   if (Parser.getTok().is(AsmToken::Hash) ||
       Parser.getTok().is(AsmToken::Dollar) ||
+      Parser.getTok().is(AsmToken::LParen) ||
       Parser.getTok().is(AsmToken::Integer)) {
-    if (Parser.getTok().isNot(AsmToken::Integer))
-      Parser.Lex(); // Eat '#' or '$'.
+    if (Parser.getTok().is(AsmToken::Hash) ||
+        Parser.getTok().is(AsmToken::Dollar))
+      Parser.Lex(); // Eat '#' or '$'
     E = Parser.getTok().getLoc();
 
     bool isNegative = getParser().getTok().is(AsmToken::Minus);
diff --git a/test/MC/ARM/gas-compl-mem-offset-paren.s b/test/MC/ARM/gas-compl-mem-offset-paren.s
new file mode 100644 (file)
index 0000000..a458615
--- /dev/null
@@ -0,0 +1,20 @@
+@ RUN: llvm-mc -triple=arm-linux-gnueabi < %s | FileCheck %s
+
+@ CHECK: ldr   r12, [sp, #15]
+ldr r12, [sp, (15)]
+
+@ CHECK: ldr   r12, [sp, #15]
+ldr r12, [sp, #(15)]
+
+@ CHECK: ldr   r12, [sp, #15]
+ldr r12, [sp, $(15)]
+
+@ CHECK: ldr   r12, [sp, #100]
+ldr r12, [sp, (((15+5)*5))]
+
+@ CHECK: ldr   r12, [sp, #100]
+ldr r12, [sp, #(((15+5)*5))]
+
+
+@ CHECK: ldr   r12, [sp, #100]
+ldr r12, [sp, $(((15+5)*5))]