objc++: More codegen stuff for atomic properties of c++ objects
authorFariborz Jahanian <fjahanian@apple.com>
Sat, 7 Jan 2012 18:56:22 +0000 (18:56 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Sat, 7 Jan 2012 18:56:22 +0000 (18:56 +0000)
with non-trivial copies. // rdar://6137845

llvm-svn: 147735

clang/lib/CodeGen/CGObjC.cpp
clang/lib/CodeGen/CodeGenFunction.h

index 0f23a21..1b3eba4 100644 (file)
@@ -564,12 +564,14 @@ PropertyImplStrategy::PropertyImplStrategy(CodeGenModule &CGM,
 /// is illegal within a category.
 void CodeGenFunction::GenerateObjCGetter(ObjCImplementationDecl *IMP,
                                          const ObjCPropertyImplDecl *PID) {
+  llvm::Constant *AtomicHelperFn = 
+    GenerateObjCAtomicCopyHelperFunction(PID, false);
   const ObjCPropertyDecl *PD = PID->getPropertyDecl();
   ObjCMethodDecl *OMD = PD->getGetterMethodDecl();
   assert(OMD && "Invalid call to generate getter (empty method)");
   StartObjCMethod(OMD, IMP->getClassInterface(), PID->getLocStart());
 
-  generateObjCGetterBody(IMP, PID);
+  generateObjCGetterBody(IMP, PID, AtomicHelperFn);
 
   FinishFunction();
 }
@@ -599,7 +601,8 @@ static bool hasTrivialGetExpr(const ObjCPropertyImplDecl *propImpl) {
 
 void
 CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
-                                        const ObjCPropertyImplDecl *propImpl) {
+                                        const ObjCPropertyImplDecl *propImpl,
+                                        llvm::Constant *AtomicHelperFn) {
   // If there's a non-trivial 'get' expression, we just have to emit that.
   if (!hasTrivialGetExpr(propImpl)) {
     ReturnStmt ret(SourceLocation(), propImpl->getGetterCXXConstructor(),
@@ -989,7 +992,8 @@ CodeGenFunction::generateObjCSetterBody(const ObjCImplementationDecl *classImpl,
 /// is illegal within a category.
 void CodeGenFunction::GenerateObjCSetter(ObjCImplementationDecl *IMP,
                                          const ObjCPropertyImplDecl *PID) {
-  llvm::Constant *AtomicHelperFn = GenerateObjCAtomicCopyHelperFunction(PID);
+  llvm::Constant *AtomicHelperFn = 
+    GenerateObjCAtomicCopyHelperFunction(PID, true);
   const ObjCPropertyDecl *PD = PID->getPropertyDecl();
   ObjCMethodDecl *OMD = PD->getSetterMethodDecl();
   assert(OMD && "Invalid call to generate setter (empty method)");
@@ -2533,7 +2537,8 @@ void CodeGenFunction::EmitExtendGCLifetime(llvm::Value *object) {
 ///
 llvm::Constant *
 CodeGenFunction::GenerateObjCAtomicCopyHelperFunction(
-                                        const ObjCPropertyImplDecl *PID) {
+                                        const ObjCPropertyImplDecl *PID,
+                                        bool forSetter) {
   // FIXME. This api is for NeXt runtime only for now.
   if (!getLangOptions().CPlusPlus || !getLangOptions().NeXTRuntime)
     return 0;
@@ -2541,10 +2546,16 @@ CodeGenFunction::GenerateObjCAtomicCopyHelperFunction(
   if (!Ty->isRecordType())
     return 0;
   const ObjCPropertyDecl *PD = PID->getPropertyDecl();
-  if (!(PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_atomic) ||
-      hasTrivialSetExpr(PID) || /* temporary */ true)
+  if ((!(PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_atomic))
+      || /* temporary */ true) 
     return 0;
-  
+  if (forSetter) {
+    if (hasTrivialSetExpr(PID))
+      return 0;
+  }
+  else 
+    if (hasTrivialGetExpr(PID))
+      return 0;
   llvm::Constant * HelperFn = CGM.getAtomicHelperFnMap(Ty);
   if (HelperFn)
     return HelperFn;
index d016bbe..938acd3 100644 (file)
@@ -1300,7 +1300,8 @@ public:
   void GenerateObjCGetter(ObjCImplementationDecl *IMP,
                           const ObjCPropertyImplDecl *PID);
   void generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
-                              const ObjCPropertyImplDecl *propImpl);
+                              const ObjCPropertyImplDecl *propImpl,
+                              llvm::Constant *AtomicHelperFn);
 
   void GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP,
                                   ObjCMethodDecl *MD, bool ctor);
@@ -1335,7 +1336,8 @@ public:
   llvm::Constant *GenerateCopyHelperFunction(const CGBlockInfo &blockInfo);
   llvm::Constant *GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo);
   llvm::Constant *GenerateObjCAtomicCopyHelperFunction(
-                                             const ObjCPropertyImplDecl *PID);
+                                             const ObjCPropertyImplDecl *PID,
+                                             bool forSetter);
 
   void BuildBlockRelease(llvm::Value *DeclPtr, BlockFieldFlags flags);