Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 15 additions & 26 deletions llvm/lib/TableGen/TGLexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,7 @@ TGLexer::TGLexer(SourceMgr &SM, ArrayRef<std::string> Macros) : SrcMgr(SM) {
TokStart = nullptr;

// Pretend that we enter the "top-level" include file.
PrepIncludeStack.push_back(
std::make_unique<std::vector<PreprocessorControlDesc>>());
PrepIncludeStack.emplace_back();

// Add all macros defined on the command line to the DefinedMacros set.
// Check invalid macro names and print fatal error if we find one.
Expand Down Expand Up @@ -453,8 +452,7 @@ bool TGLexer::LexInclude() {
CurBuf = SrcMgr.getMemoryBuffer(CurBuffer)->getBuffer();
CurPtr = CurBuf.begin();

PrepIncludeStack.push_back(
std::make_unique<std::vector<PreprocessorControlDesc>>());
PrepIncludeStack.emplace_back();
return false;
}

Expand Down Expand Up @@ -656,17 +654,13 @@ tgtok::TokKind TGLexer::LexExclaim() {
bool TGLexer::prepExitInclude(bool IncludeStackMustBeEmpty) {
// Report an error, if preprocessor control stack for the current
// file is not empty.
if (!PrepIncludeStack.back()->empty()) {
if (!PrepIncludeStack.back().empty()) {
prepReportPreprocessorStackError();

return false;
}

// Pop the preprocessing controls from the include stack.
if (PrepIncludeStack.empty()) {
PrintFatalError("preprocessor include stack is empty");
}

PrepIncludeStack.pop_back();

if (IncludeStackMustBeEmpty) {
Expand Down Expand Up @@ -761,7 +755,7 @@ tgtok::TokKind TGLexer::lexPreprocessor(tgtok::TokKind Kind,
// Regardless of whether we are processing tokens or not,
// we put the #ifdef control on stack.
// Note that MacroIsDefined has been canonicalized against ifdef.
PrepIncludeStack.back()->push_back(
PrepIncludeStack.back().push_back(
{tgtok::Ifdef, MacroIsDefined, SMLoc::getFromPointer(TokStart)});

if (!prepSkipDirectiveEnd())
Expand Down Expand Up @@ -789,10 +783,10 @@ tgtok::TokKind TGLexer::lexPreprocessor(tgtok::TokKind Kind,
} else if (Kind == tgtok::Else) {
// Check if this #else is correct before calling prepSkipDirectiveEnd(),
// which will move CurPtr away from the beginning of #else.
if (PrepIncludeStack.back()->empty())
if (PrepIncludeStack.back().empty())
return ReturnError(TokStart, "#else without #ifdef or #ifndef");

PreprocessorControlDesc IfdefEntry = PrepIncludeStack.back()->back();
PreprocessorControlDesc IfdefEntry = PrepIncludeStack.back().back();

if (IfdefEntry.Kind != tgtok::Ifdef) {
PrintError(TokStart, "double #else");
Expand All @@ -801,9 +795,8 @@ tgtok::TokKind TGLexer::lexPreprocessor(tgtok::TokKind Kind,

// Replace the corresponding #ifdef's control with its negation
// on the control stack.
PrepIncludeStack.back()->pop_back();
PrepIncludeStack.back()->push_back(
{Kind, !IfdefEntry.IsDefined, SMLoc::getFromPointer(TokStart)});
PrepIncludeStack.back().back() = {Kind, !IfdefEntry.IsDefined,
SMLoc::getFromPointer(TokStart)};

if (!prepSkipDirectiveEnd())
return ReturnError(CurPtr, "only comments are supported after #else");
Expand All @@ -822,10 +815,10 @@ tgtok::TokKind TGLexer::lexPreprocessor(tgtok::TokKind Kind,
} else if (Kind == tgtok::Endif) {
// Check if this #endif is correct before calling prepSkipDirectiveEnd(),
// which will move CurPtr away from the beginning of #endif.
if (PrepIncludeStack.back()->empty())
if (PrepIncludeStack.back().empty())
return ReturnError(TokStart, "#endif without #ifdef");

auto &IfdefOrElseEntry = PrepIncludeStack.back()->back();
auto &IfdefOrElseEntry = PrepIncludeStack.back().back();

if (IfdefOrElseEntry.Kind != tgtok::Ifdef &&
IfdefOrElseEntry.Kind != tgtok::Else) {
Expand All @@ -836,7 +829,7 @@ tgtok::TokKind TGLexer::lexPreprocessor(tgtok::TokKind Kind,
if (!prepSkipDirectiveEnd())
return ReturnError(CurPtr, "only comments are supported after #endif");

PrepIncludeStack.back()->pop_back();
PrepIncludeStack.back().pop_back();

// If we were processing tokens before this #endif, then
// we should continue it.
Expand Down Expand Up @@ -1055,20 +1048,16 @@ bool TGLexer::prepSkipDirectiveEnd() {
}

bool TGLexer::prepIsProcessingEnabled() {
for (const PreprocessorControlDesc &I :
llvm::reverse(*PrepIncludeStack.back()))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no idea why it was using llvm::reverse here. Maybe the last element usually has a higher chance to bail out?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did think about that, but really if you have nested #ifs I don't see any reason why the inner (or outer) condition would have a higher chance of being false.

if (!I.IsDefined)
return false;

return true;
return all_of(PrepIncludeStack.back(),
[](const PreprocessorControlDesc &I) { return I.IsDefined; });
}

void TGLexer::prepReportPreprocessorStackError() {
if (PrepIncludeStack.back()->empty())
if (PrepIncludeStack.back().empty())
PrintFatalError("prepReportPreprocessorStackError() called with "
"empty control stack");

auto &PrepControl = PrepIncludeStack.back()->back();
auto &PrepControl = PrepIncludeStack.back().back();
PrintError(CurBuf.end(), "reached EOF without matching #endif");
PrintError(PrepControl.SrcPos, "the latest preprocessor control is here");

Expand Down
5 changes: 2 additions & 3 deletions llvm/lib/TableGen/TGLexer.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#ifndef LLVM_LIB_TABLEGEN_TGLEXER_H
#define LLVM_LIB_TABLEGEN_TGLEXER_H

#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Support/DataTypes.h"
Expand All @@ -21,7 +22,6 @@
#include <memory>
#include <set>
#include <string>
#include <vector>

namespace llvm {
template <typename T> class ArrayRef;
Expand Down Expand Up @@ -323,8 +323,7 @@ class TGLexer {
// preprocessing control stacks for the current file and all its
// parent files. The back() element is the preprocessing control
// stack for the current file.
std::vector<std::unique_ptr<std::vector<PreprocessorControlDesc>>>
PrepIncludeStack;
SmallVector<SmallVector<PreprocessorControlDesc>> PrepIncludeStack;

// Validate that the current preprocessing control stack is empty,
// since we are about to exit a file, and pop the include stack.
Expand Down
Loading