]> granicus.if.org Git - clang/commitdiff
Added support for objc's gc attribute in ExtQualType.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 17 Feb 2009 20:16:45 +0000 (20:16 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 17 Feb 2009 20:16:45 +0000 (20:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64800 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Type.h
lib/AST/ASTContext.cpp
lib/AST/Type.cpp

index 3ab40d9820dd6d2343f1cfb0e36b541c0048e1e7..f5e13c235c68bb07297c10905b037076948bf274 100644 (file)
@@ -29,6 +29,7 @@ using llvm::dyn_cast_or_null;
 namespace clang {
   class ASTContext;
   class Type;
+  class ObjCGCAttr;
   class TypedefDecl;
   class TemplateDecl;
   class TemplateTypeParmDecl;
@@ -460,29 +461,55 @@ protected:
 /// __strong attributes.
 ///
 class ExtQualType : public Type, public llvm::FoldingSetNode {
+public:
+  enum EQT {
+    EXTNONE = 0x0,
+    ASQUAL  = 0x01,
+    GCQUAL  = 0x10
+  };
+private:
   /// BaseType - This is the underlying type that this qualifies.  All CVR
   /// qualifiers are stored on the QualType that references this type, so we
   /// can't have any here.
   Type *BaseType;
+  unsigned ExtQualTypeKind : 2;
+
   /// Address Space ID - The address space ID this type is qualified with.
   unsigned AddressSpace;
-  ExtQualType(Type *Base, QualType CanonicalPtr, unsigned AddrSpace) :
-    Type(ExtQual, CanonicalPtr, Base->isDependentType()), BaseType(Base), 
-    AddressSpace(AddrSpace) {
+  /// GC __weak/__strong attributes
+  ObjCGCAttr *GCAttr;
+  
+  ExtQualType(Type *Base, QualType CanonicalPtr, unsigned AddrSpace,
+              ObjCGCAttr *gcAttr,
+              unsigned ExtKind) :
+    Type(ExtQual, CanonicalPtr, Base->isDependentType()), BaseType(Base),
+    ExtQualTypeKind(ExtKind), AddressSpace(0), GCAttr(0) {
+      if (ExtKind & ASQUAL)
+        AddressSpace = AddrSpace;
+      if (ExtKind & GCQUAL)
+        GCAttr = gcAttr;
   }
   friend class ASTContext;  // ASTContext creates these.
 public:
   Type *getBaseType() const { return BaseType; }
-  unsigned getAddressSpace() const { return AddressSpace; }
+  ObjCGCAttr *getGCAttr() const {
+    assert((ExtQualTypeKind & GCQUAL) && "Bad ExtQualType Kind - not GCQUAL");
+    return GCAttr; 
+  }
+  unsigned getAddressSpace() const {
+    assert((ExtQualTypeKind & ASQUAL) && "Bad ExtQualType Kind - not ASQUAL");
+    return AddressSpace; 
+  }
   
   virtual void getAsStringInternal(std::string &InnerString) const;
   
   void Profile(llvm::FoldingSetNodeID &ID) {
-    Profile(ID, getBaseType(), AddressSpace);
+    Profile(ID, getBaseType(), AddressSpace, GCAttr);
   }
   static void Profile(llvm::FoldingSetNodeID &ID, Type *Base, 
-                      unsigned AddrSpace) {
+                      unsigned AddrSpace, ObjCGCAttr *gcAttr) {
     ID.AddPointer(Base);
+    ID.AddPointer(gcAttr);
     ID.AddInteger(AddrSpace);
   }
   
index 32a6c7d4c6a19233b9251aae804b1eeaefeb4827..dec73182b81ea7d700cba5d8a96b354d1b072f41 100644 (file)
@@ -725,7 +725,7 @@ QualType ASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) {
   // Check if we've already instantiated an address space qual'd type of this
   // type.
   llvm::FoldingSetNodeID ID;
-  ExtQualType::Profile(ID, T.getTypePtr(), AddressSpace);      
+  ExtQualType::Profile(ID, T.getTypePtr(), AddressSpace, 0);      
   void *InsertPos = 0;
   if (ExtQualType *EXTQy = ExtQualTypes.FindNodeOrInsertPos(ID, InsertPos))
     return QualType(EXTQy, 0);
@@ -741,7 +741,8 @@ QualType ASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) {
     assert(NewIP == 0 && "Shouldn't be in the map!"); NewIP = NewIP;
   }
   ExtQualType *New = new (*this, 8) ExtQualType(T.getTypePtr(), Canonical, 
-                                                AddressSpace);
+                                                AddressSpace, 0, 
+                                                ExtQualType::ASQUAL);
   ExtQualTypes.InsertNode(New, InsertPos);
   Types.push_back(New);
   return QualType(New, T.getCVRQualifiers());
index 0edc6ee7f73a3458f6e3fb153b6c204eda4a70d4..6aec24fddddd8d3c5514dcc5b9065030ed209680 100644 (file)
@@ -1053,7 +1053,23 @@ void ComplexType::getAsStringInternal(std::string &S) const {
 }
 
 void ExtQualType::getAsStringInternal(std::string &S) const {
-  S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S;
+  bool space = false;
+  if (ExtQualTypeKind & ASQUAL) {
+    S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S;
+    space = true;
+  }
+  if (ExtQualTypeKind & GCQUAL) {
+    if (space)
+      S += ' ';
+    S += "__attribute__((objc_gc(";
+    ObjCGCAttr *gcattr = getGCAttr();
+    ObjCGCAttr::GCAttrTypes attr = gcattr->getType();
+    if (attr & ObjCGCAttr::Weak)
+      S += "weak";
+    else
+      S += "strong";
+    S += ")))";
+  }
   BaseType->getAsStringInternal(S);
 }