[cfe-commits] r116472 - in /cfe/trunk: include/clang/AST/Type.h include/clang/Basic/DiagnosticSemaKinds.td lib/AST/Type.cpp

John McCall rjmccall at apple.com
Wed Oct 13 20:00:17 PDT 2010


Author: rjmccall
Date: Wed Oct 13 22:00:17 2010
New Revision: 116472

URL: http://llvm.org/viewvc/llvm-project?rev=116472&view=rev
Log:
Compress bit fields / enums from ReferenceType, BuiltinType, FunctionType, and
ObjCObjectType into Type.


Modified:
    cfe/trunk/include/clang/AST/Type.h
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/AST/Type.cpp

Modified: cfe/trunk/include/clang/AST/Type.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=116472&r1=116471&r2=116472&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Type.h (original)
+++ cfe/trunk/include/clang/AST/Type.h Wed Oct 13 22:00:17 2010
@@ -809,6 +809,8 @@
   /// \brief FromAST - Whether this type comes from an AST file.
   mutable bool FromAST : 1;
 
+  unsigned SpareBit : 1;
+
   /// \brief Set whether this type comes from an AST file.
   void setFromAST(bool V = true) const { 
     FromAST = V;
@@ -818,8 +820,37 @@
   /// \brief Compute the linkage of this type along with the presence of
   /// any local or unnamed types.
   virtual std::pair<Linkage, bool> getLinkageUnnamedLocalImpl() const;
-  
-  enum { BitsRemainingInType = 17 };
+
+  unsigned SubclassBits : 16;
+
+#define BITFIELD(Name, Previous, N) \
+  static unsigned Encode##Name(unsigned V) { \
+    assert(!((V << Name##Offset) & ~Name##Mask) && \
+           #Name " value out of range");   \
+    return (V << Name##Offset); \
+  } \
+  static unsigned Decode##Name(unsigned Bits) { \
+    return (Bits & Name##Mask) >> Name##Offset; \
+  } \
+  enum { \
+    Name##Width = (N), \
+    Name##Offset = Previous##Offset + Previous##Width, \
+    Name##Mask = ((1 << (N)) - 1) << Name##Offset \
+  }
+#define BOOL_BITFIELD(Name, Previous) \
+  static unsigned Encode##Name(bool V) { \
+    return (V ? Name##Mask : 0); \
+  } \
+  static bool Decode##Name(unsigned Bits) { \
+    return (Bits & Name##Mask) != 0; \
+  } \
+  enum { \
+    Name##Width = 1, \
+    Name##Offset = Previous##Offset + Previous##Width, \
+    Name##Mask = 1 << Name##Offset \
+  }
+#define InitialBitfieldWidth 0
+#define InitialBitfieldOffset 0
 
   // silence VC++ warning C4355: 'this' : used in base member initializer list
   Type *this_() { return this; }
@@ -1149,8 +1180,8 @@
 
     ObjCSel    // This represents the ObjC 'SEL' type.
   };
-private:
-  Kind TypeKind;
+
+  // SubclassBits stores a Kind.
   
 protected:
   virtual std::pair<Linkage, bool> getLinkageUnnamedLocalImpl() const;
@@ -1158,37 +1189,38 @@
 public:
   BuiltinType(Kind K)
     : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent),
-           /*VariablyModified=*/false),
-      TypeKind(K) {}
+           /*VariablyModified=*/false) {
+    SubclassBits = K;
+  }
 
-  Kind getKind() const { return TypeKind; }
+  Kind getKind() const { return static_cast<Kind>(SubclassBits); }
   const char *getName(const LangOptions &LO) const;
 
   bool isSugared() const { return false; }
   QualType desugar() const { return QualType(this, 0); }
 
   bool isInteger() const {
-    return TypeKind >= Bool && TypeKind <= Int128;
+    return getKind() >= Bool && getKind() <= Int128;
   }
 
   bool isSignedInteger() const {
-    return TypeKind >= Char_S && TypeKind <= Int128;
+    return getKind() >= Char_S && getKind() <= Int128;
   }
 
   bool isUnsignedInteger() const {
-    return TypeKind >= Bool && TypeKind <= UInt128;
+    return getKind() >= Bool && getKind() <= UInt128;
   }
 
   bool isFloatingPoint() const {
-    return TypeKind >= Float && TypeKind <= LongDouble;
+    return getKind() >= Float && getKind() <= LongDouble;
   }
 
   /// Determines whether this type is a "forbidden" placeholder type,
   /// i.e. a type which cannot appear in arbitrary positions in a
   /// fully-formed expression.
   bool isPlaceholderType() const {
-    return TypeKind == Overload ||
-           TypeKind == UndeducedAuto;
+    return getKind() == Overload ||
+           getKind() == UndeducedAuto;
   }
 
   static bool classof(const Type *T) { return T->getTypeClass() == Builtin; }
