DK_MACRO,
DK_EXITM,
DK_ENDM,
- DK_PURGEM,
+ DK_PURGE,
DK_ERR,
DK_ERRB,
DK_ERRNB,
case DK_ENDM:
Info.ExitValue = "";
return parseDirectiveEndMacro(IDVal);
- case DK_PURGEM:
+ case DK_PURGE:
return parseDirectivePurgeMacro(IDLoc);
case DK_END:
return parseDirectiveEnd(IDLoc);
}
/// parseDirectivePurgeMacro
-/// ::= .purgem
+/// ::= purge identifier ( , identifier )*
bool MasmParser::parseDirectivePurgeMacro(SMLoc DirectiveLoc) {
StringRef Name;
- SMLoc Loc;
- if (parseTokenLoc(Loc) ||
- check(parseIdentifier(Name), Loc,
- "expected identifier in '.purgem' directive") ||
- parseToken(AsmToken::EndOfStatement,
- "unexpected token in '.purgem' directive"))
- return true;
+ while (true) {
+ SMLoc NameLoc;
+ if (parseTokenLoc(NameLoc) ||
+ check(parseIdentifier(Name), NameLoc,
+ "expected identifier in 'purge' directive"))
+ return true;
- if (!getContext().lookupMacro(Name))
- return Error(DirectiveLoc, "macro '" + Name + "' is not defined");
+ DEBUG_WITH_TYPE("asm-macros", dbgs()
+ << "Un-defining macro: " << Name << "\n");
+ if (!getContext().lookupMacro(Name))
+ return Error(NameLoc, "macro '" + Name + "' is not defined");
+ getContext().undefineMacro(Name);
+
+ if (!parseOptionalToken(AsmToken::Comma))
+ break;
+ parseOptionalToken(AsmToken::EndOfStatement);
+ }
- getContext().undefineMacro(Name);
- DEBUG_WITH_TYPE("asm-macros", dbgs()
- << "Un-defining macro: " << Name << "\n");
return false;
}
DirectiveKindMap["macro"] = DK_MACRO;
DirectiveKindMap["exitm"] = DK_EXITM;
DirectiveKindMap["endm"] = DK_ENDM;
- // DirectiveKindMap[".purgem"] = DK_PURGEM;
+ DirectiveKindMap["purge"] = DK_PURGE;
DirectiveKindMap[".err"] = DK_ERR;
DirectiveKindMap[".errb"] = DK_ERRB;
DirectiveKindMap[".errnb"] = DK_ERRNB;
; CHECK-NEXT: jmp "??0001"
local_symbol_test ENDP
+PURGE ambiguous_substitution_macro, local_symbol_macro,
+ optional_parameter_macro
+
+; Redefinition
+local_symbol_macro MACRO
+ LOCAL b
+b: xor eax, eax
+ jmp b
+ENDM
+
+purge_test PROC
+; CHECK-LABEL: purge_test:
+
+ local_symbol_macro
+; CHECK: "??0002":
+; CHECK-NEXT: xor eax, eax
+; CHECK-NEXT: jmp "??0002"
+purge_test ENDP
+
END