Skip to content

Commit

Permalink
[MC] Allowing the use of $-prefixed integer as asm identifiers
Browse files Browse the repository at this point in the history
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
  • Loading branch information
pratlucas committed Mar 6, 2020
1 parent af1c2e5 commit 0ba553d
Show file tree
Hide file tree
Showing 6 changed files with 14 additions and 12 deletions.
8 changes: 4 additions & 4 deletions llvm/lib/MC/MCParser/AsmParser.cpp
Expand Up @@ -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;
}
Expand Down
5 changes: 5 additions & 0 deletions llvm/test/MC/ARM/arm-branches.s
Expand Up @@ -19,17 +19,22 @@
@------------------------------------------------------------------------------

.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
Expand Down
5 changes: 0 additions & 5 deletions llvm/test/MC/MachO/bad-dollar.s

This file was deleted.

4 changes: 4 additions & 0 deletions llvm/test/MC/MachO/dollar-identifier.s
@@ -0,0 +1,4 @@
// RUN: llvm-mc -triple x86_64-apple-darwin10 %s | FileCheck %s

.long $1
// CHECK: .long ($1)
2 changes: 0 additions & 2 deletions llvm/test/MC/Mips/cpsetup-bad.s
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/MC/Mips/invalid-instructions-spellcheck.s
Expand Up @@ -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: ^

Expand Down

0 comments on commit 0ba553d

Please sign in to comment.