@@ -1313,38 +1345,38 @@
   ///   ref &&a;             // lvalue, inner ref
   ///   rvref &a;            // lvalue, inner ref, spelled lvalue
   ///   rvref &&a;           // rvalue, inner ref
-  bool SpelledAsLValue;
+  BOOL_BITFIELD(SpelledAsLValue, InitialBitfield);
 
   /// True if the inner type is a reference type.  This only happens
   /// in non-canonical forms.
-  bool InnerRef;
+  BOOL_BITFIELD(InnerRef, SpelledAsLValue);
 
 protected:
   ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef,
                 bool SpelledAsLValue) :
     Type(tc, CanonicalRef, Referencee->isDependentType(),
-         Referencee->isVariablyModifiedType()),
-    PointeeType(Referencee), SpelledAsLValue(SpelledAsLValue),
-    InnerRef(Referencee->isReferenceType()) {
+         Referencee->isVariablyModifiedType()), PointeeType(Referencee) {
+    SubclassBits = EncodeSpelledAsLValue(SpelledAsLValue) |
+                   EncodeInnerRef(Referencee->isReferenceType());
   }
   
   virtual std::pair<Linkage, bool> getLinkageUnnamedLocalImpl() const;
   
 public:
-  bool isSpelledAsLValue() const { return SpelledAsLValue; }
-  bool isInnerRef() const { return InnerRef; }
+  bool isSpelledAsLValue() const { return SubclassBits & SpelledAsLValueMask; }
+  bool isInnerRef() const { return SubclassBits & InnerRefMask; }
   
   QualType getPointeeTypeAsWritten() const { return PointeeType; }
   QualType getPointeeType() const {
     // FIXME: this might strip inner qualifiers; okay?
     const ReferenceType *T = this;
-    while (T->InnerRef)
+    while (T->isInnerRef())
       T = T->PointeeType->getAs<ReferenceType>();
     return T->PointeeType;
   }
 
   void Profile(llvm::FoldingSetNodeID &ID) {
-    Profile(ID, PointeeType, SpelledAsLValue);
+    Profile(ID, PointeeType, isSpelledAsLValue());
   }
   static void Profile(llvm::FoldingSetNodeID &ID,
                       QualType Referencee,
@@ -1464,13 +1496,12 @@
   /// ElementType - The element type of the array.
   QualType ElementType;
 
-  // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum
-  /// NOTE: These fields are packed into the bitfields space in the Type class.
-  unsigned SizeModifier : 2;
+  // IndexTypeQuals - Capture qualifiers in declarations like:
+  // 'int X[static restrict 4]'. For function parameters only.
+  enum { IndexTypeQualsMask = 0x7 };
 
-  /// IndexTypeQuals - Capture qualifiers in declarations like:
-  /// 'int X[static restrict 4]'. For function parameters only.
-  unsigned IndexTypeQuals : 3;
+  // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum
+  enum { SizeModifierMask = 0x18, SizeModifierOffset = 3 };
 
 protected:
   // C++ [temp.dep.type]p1:
@@ -1482,7 +1513,9 @@
             ArraySizeModifier sm, unsigned tq)
     : Type(tc, can, et->isDependentType() || tc == DependentSizedArray,
            (tc == VariableArray || et->isVariablyModifiedType())),
-      ElementType(et), SizeModifier(sm), IndexTypeQuals(tq) {}
+      ElementType(et) {
+    SubclassBits = tq | (static_cast<unsigned>(sm) << SizeModifierOffset);
+  }
 
   friend class ASTContext;  // ASTContext creates these.
 
