[llvm] [TableGen] Use SmallVectors for preprocessor include stack. NFC. (PR #121571)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 3 05:41:26 PST 2025
https://github.com/jayfoad created https://github.com/llvm/llvm-project/pull/121571
This is just a minor cleanup and a small step in the direction of using
LLVM containers in preference to STL containers in lib/TableGen.
>From 6e6094d7c65b628c80cef6cb01168184377c017e Mon Sep 17 00:00:00 2001
From: Jay Foad <jay.foad at amd.com>
Date: Fri, 3 Jan 2025 13:22:14 +0000
Subject: [PATCH] [TableGen] Use SmallVectors for preprocessor include stack.
NFC.
This is just a minor cleanup and a small step in the direction of using
LLVM containers in preference to STL containers in lib/TableGen.
---
llvm/lib/TableGen/TGLexer.cpp | 41 +++++++++++++----------------------
llvm/lib/TableGen/TGLexer.h | 5 ++---
2 files changed, 17 insertions(+), 29 deletions(-)
diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp
index eee42511804f5e..e23aec6efba59d 100644
--- a/llvm/lib/TableGen/TGLexer.cpp
+++ b/llvm/lib/TableGen/TGLexer.cpp
@@ -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.
@@ -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;
}
@@ -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) {
@@ -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())
@@ -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");
@@ -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");
@@ -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) {
@@ -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.
@@ -1055,20 +1048,16 @@ bool TGLexer::prepSkipDirectiveEnd() {
}
bool TGLexer::prepIsProcessingEnabled() {
- for (const PreprocessorControlDesc &I :
- llvm::reverse(*PrepIncludeStack.back()))
- 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");
diff --git a/llvm/lib/TableGen/TGLexer.h b/llvm/lib/TableGen/TGLexer.h
index 963d75e52cc8fd..f8b32dc5377f58 100644
--- a/llvm/lib/TableGen/TGLexer.h
+++ b/llvm/lib/TableGen/TGLexer.h
@@ -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"
@@ -21,7 +22,6 @@
#include <memory>
#include <set>
#include <string>
-#include <vector>
namespace llvm {
template <typename T> class ArrayRef;
@@ -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.
More information about the llvm-commits
mailing list