From: John McCall Date: Tue, 19 Oct 2010 05:23:37 +0000 (+0000) Subject: Petty space optimizations in ElaboratedType and DependentNameType. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=77be2b485f65ad134b3804a6930d5df9d0d974ce;p=clang Petty space optimizations in ElaboratedType and DependentNameType. Petty time optimization in TemplateTypeParmType. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116796 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index b0f74ee051..dbf4a38477 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -899,6 +899,15 @@ protected: unsigned InnerRef : 1; }; + class TypeWithKeywordBitfields { + friend class TypeWithKeyword; + + unsigned : NumTypeBits; + + /// An ElaboratedTypeKeyword. 8 bits for efficient access. + unsigned Keyword : 8; + }; + class VectorTypeBitfields { friend class VectorType; @@ -919,6 +928,7 @@ protected: FunctionTypeBitfields FunctionTypeBits; ObjCObjectTypeBitfields ObjCObjectTypeBits; ReferenceTypeBitfields ReferenceTypeBits; + TypeWithKeywordBitfields TypeWithKeywordBits; VectorTypeBitfields VectorTypeBits; }; @@ -2486,20 +2496,20 @@ public: class TemplateTypeParmType : public Type, public llvm::FoldingSetNode { unsigned Depth : 15; - unsigned Index : 16; unsigned ParameterPack : 1; + unsigned Index : 16; IdentifierInfo *Name; TemplateTypeParmType(unsigned D, unsigned I, bool PP, IdentifierInfo *N, QualType Canon) : Type(TemplateTypeParm, Canon, /*Dependent=*/true, /*VariablyModified=*/false), - Depth(D), Index(I), ParameterPack(PP), Name(N) { } + Depth(D), ParameterPack(PP), Index(I), Name(N) { } TemplateTypeParmType(unsigned D, unsigned I, bool PP) : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true, /*VariablyModified=*/false), - Depth(D), Index(I), ParameterPack(PP), Name(0) { } + Depth(D), ParameterPack(PP), Index(I), Name(0) { } friend class ASTContext; // ASTContext creates these @@ -2778,20 +2788,18 @@ enum ElaboratedTypeKeyword { /// Also provides a few static helpers for converting and printing /// elaborated type keyword and tag type kind enumerations. class TypeWithKeyword : public Type { - /// Keyword - Encodes an ElaboratedTypeKeyword enumeration constant. - unsigned Keyword : 3; - protected: TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc, QualType Canonical, bool Dependent, bool VariablyModified) - : Type(tc, Canonical, Dependent, VariablyModified), - Keyword(Keyword) {} + : Type(tc, Canonical, Dependent, VariablyModified) { + TypeWithKeywordBits.Keyword = Keyword; + } public: virtual ~TypeWithKeyword(); // pin vtable to Type.cpp ElaboratedTypeKeyword getKeyword() const { - return static_cast(Keyword); + return static_cast(TypeWithKeywordBits.Keyword); } /// getKeywordForTypeSpec - Converts a type specifier (DeclSpec::TST)