@@ -1491,12 +1524,14 @@
 public:
   QualType getElementType() const { return ElementType; }
   ArraySizeModifier getSizeModifier() const {
-    return ArraySizeModifier(SizeModifier);
+    return ArraySizeModifier(SubclassBits >> SizeModifierOffset);
   }
   Qualifiers getIndexTypeQualifiers() const {
-    return Qualifiers::fromCVRMask(IndexTypeQuals);
+    return Qualifiers::fromCVRMask(getIndexTypeCVRQualifiers());
+  }
+  unsigned getIndexTypeCVRQualifiers() const {
+    return SubclassBits & IndexTypeQualsMask;
   }
-  unsigned getIndexTypeCVRQualifiers() const { return IndexTypeQuals; }
 
   static bool classof(const Type *T) {
     return T->getTypeClass() == ConstantArray ||
@@ -1770,23 +1805,27 @@
   /// ElementType - The element type of the vector.
   QualType ElementType;
 
-  /// NumElements - The number of elements in the vector.
-  unsigned NumElements;
+  // NumElements - The number of elements in the vector.
+  enum { NumElementsOffset = 2 };
 
-  AltiVecSpecific AltiVecSpec;
+  // AltiVecSpec
+  enum { AltiVecSpecMask = 0x3 };
 
   VectorType(QualType vecType, unsigned nElements, QualType canonType,
       AltiVecSpecific altiVecSpec) :
     Type(Vector, canonType, vecType->isDependentType(),
-         vecType->isVariablyModifiedType()),
-    ElementType(vecType), NumElements(nElements), AltiVecSpec(altiVecSpec) {}
+         vecType->isVariablyModifiedType()), ElementType(vecType) {
+    SubclassBits = (nElements << NumElementsOffset) |
+                   static_cast<unsigned>(altiVecSpec);
+  }
   
   VectorType(TypeClass tc, QualType vecType, unsigned nElements,
              QualType canonType, AltiVecSpecific altiVecSpec)
     : Type(tc, canonType, vecType->isDependentType(),
-           vecType->isVariablyModifiedType()), 
-      ElementType(vecType),
-      NumElements(nElements), AltiVecSpec(altiVecSpec) {}
+           vecType->isVariablyModifiedType()), ElementType(vecType) {
+    SubclassBits = (nElements << NumElementsOffset) |
+                   static_cast<unsigned>(altiVecSpec);
+  }
   friend class ASTContext;  // ASTContext creates these.
   
   virtual std::pair<Linkage, bool> getLinkageUnnamedLocalImpl() const;
@@ -1794,19 +1833,22 @@
 public:
 
   QualType getElementType() const { return ElementType; }
-  unsigned getNumElements() const { return NumElements; }
+  unsigned getNumElements() const { return SubclassBits >> NumElementsOffset; }
 
   bool isSugared() const { return false; }
   QualType desugar() const { return QualType(this, 0); }
 
-  AltiVecSpecific getAltiVecSpecific() const { return AltiVecSpec; }
+  AltiVecSpecific getAltiVecSpecific() const {
+    return AltiVecSpecific(SubclassBits & AltiVecSpecMask);
+  }
 
   void Profile(llvm::FoldingSetNodeID &ID) {
-    Profile(ID, getElementType(), getNumElements(), getTypeClass(), AltiVecSpec);
+    Profile(ID, getElementType(), getNumElements(),
+            getTypeClass(), getAltiVecSpecific());
   }
   static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType,
                       unsigned NumElements, TypeClass TypeClass,
