diff options
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/MCParser/AsmLexer.cpp | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/llvm/lib/MC/MCParser/AsmLexer.cpp b/llvm/lib/MC/MCParser/AsmLexer.cpp index 0fa7fbdc7b6..99e1df6be6e 100644 --- a/llvm/lib/MC/MCParser/AsmLexer.cpp +++ b/llvm/lib/MC/MCParser/AsmLexer.cpp @@ -11,29 +11,29 @@ // //===----------------------------------------------------------------------===// -#include "llvm/MC/MCParser/AsmLexer.h" #include "llvm/ADT/APInt.h" #include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" -#include "llvm/MC/MCAsmInfo.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/MC/MCParser/AsmLexer.h" #include "llvm/MC/MCParser/MCAsmLexer.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/Support/SMLoc.h" -#include "llvm/Support/SaveAndRestore.h" #include <cassert> #include <cctype> #include <cstdio> #include <cstring> -#include <string> #include <tuple> +#include <string> #include <utility> using namespace llvm; -AsmLexer::AsmLexer(const MCAsmInfo &MAI) - : MAI(MAI), CurPtr(nullptr), IsAtStartOfLine(true), - IsAtStartOfStatement(true), IsParsingMSInlineAsm(false), - IsPeeking(false) { +AsmLexer::AsmLexer(const MCAsmInfo &MAI) : MAI(MAI) { + CurPtr = nullptr; + IsAtStartOfLine = true; + IsAtStartOfStatement = true; + IsParsingMSInlineAsm = false; AllowAtInIdentifier = !StringRef(MAI.getCommentString()).startswith("@"); } @@ -487,15 +487,17 @@ StringRef AsmLexer::LexUntilEndOfLine() { size_t AsmLexer::peekTokens(MutableArrayRef<AsmToken> Buf, bool ShouldSkipSpace) { - SaveAndRestore<const char *> SavedTokenStart(TokStart); - SaveAndRestore<const char *> SavedCurPtr(CurPtr); - SaveAndRestore<bool> SavedAtStartOfLine(IsAtStartOfLine); - SaveAndRestore<bool> SavedAtStartOfStatement(IsAtStartOfStatement); - SaveAndRestore<bool> SavedSkipSpace(SkipSpace, ShouldSkipSpace); - SaveAndRestore<bool> SavedIsPeeking(IsPeeking, true); + const char *SavedTokStart = TokStart; + const char *SavedCurPtr = CurPtr; + bool SavedAtStartOfLine = IsAtStartOfLine; + bool SavedAtStartOfStatement = IsAtStartOfStatement; + bool SavedSkipSpace = SkipSpace; + std::string SavedErr = getErr(); SMLoc SavedErrLoc = getErrLoc(); + SkipSpace = ShouldSkipSpace; + size_t ReadCount; for (ReadCount = 0; ReadCount < Buf.size(); ++ReadCount) { AsmToken Token = LexToken(); @@ -507,6 +509,13 @@ size_t AsmLexer::peekTokens(MutableArrayRef<AsmToken> Buf, } SetError(SavedErrLoc, SavedErr); + + SkipSpace = SavedSkipSpace; + IsAtStartOfLine = SavedAtStartOfLine; + IsAtStartOfStatement = SavedAtStartOfStatement; + CurPtr = SavedCurPtr; + TokStart = SavedTokStart; + return ReadCount; } @@ -516,7 +525,7 @@ bool AsmLexer::isAtStartOfComment(const char *Ptr) { if (CommentString.size() == 1) return CommentString[0] == Ptr[0]; - // Allow # preprocessor commments also be counted as comments for "##" cases + // FIXME: special case for the bogus "##" comment string in X86MCAsmInfoDarwin if (CommentString[1] == '#') return CommentString[0] == Ptr[0]; @@ -533,7 +542,7 @@ AsmToken AsmLexer::LexToken() { // This always consumes at least one character. int CurChar = getNextChar(); - if (!IsPeeking && CurChar == '#' && IsAtStartOfStatement) { + if (CurChar == '#' && IsAtStartOfStatement) { // If this starts with a '#', this may be a cpp // hash directive and otherwise a line comment. AsmToken TokenBuf[2]; |