[ARM][AsmParser] handles offset expression in parentheses

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
This commit is contained in:
Jian Cai
2019-10-14 22:22:26 +00:00
parent 73770d6089
commit d6278197e0
2 changed files with 27 additions and 5 deletions
+7 -5
View 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);
+20
View File
@@ -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))]