-                      unsigned AltiVecSpec) {
+                      AltiVecSpecific AltiVecSpec) {
     ID.AddPointer(ElementType.getAsOpaquePtr());
     ID.AddInteger(NumElements);
     ID.AddInteger(TypeClass);
@@ -1873,7 +1915,7 @@
 
   bool isAccessorWithinNumElements(char c) const {
     if (int idx = getAccessorIdx(c)+1)
-      return unsigned(idx-1) < NumElements;
+      return unsigned(idx-1) < getNumElements();
     return false;
   }
   bool isSugared() const { return false; }
@@ -1890,10 +1932,23 @@
 ///
 class FunctionType : public Type {
   virtual void ANCHOR(); // Key function for FunctionType.
-  
-  /// SubClassData - This field is owned by the subclass, put here to pack
-  /// tightly with the ivars in Type.
-  bool SubClassData : 1;
+
+  /// CallConv - The calling convention used by the function, as specified via
+  /// __attribute__((cdecl|stdcall|fastcall|thiscall|pascal)).
+  BITFIELD(CallConv, InitialBitfield, 3);
+
+  /// NoReturn - Indicates if the function type has __attribute__((noreturn)).
+  BOOL_BITFIELD(NoReturn, CallConv);
+
+  /// RegParm - How many arguments to pass inreg.
+  /// The value passed to __attribute__((regparm(x)))
+  BITFIELD(RegParm, NoReturn, 3);
+
+  BITFIELD(ExtInfo, InitialBitfield,
+           CallConvWidth + NoReturnWidth + RegParmWidth);
+
+  /// SubclassInfo
+  BOOL_BITFIELD(SubclassInfo, RegParm);
 
   /// TypeQuals - Used only by FunctionProtoType, put here to pack with the
   /// other bitfields.
@@ -1901,17 +1956,7 @@
   ///
   /// C++ 8.3.5p4: The return type, the parameter type list and the
   /// cv-qualifier-seq, [...], are part of the function type.
-  ///
-  unsigned TypeQuals : 3;
-
-  /// NoReturn - Indicates if the function type is attribute noreturn.
-  unsigned NoReturn : 1;
-
-  /// RegParm - How many arguments to pass inreg.
-  unsigned RegParm : 3;
-
-  /// CallConv - The calling convention used by the function.
-  unsigned CallConv : 3;
+  BITFIELD(TypeQuals, SubclassInfo, 3);
 
   // The type returned by the function.
   QualType ResultType;
@@ -1935,73 +1980,86 @@
   // * Codegen
 
   class ExtInfo {
+    /// Laid out the same way as they are on FunctionType.
+    unsigned Bits;
+
+    ExtInfo(unsigned Bits) : Bits(Bits) {}
+
+    friend class FunctionType;
+
    public:
     // Constructor with no defaults. Use this when you know that you
     // have all the elements (when reading an AST file for example).
-    ExtInfo(bool noReturn, unsigned regParm, CallingConv cc) :
-        NoReturn(noReturn), RegParm(regParm), CC(cc) {}
+    ExtInfo(bool noReturn, unsigned regParm, CallingConv cc) {
+      Bits = EncodeCallConv(cc) |
+             EncodeNoReturn(noReturn) |
+             EncodeRegParm(regParm);
+    }
 
     // Constructor with all defaults. Use when for example creating a
     // function know to use defaults.
-    ExtInfo() : NoReturn(false), RegParm(0), CC(CC_Default) {}
+    ExtInfo() : Bits(0) {}
 
-    bool getNoReturn() const { return NoReturn; }
-    unsigned getRegParm() const { return RegParm; }
-    CallingConv getCC() const { return CC; }
-
-    bool operator==(const ExtInfo &Other) const {
-      return getNoReturn() == Other.getNoReturn() &&
-          getRegParm() == Other.getRegParm() &&
-          getCC() == Other.getCC();
+    bool getNoReturn() const { return DecodeNoReturn(Bits); }
+    unsigned getRegParm() const { return DecodeRegParm(Bits); }
+    CallingConv getCC() const { return CallingConv(DecodeCallConv(Bits)); }
+
+    bool operator==(ExtInfo Other) const {
+      return Bits == Other.Bits;
     }
-    bool operator!=(const ExtInfo &Other) const {
-      return !(*this == Other);
+    bool operator!=(ExtInfo Other) const {
+      return Bits != Other.Bits;
     }
 
     // Note that we don't have setters. That is by design, use
     // the following with methods instead of mutating these objects.
 
     ExtInfo withNoReturn(bool noReturn) const {
-      return ExtInfo(noReturn, getRegParm(), getCC());
+      if (noReturn)
+        return ExtInfo(Bits | NoReturnMask);
+      else
+        return ExtInfo(Bits & ~NoReturnMask);
     }
 
     ExtInfo withRegParm(unsigned RegParm) const {
-      return ExtInfo(getNoReturn(), RegParm, getCC());
+      return ExtInfo((Bits & ~RegParmMask) | EncodeRegParm(RegParm));
     }
 
     ExtInfo withCallingConv(CallingConv cc) const {
-      return ExtInfo(getNoReturn(), getRegParm(), cc);
+      return ExtInfo((Bits & ~CallConvMask) | EncodeCallConv(cc));
     }
 
-   private:
-    // True if we have __attribute__((noreturn))
-    bool NoReturn;
-    // The value passed to __attribute__((regparm(x)))
-    unsigned RegParm;
-    // The calling convention as specified via
-    // __attribute__((cdecl|stdcall|fastcall|thiscall|pascal))
-    CallingConv CC;
+    void Profile(llvm::FoldingSetNodeID &ID) {
+      ID.AddInteger(Bits);
+    }
   };
 
 protected:
   FunctionType(TypeClass tc, QualType res, bool SubclassInfo,
                unsigned typeQuals, QualType Canonical, bool Dependent,
-               bool VariablyModified, const ExtInfo &Info)
-    : Type(tc, Canonical, Dependent, VariablyModified),
-      SubClassData(SubclassInfo), TypeQuals(typeQuals),
-      NoReturn(Info.getNoReturn()),
-      RegParm(Info.getRegParm()), CallConv(Info.getCC()), ResultType(res) {}
-  bool getSubClassData() const { return SubClassData; }
-  unsigned getTypeQuals() const { return TypeQuals; }
+               bool VariablyModified, ExtInfo Info)
+    : Type(tc, Canonical, Dependent, VariablyModified), ResultType(res) {
+    SubclassBits = EncodeExtInfo(Info.Bits) |
+                   EncodeSubclassInfo(SubclassInfo) |
+                   EncodeTypeQuals(typeQuals);
+  }
+  bool getSubClassData() const { return DecodeSubclassInfo(SubclassBits); }
+  unsigned getTypeQuals() const { return DecodeTypeQuals(SubclassBits); }
 public:
 
   QualType getResultType() const { return ResultType; }
   
-  unsigned getRegParmType() const { return RegParm; }
-  bool getNoReturnAttr() const { return NoReturn; }
-  CallingConv getCallConv() const { return (CallingConv)CallConv; }
+  unsigned getRegParmType() const {
+    return DecodeRegParm(SubclassBits);
+  }
+  bool getNoReturnAttr() const {
+    return DecodeNoReturn(SubclassBits);
+  }
+  CallingConv getCallConv() const {
+    return static_cast<CallingConv>(DecodeCallConv(SubclassBits));
+  }
   ExtInfo getExtInfo() const {
-    return ExtInfo(NoReturn, RegParm, (CallingConv)CallConv);
+    return ExtInfo(DecodeExtInfo(SubclassBits));
   }
 
   /// \brief Determine the type of an expression that calls a function of
@@ -2022,8 +2080,7 @@
 /// FunctionNoProtoType - Represents a K&R-style 'int foo()' function, which has
 /// no information available about its arguments.
 class FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode {
-  FunctionNoProtoType(QualType Result, QualType Canonical,
-                      const ExtInfo &Info)
+  FunctionNoProtoType(QualType Result, QualType Canonical, ExtInfo Info)
     : FunctionType(FunctionNoProto, Result, false, 0, Canonical,
                    /*Dependent=*/false, Result->isVariablyModifiedType(), 
                    Info) {}
@@ -2042,10 +2099,8 @@
     Profile(ID, getResultType(), getExtInfo());
   }
   static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType,
-                      const ExtInfo &Info) {
-    ID.AddInteger(Info.getCC());
-    ID.AddInteger(Info.getRegParm());
-    ID.AddInteger(Info.getNoReturn());
+                      ExtInfo Info) {
+    Info.Profile(ID);
     ID.AddPointer(ResultType.getAsOpaquePtr());
   }
 
@@ -2141,7 +2196,7 @@
                       bool isVariadic, unsigned TypeQuals,
                       bool hasExceptionSpec, bool anyExceptionSpec,
                       unsigned NumExceptions, exception_iterator Exs,
-                      const ExtInfo &ExtInfo);
+                      ExtInfo ExtInfo);
 };
 
 
