Skip to content

Commit

Permalink
Prevent out of order HashDirective lexing in AsmLexer.
Browse files Browse the repository at this point in the history
Retrying after buildbot reset.

To lex hash directives we peek ahead to find component tokens, create a
unified token, and unlex the peeked tokens so the parser does not need
to parse the tokens then. Make sure we do not to lex another hash
directive during peek operation.

This fixes PR28921.

Reviewers: rnk, loladiro

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D24839

llvm-svn: 283111
  • Loading branch information
niravhdave committed Oct 3, 2016
1 parent d984934 commit 157891c
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 27 deletions.
2 changes: 1 addition & 1 deletion llvm/include/llvm/MC/MCParser/AsmLexer.h
Expand Up @@ -32,7 +32,7 @@ class AsmLexer : public MCAsmLexer {
bool IsAtStartOfLine;
bool IsAtStartOfStatement;
bool IsParsingMSInlineAsm;

bool IsPeeking;
void operator=(const AsmLexer&) = delete;
AsmLexer(const AsmLexer&) = delete;

Expand Down
43 changes: 17 additions & 26 deletions llvm/lib/MC/MCParser/AsmLexer.cpp
Expand Up @@ -11,29 +11,29 @@
//
//===----------------------------------------------------------------------===//

#include "llvm/MC/MCParser/AsmLexer.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/MC/MCParser/AsmLexer.h"
#include "llvm/MC/MCParser/MCAsmLexer.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCParser/MCAsmLexer.h"
#include "llvm/Support/SMLoc.h"
#include "llvm/Support/SaveAndRestore.h"
#include <cassert>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <tuple>
#include <string>
#include <tuple>
#include <utility>

using namespace llvm;

AsmLexer::AsmLexer(const MCAsmInfo &MAI) : MAI(MAI) {
CurPtr = nullptr;
IsAtStartOfLine = true;
IsAtStartOfStatement = true;
IsParsingMSInlineAsm = false;
AsmLexer::AsmLexer(const MCAsmInfo &MAI)
: MAI(MAI), CurPtr(nullptr), IsAtStartOfLine(true),
IsAtStartOfStatement(true), IsParsingMSInlineAsm(false),
IsPeeking(false) {
AllowAtInIdentifier = !StringRef(MAI.getCommentString()).startswith("@");
}

Expand Down Expand Up @@ -487,17 +487,15 @@ StringRef AsmLexer::LexUntilEndOfLine() {

size_t AsmLexer::peekTokens(MutableArrayRef<AsmToken> Buf,
bool ShouldSkipSpace) {
const char *SavedTokStart = TokStart;
const char *SavedCurPtr = CurPtr;
bool SavedAtStartOfLine = IsAtStartOfLine;
bool SavedAtStartOfStatement = IsAtStartOfStatement;
bool SavedSkipSpace = SkipSpace;

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);
std::string SavedErr = getErr();
SMLoc SavedErrLoc = getErrLoc();

SkipSpace = ShouldSkipSpace;

size_t ReadCount;
for (ReadCount = 0; ReadCount < Buf.size(); ++ReadCount) {
AsmToken Token = LexToken();
Expand All @@ -509,13 +507,6 @@ size_t AsmLexer::peekTokens(MutableArrayRef<AsmToken> Buf,
}

SetError(SavedErrLoc, SavedErr);

SkipSpace = SavedSkipSpace;
IsAtStartOfLine = SavedAtStartOfLine;
IsAtStartOfStatement = SavedAtStartOfStatement;
CurPtr = SavedCurPtr;
TokStart = SavedTokStart;

return ReadCount;
}

Expand All @@ -525,7 +516,7 @@ bool AsmLexer::isAtStartOfComment(const char *Ptr) {
if (CommentString.size() == 1)
return CommentString[0] == Ptr[0];

// FIXME: special case for the bogus "##" comment string in X86MCAsmInfoDarwin
// Allow # preprocessor commments also be counted as comments for "##" cases
if (CommentString[1] == '#')
return CommentString[0] == Ptr[0];

Expand All @@ -542,7 +533,7 @@ AsmToken AsmLexer::LexToken() {
// This always consumes at least one character.
int CurChar = getNextChar();

if (CurChar == '#' && IsAtStartOfStatement) {
if (!IsPeeking && CurChar == '#' && IsAtStartOfStatement) {
// If this starts with a '#', this may be a cpp
// hash directive and otherwise a line comment.
AsmToken TokenBuf[2];
Expand Down
8 changes: 8 additions & 0 deletions llvm/test/MC/AsmParser/pr28921.s
@@ -0,0 +1,8 @@
// RUN: llvm-mc -triple i386-unknown-unknown %s

# 1 "kernel.S"
# 1 "<built-in>" 1
# 1 "kernel.S" 2
##
# 10 "kernel.S"
##

0 comments on commit 157891c

Please sign in to comment.