From b36c19bc4f2110a8e33f8d93751ef28b6dcd0292 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Mon, 6 Apr 2020 09:55:33 -0700 Subject: [PATCH] [AST] Remove DeclCXX.h dep on ASTContext.h Saves only 36 includes of ASTContext.h and related headers. There are two deps on ASTContext.h: - C++ method overrides iterator types (TinyPtrVector) - getting LangOptions For #1, duplicate the iterator type, which is TinyPtrVector<>::const_iterator. For #2, add an out-of-line accessor to get the language options. Getting the ASTContext from a Decl is already an out of line method that loops over the parent DeclContexts, so if it is ever performance critical, the proper fix is to pass the context (or LangOpts) into the predicate in question. Other changes are just header fixups. --- clang/include/clang/AST/DeclBase.h | 4 ++++ clang/include/clang/AST/DeclCXX.h | 16 +++++++++------- clang/include/clang/AST/GlobalDecl.h | 5 ++--- .../clang/Serialization/ASTRecordReader.h | 1 + clang/lib/AST/CommentSema.cpp | 2 +- clang/lib/AST/ComparisonCategories.cpp | 1 + clang/lib/AST/DeclBase.cpp | 6 ++++++ clang/lib/Analysis/PathDiagnostic.cpp | 7 ++++--- clang/lib/Analysis/ProgramPoint.cpp | 1 + clang/lib/CodeGen/CGDebugInfo.h | 1 + clang/lib/Tooling/Core/Lookup.cpp | 1 + 11 files changed, 31 insertions(+), 14 deletions(-) diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index 05dec109828d83..b48f7e4f9308b5 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -465,6 +465,10 @@ class alignas(8) Decl { ASTContext &getASTContext() const LLVM_READONLY; + /// Helper to get the language options from the ASTContext. + /// Defined out of line to avoid depending on ASTContext.h. + const LangOptions &getLangOpts() const LLVM_READONLY; + void setAccess(AccessSpecifier AS) { Access = AS; assert(AccessDeclContextSanity()); diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index 60d99f1a487f85..d914bd10663ed7 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/include/clang/AST/DeclCXX.h @@ -15,7 +15,6 @@ #ifndef LLVM_CLANG_AST_DECLCXX_H #define LLVM_CLANG_AST_DECLCXX_H -#include "clang/AST/ASTContext.h" #include "clang/AST/ASTUnresolvedSet.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" @@ -40,6 +39,7 @@ #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/TinyPtrVector.h" #include "llvm/ADT/iterator_range.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" @@ -53,6 +53,7 @@ namespace clang { +class ASTContext; class ClassTemplateDecl; class ConstructorUsingShadowDecl; class CXXBasePath; @@ -1166,7 +1167,7 @@ class CXXRecordDecl : public RecordDecl { bool defaultedDefaultConstructorIsConstexpr() const { return data().DefaultedDefaultConstructorIsConstexpr && (!isUnion() || hasInClassInitializer() || !hasVariantMembers() || - getASTContext().getLangOpts().CPlusPlus2a); + getLangOpts().CPlusPlus2a); } /// Determine whether this class has a constexpr default constructor. @@ -1258,7 +1259,7 @@ class CXXRecordDecl : public RecordDecl { /// would be constexpr. bool defaultedDestructorIsConstexpr() const { return data().DefaultedDestructorIsConstexpr && - getASTContext().getLangOpts().CPlusPlus2a; + getLangOpts().CPlusPlus2a; } /// Determine whether this class has a constexpr destructor. @@ -1355,10 +1356,10 @@ class CXXRecordDecl : public RecordDecl { /// /// Only in C++17 and beyond, are lambdas literal types. bool isLiteral() const { - ASTContext &Ctx = getASTContext(); - return (Ctx.getLangOpts().CPlusPlus2a ? hasConstexprDestructor() + const LangOptions &LangOpts = getLangOpts(); + return (LangOpts.CPlusPlus2a ? hasConstexprDestructor() : hasTrivialDestructor()) && - (!isLambda() || Ctx.getLangOpts().CPlusPlus17) && + (!isLambda() || LangOpts.CPlusPlus17) && !hasNonLiteralTypeFieldsOrBases() && (isAggregate() || isLambda() || hasConstexprNonCopyMoveConstructor() || @@ -2035,7 +2036,8 @@ class CXXMethodDecl : public FunctionDecl { method_iterator end_overridden_methods() const; unsigned size_overridden_methods() const; - using overridden_method_range= ASTContext::overridden_method_range; + using overridden_method_range = llvm::iterator_range< + llvm::TinyPtrVector::const_iterator>; overridden_method_range overridden_methods() const; diff --git a/clang/include/clang/AST/GlobalDecl.h b/clang/include/clang/AST/GlobalDecl.h index bf30d9b942357f..d8ac498be54fd3 100644 --- a/clang/include/clang/AST/GlobalDecl.h +++ b/clang/include/clang/AST/GlobalDecl.h @@ -150,9 +150,8 @@ class GlobalDecl { } static KernelReferenceKind getDefaultKernelReference(const FunctionDecl *D) { - return D->getASTContext().getLangOpts().CUDAIsDevice - ? KernelReferenceKind::Kernel - : KernelReferenceKind::Stub; + return D->getLangOpts().CUDAIsDevice ? KernelReferenceKind::Kernel + : KernelReferenceKind::Stub; } GlobalDecl getWithDecl(const Decl *D) { diff --git a/clang/include/clang/Serialization/ASTRecordReader.h b/clang/include/clang/Serialization/ASTRecordReader.h index 5bdc9ca2ddbfce..52de383b0ebfce 100644 --- a/clang/include/clang/Serialization/ASTRecordReader.h +++ b/clang/include/clang/Serialization/ASTRecordReader.h @@ -14,6 +14,7 @@ #ifndef LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H #define LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H +#include "clang/AST/ASTContext.h" #include "clang/AST/AbstractBasicReader.h" #include "clang/Lex/Token.h" #include "clang/Serialization/ASTReader.h" diff --git a/clang/lib/AST/CommentSema.cpp b/clang/lib/AST/CommentSema.cpp index 8102f0115cc78e..7642e73fa17149 100644 --- a/clang/lib/AST/CommentSema.cpp +++ b/clang/lib/AST/CommentSema.cpp @@ -691,7 +691,7 @@ void Sema::checkDeprecatedCommand(const BlockCommandComment *Command) { FD->doesThisDeclarationHaveABody()) return; - const LangOptions &LO = FD->getASTContext().getLangOpts(); + const LangOptions &LO = FD->getLangOpts(); const bool DoubleSquareBracket = LO.CPlusPlus14 || LO.C2x; StringRef AttributeSpelling = DoubleSquareBracket ? "[[deprecated]]" : "__attribute__((deprecated))"; diff --git a/clang/lib/AST/ComparisonCategories.cpp b/clang/lib/AST/ComparisonCategories.cpp index 07673230357f63..6b6826c02a123e 100644 --- a/clang/lib/AST/ComparisonCategories.cpp +++ b/clang/lib/AST/ComparisonCategories.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/AST/ComparisonCategories.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/Type.h" diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index a59873cbc9fc0a..0eb88e07f9bc05 100644 --- a/clang/lib/AST/DeclBase.cpp +++ b/clang/lib/AST/DeclBase.cpp @@ -378,6 +378,12 @@ ASTContext &Decl::getASTContext() const { return getTranslationUnitDecl()->getASTContext(); } +/// Helper to get the language options from the ASTContext. +/// Defined out of line to avoid depending on ASTContext.h. +const LangOptions &Decl::getLangOpts() const { + return getASTContext().getLangOpts(); +} + ASTMutationListener *Decl::getASTMutationListener() const { return getASTContext().getASTMutationListener(); } diff --git a/clang/lib/Analysis/PathDiagnostic.cpp b/clang/lib/Analysis/PathDiagnostic.cpp index 53235ba0769946..c88e6c1e1535f6 100644 --- a/clang/lib/Analysis/PathDiagnostic.cpp +++ b/clang/lib/Analysis/PathDiagnostic.cpp @@ -20,6 +20,7 @@ #include "clang/AST/ExprCXX.h" #include "clang/AST/OperationKinds.h" #include "clang/AST/ParentMap.h" +#include "clang/AST/PrettyPrinter.h" #include "clang/AST/Stmt.h" #include "clang/AST/Type.h" #include "clang/Analysis/AnalysisDeclContext.h" @@ -909,7 +910,7 @@ static void describeClass(raw_ostream &Out, const CXXRecordDecl *D, Out << Prefix << '\'' << *D; if (const auto T = dyn_cast(D)) describeTemplateParameters(Out, T->getTemplateArgs().asArray(), - D->getASTContext().getLangOpts(), "<", ">"); + D->getLangOpts(), "<", ">"); Out << '\''; } @@ -975,8 +976,8 @@ static bool describeCodeDecl(raw_ostream &Out, const Decl *D, if (const auto FD = dyn_cast(D)) if (const TemplateArgumentList *TAList = FD->getTemplateSpecializationArgs()) - describeTemplateParameters(Out, TAList->asArray(), - FD->getASTContext().getLangOpts(), "<", ">"); + describeTemplateParameters(Out, TAList->asArray(), FD->getLangOpts(), "<", + ">"); Out << '\''; return true; diff --git a/clang/lib/Analysis/ProgramPoint.cpp b/clang/lib/Analysis/ProgramPoint.cpp index 0783fbed531554..2a91749affd2a6 100644 --- a/clang/lib/Analysis/ProgramPoint.cpp +++ b/clang/lib/Analysis/ProgramPoint.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/ProgramPoint.h" +#include "clang/AST/ASTContext.h" #include "clang/Basic/JsonSupport.h" using namespace clang; diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h index 1deca074954fc4..4915e19753c653 100644 --- a/clang/lib/CodeGen/CGDebugInfo.h +++ b/clang/lib/CodeGen/CGDebugInfo.h @@ -17,6 +17,7 @@ #include "clang/AST/DeclCXX.h" #include "clang/AST/Expr.h" #include "clang/AST/ExternalASTSource.h" +#include "clang/AST/PrettyPrinter.h" #include "clang/AST/Type.h" #include "clang/AST/TypeOrdering.h" #include "clang/Basic/CodeGenOptions.h" diff --git a/clang/lib/Tooling/Core/Lookup.cpp b/clang/lib/Tooling/Core/Lookup.cpp index aa83e567b7743d..712724a268fb28 100644 --- a/clang/lib/Tooling/Core/Lookup.cpp +++ b/clang/lib/Tooling/Core/Lookup.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "clang/Tooling/Core/Lookup.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclarationName.h"