@@ -2964,19 +3019,15 @@
 /// with base BuiltinType::ObjCIdType and protocol list [P].  Eventually
 /// this should get its own sugar class to better represent the source.
 class ObjCObjectType : public Type {
-  // Pad the bit count up so that NumProtocols is 2-byte aligned
-  unsigned : BitsRemainingInType - 16;
-
-  /// \brief The number of protocols stored after the
-  /// ObjCObjectPointerType node.
-  ///
-  /// These protocols are those written directly on the type.  If
-  /// protocol qualifiers ever become additive, the iterators will
-  /// get kindof complicated.
-  ///
-  /// In the canonical object type, these are sorted alphabetically
-  /// and uniqued.
-  unsigned NumProtocols : 16;
+  // SubclassBits stores a count of number of protocols stored after
+  // the ObjCObjectPointerType node.
+  //
+  // These protocols are those written directly on the type.  If
+  // protocol qualifiers ever become additive, the iterators will need
+  // to get kindof complicated.
+  //
+  // In the canonical object type, these are sorted alphabetically
+  // and uniqued.
 
   /// Either a BuiltinType or an InterfaceType or sugar for either.
   QualType BaseType;
@@ -2994,8 +3045,9 @@
   enum Nonce_ObjCInterface { Nonce_ObjCInterface };
   ObjCObjectType(enum Nonce_ObjCInterface)
     : Type(ObjCInterface, QualType(), false, false),
-      NumProtocols(0),
-      BaseType(QualType(this_(), 0)) {}
+      BaseType(QualType(this_(), 0)) {
+    SubclassBits = 0;
+  }
 
 protected:
   std::pair<Linkage, bool> getLinkageUnnamedLocalImpl() const; // key function
@@ -3040,7 +3092,7 @@
 
   /// getNumProtocols - Return the number of qualifying protocols in this
   /// interface type, or 0 if there are none.
-  unsigned getNumProtocols() const { return NumProtocols; }
+  unsigned getNumProtocols() const { return SubclassBits; }
 
   /// \brief Fetch a protocol by index.
   ObjCProtocolDecl *getProtocol(unsigned I) const {
@@ -3712,4 +3764,8 @@
 
 }  // end namespace clang
 
+#undef BITFIELD
+#undef InitialBitfieldWidth
+#undef InitialBitfieldOffset
+
 #endif

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=116472&r1=116471&r2=116472&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Oct 13 22:00:17 2010
@@ -982,9 +982,8 @@
 def err_cconv_varargs : Error<
   "variadic function cannot use %0 calling convention">;
 def err_regparm_mismatch : Error<"function declared with with regparm(%0) "
-  "attribute was previously declared %plural{0:without the regparm|1:"
-  "with the regparm(1)|2:with the regparm(2)|3:with the regparm(3)|:with the"
-  "regparm}1 attribute">;
+  "attribute was previously declared "
+  "%plural{0:without the regparm|:with the regparm(%1)}1 attribute">;
 def warn_label_attribute_not_unused : Warning<
   "The only valid attribute for labels is 'unused'">;
 

Modified: cfe/trunk/lib/AST/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=116472&r1=116471&r2=116472&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Type.cpp (original)
+++ cfe/trunk/lib/AST/Type.cpp Wed Oct 13 22:00:17 2010
@@ -311,9 +311,9 @@
                                ObjCProtocolDecl * const *Protocols,
                                unsigned NumProtocols)
   : Type(ObjCObject, Canonical, false, false),
