[clang] d52cc9d - [Clang][AST][NFC] Store template parameter position for TemplateTypeParmType in TypeBit (#102481)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 8 12:46:32 PDT 2024
Author: Krystian Stasiowski
Date: 2024-08-08T15:46:27-04:00
New Revision: d52cc9de5ad92854613143bbd5f8b0771b2db1e1
URL: https://github.com/llvm/llvm-project/commit/d52cc9de5ad92854613143bbd5f8b0771b2db1e1
DIFF: https://github.com/llvm/llvm-project/commit/d52cc9de5ad92854613143bbd5f8b0771b2db1e1.diff
LOG: [Clang][AST][NFC] Store template parameter position for TemplateTypeParmType in TypeBit (#102481)
`TemplateTypeParmType` currently stores the depth, index, and whether a
template type parameter is a pack in a union of `CanonicalTTPTInfo` and
`TemplateTypeParmDecl*`, and only the canonical type stores the position
information. These bits can be stored for all `TemplateTypeParmTypes` in
`TypeBits` to avoid unnecessary indirection when accessing the position
information.
Added:
Modified:
clang/include/clang/AST/Type.h
clang/lib/AST/ASTContext.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h
index a4804e4c6f61c..27618604192c5 100644
--- a/clang/include/clang/AST/Type.h
+++ b/clang/include/clang/AST/Type.h
@@ -2134,6 +2134,23 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase {
unsigned hasTypeDifferentFromDecl : 1;
};
+ class TemplateTypeParmTypeBitfields {
+ friend class TemplateTypeParmType;
+
+ LLVM_PREFERRED_TYPE(TypeBitfields)
+ unsigned : NumTypeBits;
+
+ /// The depth of the template parameter.
+ unsigned Depth : 15;
+
+ /// Whether this is a template parameter pack.
+ LLVM_PREFERRED_TYPE(bool)
+ unsigned ParameterPack : 1;
+
+ /// The index of the template parameter.
+ unsigned Index : 16;
+ };
+
class SubstTemplateTypeParmTypeBitfields {
friend class SubstTemplateTypeParmType;
@@ -2257,6 +2274,7 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase {
TypeWithKeywordBitfields TypeWithKeywordBits;
ElaboratedTypeBitfields ElaboratedTypeBits;
VectorTypeBitfields VectorTypeBits;
+ TemplateTypeParmTypeBitfields TemplateTypeParmTypeBits;
SubstTemplateTypeParmTypeBitfields SubstTemplateTypeParmTypeBits;
SubstTemplateTypeParmPackTypeBitfields SubstTemplateTypeParmPackTypeBits;
TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits;
@@ -6135,52 +6153,30 @@ class BTFTagAttributedType : public Type, public llvm::FoldingSetNode {
class TemplateTypeParmType : public Type, public llvm::FoldingSetNode {
friend class ASTContext; // ASTContext creates these
- // Helper data collector for canonical types.
- struct CanonicalTTPTInfo {
- unsigned Depth : 15;
- unsigned ParameterPack : 1;
- unsigned Index : 16;
- };
-
- union {
- // Info for the canonical type.
- CanonicalTTPTInfo CanTTPTInfo;
-
- // Info for the non-canonical type.
- TemplateTypeParmDecl *TTPDecl;
- };
+ // The associated TemplateTypeParmDecl for the non-canonical type.
+ TemplateTypeParmDecl *TTPDecl;
- /// Build a non-canonical type.
- TemplateTypeParmType(TemplateTypeParmDecl *TTPDecl, QualType Canon)
+ TemplateTypeParmType(unsigned D, unsigned I, bool PP,
+ TemplateTypeParmDecl *TTPDecl, QualType Canon)
: Type(TemplateTypeParm, Canon,
TypeDependence::DependentInstantiation |
- (Canon->getDependence() & TypeDependence::UnexpandedPack)),
- TTPDecl(TTPDecl) {}
-
- /// Build the canonical type.
- TemplateTypeParmType(unsigned D, unsigned I, bool PP)
- : Type(TemplateTypeParm, QualType(this, 0),
- TypeDependence::DependentInstantiation |
- (PP ? TypeDependence::UnexpandedPack : TypeDependence::None)) {
- CanTTPTInfo.Depth = D;
- CanTTPTInfo.Index = I;
- CanTTPTInfo.ParameterPack = PP;
- }
-
- const CanonicalTTPTInfo& getCanTTPTInfo() const {
- QualType Can = getCanonicalTypeInternal();
- return Can->castAs<TemplateTypeParmType>()->CanTTPTInfo;
+ (PP ? TypeDependence::UnexpandedPack : TypeDependence::None)),
+ TTPDecl(TTPDecl) {
+ assert(!TTPDecl == Canon.isNull());
+ TemplateTypeParmTypeBits.Depth = D;
+ TemplateTypeParmTypeBits.Index = I;
+ TemplateTypeParmTypeBits.ParameterPack = PP;
}
public:
- unsigned getDepth() const { return getCanTTPTInfo().Depth; }
- unsigned getIndex() const { return getCanTTPTInfo().Index; }
- bool isParameterPack() const { return getCanTTPTInfo().ParameterPack; }
-
- TemplateTypeParmDecl *getDecl() const {
- return isCanonicalUnqualified() ? nullptr : TTPDecl;
+ unsigned getDepth() const { return TemplateTypeParmTypeBits.Depth; }
+ unsigned getIndex() const { return TemplateTypeParmTypeBits.Index; }
+ bool isParameterPack() const {
+ return TemplateTypeParmTypeBits.ParameterPack;
}
+ TemplateTypeParmDecl *getDecl() const { return TTPDecl; }
+
IdentifierInfo *getIdentifier() const;
bool isSugared() const { return false; }
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 8ccf4a2e77322..0dbbe0043f703 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -5300,15 +5300,15 @@ QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
if (TTPDecl) {
QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack);
TypeParm = new (*this, alignof(TemplateTypeParmType))
- TemplateTypeParmType(TTPDecl, Canon);
+ TemplateTypeParmType(Depth, Index, ParameterPack, TTPDecl, Canon);
TemplateTypeParmType *TypeCheck
= TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
assert(!TypeCheck && "Template type parameter canonical type broken");
(void)TypeCheck;
} else
- TypeParm = new (*this, alignof(TemplateTypeParmType))
- TemplateTypeParmType(Depth, Index, ParameterPack);
+ TypeParm = new (*this, alignof(TemplateTypeParmType)) TemplateTypeParmType(
+ Depth, Index, ParameterPack, /*TTPDecl=*/nullptr, /*Canon=*/QualType());
Types.push_back(TypeParm);
TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);
More information about the cfe-commits
mailing list