]> granicus.if.org Git - clang/commitdiff
Some refactoring and simplificaiotn of objc's gc
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 18 Feb 2009 21:49:28 +0000 (21:49 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 18 Feb 2009 21:49:28 +0000 (21:49 +0000)
ir gen.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64954 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
lib/AST/ASTContext.cpp
lib/CodeGen/CGExpr.cpp

index 76bb01ebe50e63ac9bf172c8ff1f4b17d80b04cc..42b019df06fe9cc8ad2991c9069aaf489773a63b 100644 (file)
@@ -395,6 +395,11 @@ public:
   /// to struct), Interface* (pointer to ObjCInterfaceType) and id<P> (qualified
   /// ID type).
   bool isObjCObjectPointerType(QualType Ty) const;
+
+  /// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
+  /// garbage collection attribute.
+  ///
+  QualType::GCAttrTypes getObjCGCAttrKind(const QualType &Ty) const;
   
   /// isObjCNSObjectType - Return true if this is an NSObject object with
   /// its NSObject attribute set.
index 9198bf71cda20198a08a724a5f55498c2d9f95aa..bd9279fb5005f5fe8917c2f9bd063f92eef802dd 100644 (file)
@@ -2390,6 +2390,22 @@ bool ASTContext::isObjCObjectPointerType(QualType Ty) const {
   return isObjCNSObjectType(Ty);
 }
 
+/// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's
+/// garbage collection attribute.
+///
+QualType::GCAttrTypes ASTContext::getObjCGCAttrKind(const QualType &Ty) const {
+  QualType::GCAttrTypes attr = QualType::GCNone;
+  if (getLangOptions().ObjC1 &&
+      getLangOptions().getGCMode() != LangOptions::NonGC) {
+    attr = Ty.getObjCGCAttr();
+    // Default behavious under objective-c's gc is for objective-c pointers
+    // be treated as though they were declared as __strong.
+    if (attr == QualType::GCNone && isObjCObjectPointerType(Ty))
+      attr = QualType::Strong;
+  }
+  return attr;
+}
+
 //===----------------------------------------------------------------------===//
 //                        Type Compatibility Testing
 //===----------------------------------------------------------------------===//
index ae8d4b433a256e4ab412ee8cd0237449a41c0119..e991c8ec7726674475debf098ba3455bd2ecd496 100644 (file)
@@ -604,22 +604,15 @@ void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
   Builder.CreateStore(Vec, Dst.getExtVectorAddr(), Dst.isVolatileQualified());
 }
 
-/// SetVarDeclObjCAttribute - Set __weak/__strong attributes into the LValue
+/// SetDeclObjCGCAttrInLvalue - Set __weak/__strong attributes into the LValue
 /// object.
-static void SetVarDeclObjCAttribute(ASTContext &Ctx, const Decl *VD
-                                    const QualType &Ty, LValue &LV)
+static void SetDeclObjCGCAttrInLvalue(ASTContext &Ctx, const QualType &Ty
+                                      LValue &LV)
 {
-  if (Ctx.getLangOptions().ObjC1 &&
-      Ctx.getLangOptions().getGCMode() != LangOptions::NonGC) {
-    QualType::GCAttrTypes attr = Ty.getObjCGCAttr();
-    if (attr != QualType::GCNone)
-      LValue::SetObjCType(attr == QualType::Weak, 
-                          attr == QualType::Strong, LV);
-    // Default behavious under objective-c's gc is for objective-c pointers
-    // be treated as though they were declared as __strong.
-    else if (Ctx.isObjCObjectPointerType(Ty))
-      LValue::SetObjCType(false, true, LV);
-  }
+  QualType::GCAttrTypes attr = Ctx.getObjCGCAttrKind(Ty);
+  if (attr != QualType::GCNone)
+    LValue::SetObjCType(attr == QualType::Weak, 
+                        attr == QualType::Strong, LV);
 }
 
 LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
@@ -640,12 +633,12 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
     if (VD->isBlockVarDecl() && 
         (VD->getStorageClass() == VarDecl::Static || 
          VD->getStorageClass() == VarDecl::Extern))
-      SetVarDeclObjCAttribute(getContext(), VD, E->getType(), LV);
+      SetDeclObjCGCAttrInLvalue(getContext(), E->getType(), LV);
     return LV;
   } else if (VD && VD->isFileVarDecl()) {
     LValue LV = LValue::MakeAddr(CGM.GetAddrOfGlobalVar(VD),
                                  E->getType().getCVRQualifiers());
-    SetVarDeclObjCAttribute(getContext(), VD, E->getType(), LV);
+    SetDeclObjCGCAttrInLvalue(getContext(), E->getType(), LV);
     return LV;
   } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(E->getDecl())) {
     return LValue::MakeAddr(CGM.GetAddrOfFunction(FD),
@@ -1054,7 +1047,7 @@ LValue CodeGenFunction::EmitLValueForIvar(QualType ObjectTy,
                                                         ObjectTy,
                                                         BaseValue, Ivar, Field,
                                                         CVRQualifiers);
-  SetVarDeclObjCAttribute(getContext(), Ivar, Ivar->getType(), LV);
+  SetDeclObjCGCAttrInLvalue(getContext(), Ivar->getType(), LV);
   return LV;
 }