[PATCH] D103257: [ms] [llvm-ml] Disambiguate size directives and variable declarations
Eric Astor via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu May 27 08:02:21 PDT 2021
epastor created this revision.
Herald added a subscriber: hiraditya.
epastor requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
MASM allows statements of the form:
<VAR> DWORD 5
to declare a variable with name <VAR>, while:
call dword ptr [<value>]
is a valid instruction. To disambiguate, we recognize size directives by the trailing "ptr" token.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D103257
Files:
llvm/lib/MC/MCParser/MasmParser.cpp
Index: llvm/lib/MC/MCParser/MasmParser.cpp
===================================================================
--- llvm/lib/MC/MCParser/MasmParser.cpp
+++ llvm/lib/MC/MCParser/MasmParser.cpp
@@ -2440,6 +2440,8 @@
const StringRef nextVal = nextTok.getString();
const SMLoc nextLoc = nextTok.getLoc();
+ const AsmToken peekTok = Lexer.peekTok();
+
// There are several entities interested in parsing infix directives:
//
// 1. Asm parser extensions. For example, platform-specific parsers
@@ -2483,27 +2485,62 @@
Lex();
return parseDirectiveEquate(nextVal, IDVal, DirKind);
case DK_BYTE:
+ if (peekTok.is(AsmToken::Identifier) &&
+ peekTok.getString().equals_lower("ptr")) {
+ // Size directive; part of an instruction.
+ break;
+ }
+ LLVM_FALLTHROUGH;
case DK_SBYTE:
case DK_DB:
Lex();
return parseDirectiveNamedValue(nextVal, 1, IDVal, IDLoc);
case DK_WORD:
+ if (peekTok.is(AsmToken::Identifier) &&
+ peekTok.getString().equals_lower("ptr")) {
+ // Size directive; part of an instruction.
+ break;
+ }
+ LLVM_FALLTHROUGH;
case DK_SWORD:
case DK_DW:
Lex();
return parseDirectiveNamedValue(nextVal, 2, IDVal, IDLoc);
case DK_DWORD:
+ if (peekTok.is(AsmToken::Identifier) &&
+ peekTok.getString().equals_lower("ptr")) {
+ // Size directive; part of an instruction.
+ break;
+ }
+ LLVM_FALLTHROUGH;
case DK_SDWORD:
case DK_DD:
Lex();
return parseDirectiveNamedValue(nextVal, 4, IDVal, IDLoc);
case DK_FWORD:
+ if (peekTok.is(AsmToken::Identifier) &&
+ peekTok.getString().equals_lower("ptr")) {
+ // Size directive; part of an instruction.
+ break;
+ }
+ LLVM_FALLTHROUGH;
case DK_DF:
Lex();
return parseDirectiveNamedValue(nextVal, 6, IDVal, IDLoc);
case DK_QWORD:
+ if (peekTok.is(AsmToken::Identifier) &&
+ peekTok.getString().equals_lower("ptr")) {
+ // Size directive; part of an instruction.
+ break;
+ }
+ LLVM_FALLTHROUGH;
case DK_SQWORD:
case DK_DQ:
+ if (peekTok.is(AsmToken::Identifier) &&
+ peekTok.getString().equals_lower("ptr")) {
+ // Size directive; part of an instruction.
+ break;
+ }
Lex();
return parseDirectiveNamedValue(nextVal, 8, IDVal, IDLoc);
case DK_REAL4:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103257.348274.patch
Type: text/x-patch
Size: 2358 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210527/63820a3c/attachment.bin>
More information about the llvm-commits
mailing list