-    NumProtocols(NumProtocols),
     BaseType(Base) {
-  assert(this->NumProtocols == NumProtocols &&
+  SubclassBits = NumProtocols;
+  assert(getNumProtocols() == NumProtocols &&
          "bitfield overflow in protocol count");
   if (NumProtocols)
     memcpy(getProtocolStorage(), Protocols,
@@ -1026,7 +1026,7 @@
                                 unsigned TypeQuals, bool hasExceptionSpec,
                                 bool anyExceptionSpec, unsigned NumExceptions,
                                 exception_iterator Exs,
-                                const FunctionType::ExtInfo &Info) {
+                                FunctionType::ExtInfo Info) {
   ID.AddPointer(Result.getAsOpaquePtr());
   for (unsigned i = 0; i != NumArgs; ++i)
     ID.AddPointer(ArgTys[i].getAsOpaquePtr());
@@ -1038,9 +1038,7 @@
     for (unsigned i = 0; i != NumExceptions; ++i)
       ID.AddPointer(Exs[i].getAsOpaquePtr());
   }
-  ID.AddInteger(Info.getNoReturn());
-  ID.AddInteger(Info.getRegParm());
-  ID.AddInteger(Info.getCC());
+  Info.Profile(ID);
 }
 
 void FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID) {





More information about the cfe-commits mailing list