diff options
author | Kevin Enderby <enderby@apple.com> | 2011-09-13 23:45:18 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2011-09-13 23:45:18 +0000 |
commit | f1c21a8da6ed27a6ab4944e30bbeb4bd3ee08a71 (patch) | |
tree | 2803cd1eadbdddbf2e627846300f177b876f1bbe /lib/MC/MCParser/AsmLexer.cpp | |
parent | 4bffb62289614d355bdb160822eff7213ec9bb62 (diff) | |
download | llvm-f1c21a8da6ed27a6ab4944e30bbeb4bd3ee08a71.tar.gz llvm-f1c21a8da6ed27a6ab4944e30bbeb4bd3ee08a71.tar.bz2 llvm-f1c21a8da6ed27a6ab4944e30bbeb4bd3ee08a71.tar.xz |
First step in supporting #line directives in assembler. This step parses the
#line directives with the needed support in the lexer. Next will be to build
a simple file/line# table mapping source SMLoc's for later use by diagnostics.
And the last step will be to get the diagnostics to use the mapping for file
and line numbers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139669 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCParser/AsmLexer.cpp')
-rw-r--r-- | lib/MC/MCParser/AsmLexer.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/lib/MC/MCParser/AsmLexer.cpp b/lib/MC/MCParser/AsmLexer.cpp index bbb0bbc8b2..9760e4676d 100644 --- a/lib/MC/MCParser/AsmLexer.cpp +++ b/lib/MC/MCParser/AsmLexer.cpp @@ -334,6 +334,17 @@ StringRef AsmLexer::LexUntilEndOfStatement() { return StringRef(TokStart, CurPtr-TokStart); } +StringRef AsmLexer::LexUntilEndOfLine() { + TokStart = CurPtr; + + while (*CurPtr != '\n' && + *CurPtr != '\r' && + (*CurPtr != 0 || CurPtr != CurBuf->getBufferEnd())) { + ++CurPtr; + } + return StringRef(TokStart, CurPtr-TokStart); +} + bool AsmLexer::isAtStartOfComment(char Char) { // FIXME: This won't work for multi-character comment indicators like "//". return Char == *MAI.getCommentString(); @@ -345,17 +356,26 @@ bool AsmLexer::isAtStatementSeparator(const char *Ptr) { } AsmToken AsmLexer::LexToken() { + static bool isAtStartOfLine = true; TokStart = CurPtr; // This always consumes at least one character. int CurChar = getNextChar(); - if (isAtStartOfComment(CurChar)) + if (isAtStartOfComment(CurChar)) { + // If this comment starts with a '#', then return the Hash token and let + // the assembler parser see if it can be parsed as a cpp line filename + // comment. We do this only if we are at the start of a line. + if (CurChar == '#' && isAtStartOfLine) + return AsmToken(AsmToken::Hash, StringRef(TokStart, 1)); + isAtStartOfLine = true; return LexLineComment(); + } if (isAtStatementSeparator(TokStart)) { CurPtr += strlen(MAI.getSeparatorString()) - 1; return AsmToken(AsmToken::EndOfStatement, StringRef(TokStart, strlen(MAI.getSeparatorString()))); } + isAtStartOfLine = false; switch (CurChar) { default: @@ -373,6 +393,7 @@ AsmToken AsmLexer::LexToken() { return LexToken(); case '\n': // FALL THROUGH. case '\r': + isAtStartOfLine = true; return AsmToken(AsmToken::EndOfStatement, StringRef(TokStart, 1)); case ':': return AsmToken(AsmToken::Colon, StringRef(TokStart, 1)); case '+': return AsmToken(AsmToken::Plus, StringRef(TokStart, 1)); |