[MC] Allowing the use of $-prefixed integer as asm identifiers
authorLucas Prates <lucas.prates@arm.com>
Mon, 10 Feb 2020 16:48:25 +0000 (16:48 +0000)
committerLucas Prates <lucas.prates@arm.com>
Fri, 6 Mar 2020 16:27:51 +0000 (16:27 +0000)
Summary:
Dollar signed prefixed integers were not allowed by the AsmParser to be
used as Identifiers, differing from the GNU assembler behavior.

This patch updates the parsing of Identifiers to consider such cases as
valid, where the identifier string includes the $ prefix itself. As the
Lexer currently splits these occurrences into separate tokens, those
need to be combined by the AsmParser itself.

Reviewers: efriedma, chill

Reviewed By: efriedma

Subscribers: sdardis, hiraditya, jrtc27, atanasyan, llvm-commits

Tags: #llvm

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

llvm/lib/MC/MCParser/AsmParser.cpp
llvm/test/MC/ARM/arm-branches.s
llvm/test/MC/MachO/bad-dollar.s [deleted file]
llvm/test/MC/MachO/dollar-identifier.s [new file with mode: 0644]
llvm/test/MC/Mips/cpsetup-bad.s
llvm/test/MC/Mips/invalid-instructions-spellcheck.s

index a3d2d9f3d3bac6db927798e953a3026cc5d378bb..c5c44a7861f0046b63b65adfc38627317d1325a4 100644 (file)
@@ -2854,18 +2854,18 @@ bool AsmParser::parseIdentifier(StringRef &Res) {
     AsmToken Buf[1];
     Lexer.peekTokens(Buf, false);
 
-    if (Buf[0].isNot(AsmToken::Identifier))
+    if (Buf[0].isNot(AsmToken::Identifier) && Buf[0].isNot(AsmToken::Integer))
       return true;
 
-    // We have a '$' or '@' followed by an identifier, make sure they are adjacent.
+    // We have a '$' or '@' followed by an identifier or integer token, make
+    // sure they are adjacent.
     if (PrefixLoc.getPointer() + 1 != Buf[0].getLoc().getPointer())
       return true;
 
     // eat $ or @
     Lexer.Lex(); // Lexer's Lex guarantees consecutive token.
     // Construct the joined identifier and consume the token.
-    Res =
-        StringRef(PrefixLoc.getPointer(), getTok().getIdentifier().size() + 1);
+    Res = StringRef(PrefixLoc.getPointer(), getTok().getString().size() + 1);
     Lex(); // Parser Lex to maintain invariants.
     return false;
   }
index da719a6bcd2e19cdbe1e81c14e08d4e6dd93d6e3..e18fa5de12584295ab0d58d9c811ec4d580af08e 100644 (file)
 @------------------------------------------------------------------------------
 
         .global $foo
+        .global $4
         b $foo
         bl $foo
         beq $foo
         blx $foo
         b $foo + 4
+        bl $4
+        beq $4 + 4
 
 @ CHECK: b      ($foo)                      @ encoding: [A,A,A,0xea]
 @ CHECK: bl     ($foo)                      @ encoding: [A,A,A,0xeb]
 @ CHECK: beq    ($foo)                      @ encoding: [A,A,A,0x0a]
 @ CHECK: blx    ($foo)                      @ encoding: [A,A,A,0xfa]
 @ CHECK: b      #($foo)+4                   @ encoding: [A,A,A,0xea]
+@ CHECK: bl     ($4)                        @ encoding: [A,A,A,0xeb]
+@ CHECK: beq    #($4)+4                     @ encoding: [A,A,A,0x0a]
 
 @------------------------------------------------------------------------------
 @ Leading '$' should be allowed to introduce an expression
diff --git a/llvm/test/MC/MachO/bad-dollar.s b/llvm/test/MC/MachO/bad-dollar.s
deleted file mode 100644 (file)
index fd72ed0..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-// RUN: not llvm-mc -triple x86_64-apple-darwin10 %s 2> %t.err > %t
-// RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s
-
-.long $1
-// CHECK-ERROR: 4:7: error: invalid token in expression
diff --git a/llvm/test/MC/MachO/dollar-identifier.s b/llvm/test/MC/MachO/dollar-identifier.s
new file mode 100644 (file)
index 0000000..ca6993f
--- /dev/null
@@ -0,0 +1,4 @@
+// RUN: llvm-mc -triple x86_64-apple-darwin10 %s | FileCheck %s
+
+.long $1
+// CHECK: .long ($1)
index 4b2148603bd093151da8e69d5129334750cf749b..14e89095d121fcc8d9f73caf45c823c6e35b6240 100644 (file)
@@ -12,8 +12,6 @@ t1:
 # ASM: :[[@LINE-1]]:23: error: expected save register or stack offset
         .cpsetup $31, $32, __cerror
 # ASM: :[[@LINE-1]]:23: error: invalid register
-        .cpsetup $25, $2, $3
-# ASM: :[[@LINE-1]]:27: error: expected expression
         .cpsetup $25, $2, 4
 # ASM: :[[@LINE-1]]:28: error: expected symbol
         .cpsetup $25, $2, 4+65
index 459e71c8912a1a0090e1792933b7d348a0f542df..9f1fb2f6f1be2da14dc97bb3f42ed55fe9ef7def 100644 (file)
@@ -13,7 +13,7 @@
 
 $2, $1, $25
 
-# ALL:      error: unexpected token at start of statement
+# ALL:      error: unknown instruction
 # ALL-NEXT: $2, $1, $25
 # ALL-NEXT:  ^