[cfe-commits] r147735 - in /cfe/trunk/lib/CodeGen: CGObjC.cpp CodeGenFunction.h

Fariborz Jahanian fjahanian at apple.com
Sat Jan 7 10:56:22 PST 2012


Author: fjahanian
Date: Sat Jan  7 12:56:22 2012
New Revision: 147735

URL: http://llvm.org/viewvc/llvm-project?rev=147735&view=rev
Log:
objc++: More codegen stuff for atomic properties of c++ objects
with non-trivial copies. // rdar://6137845


Modified:
    cfe/trunk/lib/CodeGen/CGObjC.cpp
    cfe/trunk/lib/CodeGen/CodeGenFunction.h

Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=147735&r1=147734&r2=147735&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Sat Jan  7 12:56:22 2012
@@ -564,12 +564,14 @@
 /// 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 @@
 
 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 @@
 /// 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 @@
 ///
 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 @@
   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;

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=147735&r1=147734&r2=147735&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Sat Jan  7 12:56:22 2012
@@ -1300,7 +1300,8 @@
   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 @@
   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);
 





More information about the cfe-commits mailing list