mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
AsmParser: Parse (and ignore) nested .macro definitions.
This enables a slightly odd feature of gas. The macro is defined when the outermost macro is instantiated. PR18599 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201045 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -3183,6 +3183,7 @@ bool AsmParser::parseDirectiveMacro(SMLoc DirectiveLoc) {
|
||||
Lex();
|
||||
|
||||
AsmToken EndToken, StartToken = getTok();
|
||||
unsigned MacroDepth = 0;
|
||||
|
||||
// Lex the macro definition.
|
||||
for (;;) {
|
||||
@@ -3191,15 +3192,25 @@ bool AsmParser::parseDirectiveMacro(SMLoc DirectiveLoc) {
|
||||
return Error(DirectiveLoc, "no matching '.endmacro' in definition");
|
||||
|
||||
// Otherwise, check whether we have reach the .endmacro.
|
||||
if (getLexer().is(AsmToken::Identifier) &&
|
||||
(getTok().getIdentifier() == ".endm" ||
|
||||
getTok().getIdentifier() == ".endmacro")) {
|
||||
EndToken = getTok();
|
||||
Lex();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement))
|
||||
return TokError("unexpected token in '" + EndToken.getIdentifier() +
|
||||
"' directive");
|
||||
break;
|
||||
if (getLexer().is(AsmToken::Identifier)) {
|
||||
if (getTok().getIdentifier() == ".endm" ||
|
||||
getTok().getIdentifier() == ".endmacro") {
|
||||
if (MacroDepth == 0) { // Outermost macro.
|
||||
EndToken = getTok();
|
||||
Lex();
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement))
|
||||
return TokError("unexpected token in '" + EndToken.getIdentifier() +
|
||||
"' directive");
|
||||
break;
|
||||
} else {
|
||||
// Otherwise we just found the end of an inner macro.
|
||||
--MacroDepth;
|
||||
}
|
||||
} else if (getTok().getIdentifier() == ".macro") {
|
||||
// We allow nested macros. Those aren't instantiated until the outermost
|
||||
// macro is expanded so just ignore them for now.
|
||||
++MacroDepth;
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise, scan til the end of the statement.
|
||||
|
Reference in New Issue
Block a user