Commit 0ba553d1 authored by Lucas Prates's avatar Lucas Prates
Browse files

[MC] Allowing the use of $-prefixed integer as asm identifiers

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
parent af1c2e56
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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;
  }
+5 −0
Original line number Diff line number Diff line
@@ -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

llvm/test/MC/MachO/bad-dollar.s

deleted100644 → 0
+0 −5
Original line number Diff line number Diff line
// 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
+4 −0
Original line number Diff line number Diff line
// RUN: llvm-mc -triple x86_64-apple-darwin10 %s | FileCheck %s

.long $1
// CHECK: .long ($1)
+0 −2
Original line number Diff line number Diff line
@@ -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
Loading