[llvm] r197547 - AsmParser: add support for .end directive
Saleem Abdulrasool
compnerd at compnerd.org
Tue Dec 17 18:53:04 PST 2013
Author: compnerd
Date: Tue Dec 17 20:53:03 2013
New Revision: 197547
URL: http://llvm.org/viewvc/llvm-project?rev=197547&view=rev
Log:
AsmParser: add support for .end directive
The .end directive indicates the end of the file. No further instructions are
processed after a .end directive is encountered.
One potential (glaringly obvious) optimisation that could be pursued here is to
extend MCAsmParser with a DiscardRemainder method to avoid processing lexemes to
the end of the file. It was unclear at this point if that would be worth
adding, and could easily be added in a follow on change.
Signed-off-by: Saleem Abdulrasool <compnerd at compnerd.org>
Added:
llvm/trunk/test/MC/AsmParser/directive_end-2.s
llvm/trunk/test/MC/AsmParser/directive_end.s
Modified:
llvm/trunk/lib/MC/MCParser/AsmParser.cpp
Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=197547&r1=197546&r2=197547&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Tue Dec 17 20:53:03 2013
@@ -358,7 +358,8 @@ private:
DK_CFI_RESTORE, DK_CFI_ESCAPE, DK_CFI_SIGNAL_FRAME, DK_CFI_UNDEFINED,
DK_CFI_REGISTER, DK_CFI_WINDOW_SAVE,
DK_MACROS_ON, DK_MACROS_OFF, DK_MACRO, DK_ENDM, DK_ENDMACRO, DK_PURGEM,
- DK_SLEB128, DK_ULEB128
+ DK_SLEB128, DK_ULEB128,
+ DK_END
};
/// \brief Maps directive name --> DirectiveKind enum, for
@@ -464,6 +465,9 @@ private:
// "align"
bool parseDirectiveMSAlign(SMLoc DirectiveLoc, ParseStatementInfo &Info);
+ // "end"
+ bool parseDirectiveEnd(SMLoc DirectiveLoc);
+
void initializeDirectiveKindMap();
};
}
@@ -1508,6 +1512,8 @@ bool AsmParser::parseStatement(ParseStat
return parseDirectiveEndMacro(IDVal);
case DK_PURGEM:
return parseDirectivePurgeMacro(IDLoc);
+ case DK_END:
+ return parseDirectiveEnd(IDLoc);
}
return Error(IDLoc, "unknown directive");
@@ -3743,6 +3749,20 @@ bool AsmParser::parseDirectiveElse(SMLoc
return false;
}
+/// parseDirectiveEnd
+/// ::= .end
+bool AsmParser::parseDirectiveEnd(SMLoc DirectiveLoc) {
+ if (getLexer().isNot(AsmToken::EndOfStatement))
+ return TokError("unexpected token in '.end' directive");
+
+ Lex();
+
+ while (Lexer.isNot(AsmToken::Eof))
+ Lex();
+
+ return false;
+}
+
/// parseDirectiveEndIf
/// ::= .endif
bool AsmParser::parseDirectiveEndIf(SMLoc DirectiveLoc) {
@@ -3828,6 +3848,7 @@ void AsmParser::initializeDirectiveKindM
DirectiveKindMap[".ifnotdef"] = DK_IFNOTDEF;
DirectiveKindMap[".elseif"] = DK_ELSEIF;
DirectiveKindMap[".else"] = DK_ELSE;
+ DirectiveKindMap[".end"] = DK_END;
DirectiveKindMap[".endif"] = DK_ENDIF;
DirectiveKindMap[".skip"] = DK_SKIP;
DirectiveKindMap[".space"] = DK_SPACE;
Added: llvm/trunk/test/MC/AsmParser/directive_end-2.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive_end-2.s?rev=197547&view=auto
==============================================================================
--- llvm/trunk/test/MC/AsmParser/directive_end-2.s (added)
+++ llvm/trunk/test/MC/AsmParser/directive_end-2.s Tue Dec 17 20:53:03 2013
@@ -0,0 +1,14 @@
+# RUN: llvm-mc -triple i386-unknown-unknown %s -I %p -filetype obj -o - \
+# RUN: | llvm-readobj -t | FileCheck %s
+
+rock:
+ movl $42, %eax
+
+.include "directive_end.s"
+
+hard_place:
+ movl $42, %ebx
+
+# CHECK: Symbol {
+# CHECK: Name: rock
+# CHECK-NOT: Name: hard_place
Added: llvm/trunk/test/MC/AsmParser/directive_end.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive_end.s?rev=197547&view=auto
==============================================================================
--- llvm/trunk/test/MC/AsmParser/directive_end.s (added)
+++ llvm/trunk/test/MC/AsmParser/directive_end.s Tue Dec 17 20:53:03 2013
@@ -0,0 +1,11 @@
+# RUN: llvm-mc -triple i386-unknown-unknown %s -filetype obj -o - \
+# RUN: | llvm-readobj -t | FileCheck %s
+
+ .end
+
+its_a_tarp:
+ int $0x3
+
+# CHECK: Symbol {
+# CHECK-NOT: Name: its_a_tarp
+
More information about the llvm-commits
mailing list