From: Oliver Stannard Date: Thu, 8 Dec 2016 10:31:21 +0000 (+0000) Subject: Add a comment consumer mechanism to MCAsmLexer X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c7bb88e832e724c6a14aeae519c5ab533d7de1dc;p=llvm Add a comment consumer mechanism to MCAsmLexer This allows clients to register an AsmCommentConsumer with the MCAsmLexer, which receives a callback each time a comment is parsed. Differential Revision: https://reviews.llvm.org/D27511 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289036 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCParser/MCAsmLexer.h b/include/llvm/MC/MCParser/MCAsmLexer.h index ad5bcc481cc..56da6f85c19 100644 --- a/include/llvm/MC/MCParser/MCAsmLexer.h +++ b/include/llvm/MC/MCParser/MCAsmLexer.h @@ -128,6 +128,20 @@ public: } }; +/// A callback class which is notified of each comment in an assembly file as +/// it is lexed. +class AsmCommentConsumer { +public: + virtual ~AsmCommentConsumer() {}; + + /// Callback function for when a comment is lexed. Loc is the start of the + /// comment text (excluding the comment-start marker). CommentText is the text + /// of the comment, excluding the comment start and end markers, and the + /// newline for single-line comments. + virtual void HandleComment(SMLoc Loc, StringRef CommentText) = 0; +}; + + /// Generic assembler lexer interface, for use by target specific assembly /// lexers. class MCAsmLexer { @@ -145,6 +159,7 @@ protected: // Can only create subclasses. bool SkipSpace; bool AllowAtInIdentifier; bool IsAtStartOfStatement; + AsmCommentConsumer *CommentConsumer; MCAsmLexer(); @@ -234,6 +249,10 @@ public: bool getAllowAtInIdentifier() { return AllowAtInIdentifier; } void setAllowAtInIdentifier(bool v) { AllowAtInIdentifier = v; } + + void setCommentConsumer(AsmCommentConsumer *CommentConsumer) { + this->CommentConsumer = CommentConsumer; + } }; } // End llvm namespace diff --git a/lib/MC/MCParser/AsmLexer.cpp b/lib/MC/MCParser/AsmLexer.cpp index 0fa7fbdc7b6..87ecf9e0227 100644 --- a/lib/MC/MCParser/AsmLexer.cpp +++ b/lib/MC/MCParser/AsmLexer.cpp @@ -181,12 +181,19 @@ AsmToken AsmLexer::LexSlash() { // C Style comment. ++CurPtr; // skip the star. + const char *CommentTextStart = CurPtr; while (CurPtr != CurBuf.end()) { switch (*CurPtr++) { case '*': // End of the comment? if (*CurPtr != '/') break; + // If we have a CommentConsumer, notify it about the comment. + if (CommentConsumer) { + CommentConsumer->HandleComment( + SMLoc::getFromPointer(CommentTextStart), + StringRef(CommentTextStart, CurPtr - 1 - CommentTextStart)); + } ++CurPtr; // End the */. return AsmToken(AsmToken::Comment, StringRef(TokStart, CurPtr - TokStart)); @@ -202,10 +209,18 @@ AsmToken AsmLexer::LexLineComment() { // comment. While it would be nicer to leave this two tokens, // backwards compatability with TargetParsers makes keeping this in this form // better. + const char *CommentTextStart = CurPtr; int CurChar = getNextChar(); while (CurChar != '\n' && CurChar != '\r' && CurChar != EOF) CurChar = getNextChar(); + // If we have a CommentConsumer, notify it about the comment. + if (CommentConsumer) { + CommentConsumer->HandleComment( + SMLoc::getFromPointer(CommentTextStart), + StringRef(CommentTextStart, CurPtr - 1 - CommentTextStart)); + } + IsAtStartOfLine = true; // This is a whole line comment. leave newline if (IsAtStartOfStatement) diff --git a/lib/MC/MCParser/MCAsmLexer.cpp b/lib/MC/MCParser/MCAsmLexer.cpp index 336e6413e38..63c0daba09a 100644 --- a/lib/MC/MCParser/MCAsmLexer.cpp +++ b/lib/MC/MCParser/MCAsmLexer.cpp @@ -13,7 +13,8 @@ using namespace llvm; MCAsmLexer::MCAsmLexer() - : TokStart(nullptr), SkipSpace(true), IsAtStartOfStatement(true) { + : TokStart(nullptr), SkipSpace(true), IsAtStartOfStatement(true), + CommentConsumer(nullptr) { CurTok.emplace_back(AsmToken::Space, StringRef()); }