diff options
Diffstat (limited to 'llvm/lib/MC/MCParser/AsmLexer.cpp')
-rw-r--r-- | llvm/lib/MC/MCParser/AsmLexer.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/llvm/lib/MC/MCParser/AsmLexer.cpp b/llvm/lib/MC/MCParser/AsmLexer.cpp index 9155ae05d29d..5a571c7c0c0e 100644 --- a/llvm/lib/MC/MCParser/AsmLexer.cpp +++ b/llvm/lib/MC/MCParser/AsmLexer.cpp @@ -36,7 +36,8 @@ AsmLexer::AsmLexer(const MCAsmInfo &MAI) : MAI(MAI) { AsmLexer::~AsmLexer() = default; -void AsmLexer::setBuffer(StringRef Buf, const char *ptr) { +void AsmLexer::setBuffer(StringRef Buf, const char *ptr, + bool EndStatementAtEOF) { CurBuf = Buf; if (ptr) @@ -45,6 +46,7 @@ void AsmLexer::setBuffer(StringRef Buf, const char *ptr) { CurPtr = CurBuf.begin(); TokStart = nullptr; + this->EndStatementAtEOF = EndStatementAtEOF; } /// ReturnError - Set the error to the specified string at the specified @@ -584,7 +586,7 @@ AsmToken AsmLexer::LexToken() { // If we're missing a newline at EOF, make sure we still get an // EndOfStatement token before the Eof token. - if (CurChar == EOF && !IsAtStartOfStatement) { + if (CurChar == EOF && !IsAtStartOfStatement && EndStatementAtEOF) { IsAtStartOfLine = true; IsAtStartOfStatement = true; return AsmToken(AsmToken::EndOfStatement, StringRef(TokStart, 1)); @@ -594,15 +596,24 @@ AsmToken AsmLexer::LexToken() { IsAtStartOfStatement = false; switch (CurChar) { default: - // Handle identifier: [a-zA-Z_.][a-zA-Z0-9_$.@]* - if (isalpha(CurChar) || CurChar == '_' || CurChar == '.') - return LexIdentifier(); + if (MAI.doesAllowSymbolAtNameStart()) { + // Handle Microsoft-style identifier: [a-zA-Z_$.@?][a-zA-Z0-9_$.@?]* + if (!isDigit(CurChar) && + IsIdentifierChar(CurChar, MAI.doesAllowAtInName())) + return LexIdentifier(); + } else { + // Handle identifier: [a-zA-Z_.][a-zA-Z0-9_$.@]* + if (isalpha(CurChar) || CurChar == '_' || CurChar == '.') + return LexIdentifier(); + } // Unknown character, emit an error. return ReturnError(TokStart, "invalid character in input"); case EOF: - IsAtStartOfLine = true; - IsAtStartOfStatement = true; + if (EndStatementAtEOF) { + IsAtStartOfLine = true; + IsAtStartOfStatement = true; + } return AsmToken(AsmToken::Eof, StringRef(TokStart, 0)); case 0: case ' ': |