]> granicus.if.org Git - clang/commitdiff
Patch for generation of weak write barriers for objc
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 18 Nov 2008 22:37:34 +0000 (22:37 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 18 Nov 2008 22:37:34 +0000 (22:37 +0000)
__weak objects.

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

lib/CodeGen/CGExpr.cpp
lib/CodeGen/CGObjCGNU.cpp
lib/CodeGen/CGObjCMac.cpp
lib/CodeGen/CGObjCRuntime.h

index d537c9ca8137dc841d20bffac722d40bddf603c3..98a54c6863f59a5d305b3a3452511fb346eda366 100644 (file)
@@ -154,7 +154,7 @@ RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, QualType ExprType) {
   if (LV.isObjcWeak()) {
     // load of a __weak object. 
     llvm::Value *AddrWeakObj = LV.getAddress();
-    llvm::Value *read_weak = CGM.getObjCRuntime().EmitObjCWeakCall(*this, 
+    llvm::Value *read_weak = CGM.getObjCRuntime().EmitObjCWeakRead(*this, 
                                                                    AddrWeakObj);
     return RValue::get(read_weak);
   }
@@ -335,6 +335,14 @@ RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV,
 /// is 'Ty'.
 void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst, 
                                              QualType Ty) {
+  if (Dst.isObjcWeak()) {
+    // load of a __weak object. 
+    llvm::Value *LvalueDst = Dst.getAddress();
+    llvm::Value *src = Src.getScalarVal();
+    CGM.getObjCRuntime().EmitObjCWeakAssign(*this, src, LvalueDst);
+    return;
+  }
+  
   if (!Dst.isSimple()) {
     if (Dst.isVectorElt()) {
       // Read/modify/write the vector, inserting the new element.
index d57710c5e5199bac3967e7c419dcad0b1322b205..91b8587e1afd1596d47ac13eae00bc42c7e54936 100644 (file)
@@ -130,8 +130,10 @@ public:
                              const ObjCAtThrowStmt &S);
   virtual void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
                                     const ObjCAtSynchronizedStmt &S);
-  virtual llvm::Value * EmitObjCWeakCall(CodeGen::CodeGenFunction &CGF,
+  virtual llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
                                          llvm::Value *AddrWeakObj);
+  virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
+                                  llvm::Value *src, llvm::Value *dst);
 };
 } // end anonymous namespace
 
@@ -970,12 +972,18 @@ void CGObjCGNU::EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
   CGF.ErrorUnsupported(&S, "@synchronized statement");
 }
 
-llvm::Value * CGObjCGNU::EmitObjCWeakCall(CodeGen::CodeGenFunction &CGF,
+llvm::Value * CGObjCGNU::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
                                           llvm::Value *AddrWeakObj)
 {
   return 0;
 }
 
+void CGObjCGNU::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
+                                   llvm::Value *src, llvm::Value *dst)
+{
+  return;
+}
+
 CodeGen::CGObjCRuntime *CodeGen::CreateGNUObjCRuntime(CodeGen::CodeGenModule &CGM){
   return new CGObjCGNU(CGM);
 }
index f3cf21eb314bcf1b2dd6cfb14988f60a5647b25a..e6c2650a2e82aa79cbac3970ca17d4520c87550c 100644 (file)
@@ -454,8 +454,10 @@ public:
                              const ObjCAtThrowStmt &S);
   virtual void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
                                     const ObjCAtSynchronizedStmt &S);
-  virtual llvm::Value * EmitObjCWeakCall(CodeGen::CodeGenFunction &CGF,
+  virtual llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
                                          llvm::Value *AddrWeakObj); 
+  virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
+                                  llvm::Value *src, llvm::Value *dst); 
 };
 } // end anonymous namespace
 
@@ -1776,17 +1778,28 @@ void CodeGenFunction::EmitJumpThroughFinally(ObjCEHEntry *E,
   EmitBranch(ExecuteTryExit ? E->FinallyBlock : E->FinallyNoExit);
 }
 
-/// EmitObjCWeakCall - Code gen for loading value of a __weak
+/// EmitObjCWeakRead - Code gen for loading value of a __weak
 /// object: objc_read_weak (id *src)
 ///
-llvm::Value * CGObjCMac::EmitObjCWeakCall(CodeGen::CodeGenFunction &CGF,
+llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
                                           llvm::Value *AddrWeakObj)
 {
   llvm::Value *read_weak = CGF.Builder.CreateCall(ObjCTypes.GcReadWeakFn,
-                                                  AddrWeakObj, "weakobj");
+                                                  AddrWeakObj, "weakread");
   return read_weak;
 }
 
+/// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
+/// objc_assign_weak (id src, id *dst)
+///
+void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
+                                   llvm::Value *src, llvm::Value *dst)
+{
+  CGF.Builder.CreateCall2(ObjCTypes.GcAssignWeakFn,
+                          src, dst, "weakassign");
+  return;
+}
+
 /// EmitSynchronizedStmt - Code gen for @synchronized(expr) stmt;
 /// Effectively generating code for:
 /// objc_sync_enter(expr);
index 37544e47e1bc361e6408f074b7cb40afd5ada7b1..24288b1e4439eb3d0d14e3991d2c7ce2725806f6 100644 (file)
@@ -145,8 +145,10 @@ public:
                              const ObjCAtThrowStmt &S) = 0;
   virtual void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
                                     const ObjCAtSynchronizedStmt &S) = 0;
-  virtual llvm::Value * EmitObjCWeakCall(CodeGen::CodeGenFunction &CGF,
+  virtual llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
                                         llvm::Value *AddrWeakObj) = 0;
+  virtual void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
+                                  llvm::Value *src, llvm::Value *dest) = 0;
 };
 
 /// Creates an instance of an Objective-C runtime class.