hokein created this revision. hokein added a reviewer: sammccall. Herald added a subscriber: martong. Herald added a reviewer: shafik. Herald added a project: clang. hokein requested review of this revision.
heap-allocate the Template kind, this would reduce AST memory usage - TemplateArgumentLocInfo from 24 bytes to 8 bytes; - TemplateARgumentLoc from 56 bytes to 40 bytes; Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D87080 Files: clang/include/clang/AST/TemplateBase.h clang/lib/AST/ASTImporter.cpp clang/lib/AST/TypeLoc.cpp clang/lib/Sema/SemaTemplate.cpp clang/lib/Sema/SemaTemplateDeduction.cpp clang/lib/Sema/SemaTemplateInstantiateDecl.cpp clang/lib/Sema/SemaTemplateVariadic.cpp clang/lib/Sema/TreeTransform.h clang/lib/Serialization/ASTReader.cpp
Index: clang/lib/Serialization/ASTReader.cpp =================================================================== --- clang/lib/Serialization/ASTReader.cpp +++ clang/lib/Serialization/ASTReader.cpp @@ -7101,15 +7101,15 @@ NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); SourceLocation TemplateNameLoc = readSourceLocation(); - return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, - SourceLocation()); + return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, + TemplateNameLoc, SourceLocation()); } case TemplateArgument::TemplateExpansion: { NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); SourceLocation TemplateNameLoc = readSourceLocation(); SourceLocation EllipsisLoc = readSourceLocation(); - return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, - EllipsisLoc); + return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, + TemplateNameLoc, EllipsisLoc); } case TemplateArgument::Null: case TemplateArgument::Integral: Index: clang/lib/Sema/TreeTransform.h =================================================================== --- clang/lib/Sema/TreeTransform.h +++ clang/lib/Sema/TreeTransform.h @@ -3545,12 +3545,12 @@ } case TemplateArgument::Template: - return TemplateArgumentLoc(TemplateArgument( - Pattern.getArgument().getAsTemplate(), - NumExpansions), - Pattern.getTemplateQualifierLoc(), - Pattern.getTemplateNameLoc(), - EllipsisLoc); + return TemplateArgumentLoc( + SemaRef.Context, + TemplateArgument(Pattern.getArgument().getAsTemplate(), + NumExpansions), + Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), + EllipsisLoc); case TemplateArgument::Null: case TemplateArgument::Integral: @@ -4288,8 +4288,8 @@ if (Template.isNull()) return true; - Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, - Input.getTemplateNameLoc()); + Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), + QualifierLoc, Input.getTemplateNameLoc()); return false; } Index: clang/lib/Sema/SemaTemplateVariadic.cpp =================================================================== --- clang/lib/Sema/SemaTemplateVariadic.cpp +++ clang/lib/Sema/SemaTemplateVariadic.cpp @@ -1095,7 +1095,7 @@ case TemplateArgument::TemplateExpansion: Ellipsis = OrigLoc.getTemplateEllipsisLoc(); NumExpansions = Argument.getNumTemplateExpansions(); - return TemplateArgumentLoc(Argument.getPackExpansionPattern(), + return TemplateArgumentLoc(Context, Argument.getPackExpansionPattern(), OrigLoc.getTemplateQualifierLoc(), OrigLoc.getTemplateNameLoc()); Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -2886,7 +2886,7 @@ if (!TName.isNull()) Param->setDefaultArgument( SemaRef.Context, - TemplateArgumentLoc(TemplateArgument(TName), + TemplateArgumentLoc(SemaRef.Context, TemplateArgument(TName), D->getDefaultArgument().getTemplateQualifierLoc(), D->getDefaultArgument().getTemplateNameLoc())); } Index: clang/lib/Sema/SemaTemplateDeduction.cpp =================================================================== --- clang/lib/Sema/SemaTemplateDeduction.cpp +++ clang/lib/Sema/SemaTemplateDeduction.cpp @@ -2670,11 +2670,11 @@ Builder.MakeTrivial(Context, QTN->getQualifier(), Loc); if (Arg.getKind() == TemplateArgument::Template) - return TemplateArgumentLoc(Arg, Builder.getWithLocInContext(Context), - Loc); + return TemplateArgumentLoc(Context, Arg, + Builder.getWithLocInContext(Context), Loc); - return TemplateArgumentLoc(Arg, Builder.getWithLocInContext(Context), - Loc, Loc); + return TemplateArgumentLoc( + Context, Arg, Builder.getWithLocInContext(Context), Loc, Loc); } case TemplateArgument::Expression: Index: clang/lib/Sema/SemaTemplate.cpp =================================================================== --- clang/lib/Sema/SemaTemplate.cpp +++ clang/lib/Sema/SemaTemplate.cpp @@ -938,11 +938,10 @@ TArg = TemplateArgument(Template, Optional<unsigned int>()); else TArg = Template; - return TemplateArgumentLoc(TArg, - Arg.getScopeSpec().getWithLocInContext( - SemaRef.Context), - Arg.getLocation(), - Arg.getEllipsisLoc()); + return TemplateArgumentLoc( + SemaRef.Context, TArg, + Arg.getScopeSpec().getWithLocInContext(SemaRef.Context), + Arg.getLocation(), Arg.getEllipsisLoc()); } } @@ -5159,15 +5158,17 @@ if (TName.isNull()) return TemplateArgumentLoc(); - return TemplateArgumentLoc(TemplateArgument(TName), - TempTempParm->getDefaultArgument().getTemplateQualifierLoc(), - TempTempParm->getDefaultArgument().getTemplateNameLoc()); + return TemplateArgumentLoc( + Context, TemplateArgument(TName), + TempTempParm->getDefaultArgument().getTemplateQualifierLoc(), + TempTempParm->getDefaultArgument().getTemplateNameLoc()); } /// Convert a template-argument that we parsed as a type into a template, if /// possible. C++ permits injected-class-names to perform dual service as /// template template arguments and as template type arguments. -static TemplateArgumentLoc convertTypeTemplateArgumentToTemplate(TypeLoc TLoc) { +static TemplateArgumentLoc +convertTypeTemplateArgumentToTemplate(ASTContext &Context, TypeLoc TLoc) { // Extract and step over any surrounding nested-name-specifier. NestedNameSpecifierLoc QualLoc; if (auto ETLoc = TLoc.getAs<ElaboratedTypeLoc>()) { @@ -5177,11 +5178,10 @@ QualLoc = ETLoc.getQualifierLoc(); TLoc = ETLoc.getNamedTypeLoc(); } - // If this type was written as an injected-class-name, it can be used as a // template template argument. if (auto InjLoc = TLoc.getAs<InjectedClassNameTypeLoc>()) - return TemplateArgumentLoc(InjLoc.getTypePtr()->getTemplateName(), + return TemplateArgumentLoc(Context, InjLoc.getTypePtr()->getTemplateName(), QualLoc, InjLoc.getNameLoc()); // If this type was written as an injected-class-name, it may have been @@ -5191,7 +5191,8 @@ if (auto RecLoc = TLoc.getAs<RecordTypeLoc>()) if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RecLoc.getDecl())) - return TemplateArgumentLoc(TemplateName(CTSD->getSpecializedTemplate()), + return TemplateArgumentLoc(Context, + TemplateName(CTSD->getSpecializedTemplate()), QualLoc, RecLoc.getNameLoc()); return TemplateArgumentLoc(); @@ -5430,7 +5431,7 @@ // itself. if (Arg.getArgument().getKind() == TemplateArgument::Type) { TemplateArgumentLoc ConvertedArg = convertTypeTemplateArgumentToTemplate( - Arg.getTypeSourceInfo()->getTypeLoc()); + Context, Arg.getTypeSourceInfo()->getTypeLoc()); if (!ConvertedArg.getArgument().isNull()) Arg = ConvertedArg; } @@ -5749,8 +5750,9 @@ if (Name.isNull()) return true; - Arg = TemplateArgumentLoc(TemplateArgument(Name), QualifierLoc, - TempParm->getDefaultArgument().getTemplateNameLoc()); + Arg = TemplateArgumentLoc( + Context, TemplateArgument(Name), QualifierLoc, + TempParm->getDefaultArgument().getTemplateNameLoc()); } // Introduce an instantiation record that describes where we are using Index: clang/lib/AST/TypeLoc.cpp =================================================================== --- clang/lib/AST/TypeLoc.cpp +++ clang/lib/AST/TypeLoc.cpp @@ -582,7 +582,7 @@ Builder.MakeTrivial(Context, QTN->getQualifier(), Loc); ArgInfos[i] = TemplateArgumentLocInfo( - Builder.getWithLocInContext(Context), Loc, + Context, Builder.getWithLocInContext(Context), Loc, Args[i].getKind() == TemplateArgument::Template ? SourceLocation() : Loc); break; Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -882,11 +882,9 @@ import(FromInfo.getTemplateEllipsisLoc()); if (!ToTemplateEllipsisLocOrErr) return ToTemplateEllipsisLocOrErr.takeError(); - ToInfo = TemplateArgumentLocInfo( - *ToTemplateQualifierLocOrErr, - *ToTemplateNameLocOrErr, - *ToTemplateEllipsisLocOrErr); + Importer.getToContext(), *ToTemplateQualifierLocOrErr, + *ToTemplateNameLocOrErr, *ToTemplateEllipsisLocOrErr); } return TemplateArgumentLoc(Arg, ToInfo); Index: clang/include/clang/AST/TemplateBase.h =================================================================== --- clang/include/clang/AST/TemplateBase.h +++ clang/include/clang/AST/TemplateBase.h @@ -14,6 +14,7 @@ #ifndef LLVM_CLANG_AST_TEMPLATEBASE_H #define LLVM_CLANG_AST_TEMPLATEBASE_H +#include "clang/AST/ASTContext.h" #include "clang/AST/DependenceFlags.h" #include "clang/AST/NestedNameSpecifier.h" #include "clang/AST/TemplateName.h" @@ -400,49 +401,76 @@ void *QualifierLocData; unsigned TemplateNameLoc; unsigned EllipsisLoc; + ASTContext *Ctx; }; - union { - struct T Template; - Expr *Expression; - TypeSourceInfo *Declarator; + // Represents the various kinds the internal pointer would present. + // Steal 2-bits to support these different kinds. + enum class Kind { + Template = 0, + Expr = 1, + Declarator = 2, }; -public: - constexpr TemplateArgumentLocInfo() : Template({nullptr, nullptr, 0, 0}) {} + llvm::PointerIntPair<void *, /*Bits=*/2, Kind> PointerAndKind; - TemplateArgumentLocInfo(TypeSourceInfo *TInfo) : Declarator(TInfo) {} + T *getTemplate() const { + assert(PointerAndKind.getInt() == Kind::Template); + return reinterpret_cast<T *>(PointerAndKind.getPointer()); + } - TemplateArgumentLocInfo(Expr *E) : Expression(E) {} +public: + constexpr TemplateArgumentLocInfo() {} + ~TemplateArgumentLocInfo() { + if (!PointerAndKind.getOpaqueValue()) + return; + if (PointerAndKind.getInt() == Kind::Template) { + auto *T = getTemplate(); + T->Ctx->Deallocate(T); + } + } + TemplateArgumentLocInfo(TypeSourceInfo *Declarator) { + PointerAndKind.setPointerAndInt(Declarator, Kind::Declarator); + } + + TemplateArgumentLocInfo(Expr *E) { + PointerAndKind.setPointerAndInt(E, Kind::Expr); + } - TemplateArgumentLocInfo(NestedNameSpecifierLoc QualifierLoc, + TemplateArgumentLocInfo(ASTContext &Ctx, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateNameLoc, SourceLocation EllipsisLoc) { - Template.Qualifier = QualifierLoc.getNestedNameSpecifier(); - Template.QualifierLocData = QualifierLoc.getOpaqueData(); - Template.TemplateNameLoc = TemplateNameLoc.getRawEncoding(); - Template.EllipsisLoc = EllipsisLoc.getRawEncoding(); + T *Template = Ctx.Allocate<T>(); + Template->Qualifier = QualifierLoc.getNestedNameSpecifier(); + Template->QualifierLocData = QualifierLoc.getOpaqueData(); + Template->TemplateNameLoc = TemplateNameLoc.getRawEncoding(); + Template->EllipsisLoc = EllipsisLoc.getRawEncoding(); + Template->Ctx = &Ctx; + PointerAndKind.setPointerAndInt(Template, Kind::Template); } TypeSourceInfo *getAsTypeSourceInfo() const { - return Declarator; + assert(PointerAndKind.getInt() == Kind::Declarator); + return reinterpret_cast<TypeSourceInfo *>(PointerAndKind.getPointer()); } Expr *getAsExpr() const { - return Expression; + assert(PointerAndKind.getInt() == Kind::Expr); + return reinterpret_cast<Expr *>(PointerAndKind.getPointer()); } NestedNameSpecifierLoc getTemplateQualifierLoc() const { - return NestedNameSpecifierLoc(Template.Qualifier, - Template.QualifierLocData); + auto *Template = getTemplate(); + return NestedNameSpecifierLoc(Template->Qualifier, + Template->QualifierLocData); } SourceLocation getTemplateNameLoc() const { - return SourceLocation::getFromRawEncoding(Template.TemplateNameLoc); + return SourceLocation::getFromRawEncoding(getTemplate()->TemplateNameLoc); } SourceLocation getTemplateEllipsisLoc() const { - return SourceLocation::getFromRawEncoding(Template.EllipsisLoc); + return SourceLocation::getFromRawEncoding(getTemplate()->EllipsisLoc); } }; @@ -475,12 +503,12 @@ Argument.getKind() == TemplateArgument::Expression); } - TemplateArgumentLoc(const TemplateArgument &Argument, + TemplateArgumentLoc(ASTContext &Ctx, const TemplateArgument &Argument, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateNameLoc, SourceLocation EllipsisLoc = SourceLocation()) : Argument(Argument), - LocInfo(QualifierLoc, TemplateNameLoc, EllipsisLoc) { + LocInfo(Ctx, QualifierLoc, TemplateNameLoc, EllipsisLoc) { assert(Argument.getKind() == TemplateArgument::Template || Argument.getKind() == TemplateArgument::TemplateExpansion); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits