diff --git a/clang-tools-extra/pseudo/gen/CMakeLists.txt b/clang-tools-extra/pseudo/gen/CMakeLists.txt --- a/clang-tools-extra/pseudo/gen/CMakeLists.txt +++ b/clang-tools-extra/pseudo/gen/CMakeLists.txt @@ -1,4 +1,5 @@ set(LLVM_LINK_COMPONENTS Support) +list(REMOVE_ITEM LLVM_COMMON_DEPENDS clang-tablegen-targets) add_clang_executable(pseudo-gen Main.cpp diff --git a/clang-tools-extra/pseudo/lib/grammar/CMakeLists.txt b/clang-tools-extra/pseudo/lib/grammar/CMakeLists.txt --- a/clang-tools-extra/pseudo/lib/grammar/CMakeLists.txt +++ b/clang-tools-extra/pseudo/lib/grammar/CMakeLists.txt @@ -1,18 +1,15 @@ set(LLVM_LINK_COMPONENTS Support) -# This library intents to keep as minimal dependencies as possible, it is a base -# library of the cxx generator, to avoid creating long dep paths in the build -# graph. +# This library is used by the clang-pseudo-gen tool which runs at build time. +# Dependencies should be minimal to avoid long dep paths in the build graph. +# It does use clangBasic headers (tok::TokenKind), but linking is not needed. +# We have no transitive dependencies on tablegen files. +list(REMOVE_ITEM LLVM_COMMON_DEPENDS clang-tablegen-targets) add_clang_library(clangPseudoGrammar Grammar.cpp GrammarBNF.cpp LRGraph.cpp LRTable.cpp LRTableBuild.cpp - - # FIXME: can we get rid of the clangBasic dependency? We need it for the - # clang::tok::getTokenName and clang::tok::getPunctuatorSpelling functions, we - # could consider remimplement these functions. - LINK_LIBS - clangBasic ) + diff --git a/clang-tools-extra/pseudo/lib/grammar/Grammar.cpp b/clang-tools-extra/pseudo/lib/grammar/Grammar.cpp --- a/clang-tools-extra/pseudo/lib/grammar/Grammar.cpp +++ b/clang-tools-extra/pseudo/lib/grammar/Grammar.cpp @@ -167,19 +167,16 @@ } static llvm::ArrayRef getTerminalNames() { - static const std::vector *TerminalNames = []() { - static std::vector TerminalNames; - TerminalNames.reserve(NumTerminals); - for (unsigned I = 0; I < NumTerminals; ++I) { - tok::TokenKind K = static_cast(I); - if (const auto *Punc = tok::getPunctuatorSpelling(K)) - TerminalNames.push_back(Punc); - else - TerminalNames.push_back(llvm::StringRef(tok::getTokenName(K)).upper()); - } - return &TerminalNames; + static const auto &TerminalNames = []() { + auto &TerminalNames = *new std::array; +#define PUNCTUATOR(Tok, Spelling) TerminalNames[tok::Tok] = Spelling; +#define KEYWORD(Keyword, Condition) \ + TerminalNames[tok::kw_##Keyword] = llvm::StringRef(#Keyword).upper(); +#define TOK(Tok) TerminalNames[tok::Tok] = llvm::StringRef(#Tok).upper(); +#include "clang/Basic/TokenKinds.def" + return TerminalNames; }(); - return *TerminalNames; + return TerminalNames; } GrammarTable::GrammarTable() : Terminals(getTerminalNames()) {}