Kill the KVC l-value kind and calculate the base expression when emitting
the l-value.

llvm-svn: 120884
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp
index 095f0cd..4b2b861 100644
--- a/clang/lib/CodeGen/CGObjC.cpp
+++ b/clang/lib/CodeGen/CGObjC.cpp
@@ -528,8 +528,9 @@
 
 }
 
-RValue CodeGenFunction::EmitObjCPropertyGet(const ObjCPropertyRefExpr *E,
-                                            ReturnValueSlot Return) {
+RValue CodeGenFunction::EmitLoadOfPropertyRefLValue(LValue LV,
+                                                    ReturnValueSlot Return) {
+  const ObjCPropertyRefExpr *E = LV.getPropertyRefExpr();
   QualType ResultType;
   Selector S;
   if (E->isExplicitProperty()) {
@@ -545,14 +546,9 @@
   if (E->isSuperReceiver())
     return EmitObjCSuperPropertyGet(E, S, Return);
 
-  llvm::Value *Receiver;
-  const ObjCInterfaceDecl *ReceiverClass = 0;
-  if (E->isClassReceiver()) {
-    ReceiverClass = E->getClassReceiver();
-    Receiver = CGM.getObjCRuntime().GetClass(Builder, ReceiverClass);
-  } else {
-    Receiver = EmitScalarExpr(E->getBase());
-  }
+  llvm::Value *Receiver = LV.getPropertyRefBaseAddr();
+  const ObjCInterfaceDecl *ReceiverClass
+    = (E->isClassReceiver() ? E->getClassReceiver() : 0);
   return CGM.getObjCRuntime().
              GenerateMessageSend(*this, Return, ResultType, S,
                                  Receiver, CallArgList(), ReceiverClass);
@@ -579,8 +575,9 @@
   return;
 }
 
-void CodeGenFunction::EmitObjCPropertySet(const ObjCPropertyRefExpr *E,
-                                          RValue Src) {
+void CodeGenFunction::EmitStoreThroughPropertyRefLValue(RValue Src,
+                                                        LValue Dst) {
+  const ObjCPropertyRefExpr *E = Dst.getPropertyRefExpr();
   Selector S = E->getSetterSelector();
   QualType ArgType;
   if (E->isImplicitProperty()) {
@@ -596,14 +593,9 @@
     return;
   }
 
-  const ObjCInterfaceDecl *ReceiverClass = 0;
-  llvm::Value *Receiver;
-  if (E->isClassReceiver()) {
-    ReceiverClass = E->getClassReceiver();
-    Receiver = CGM.getObjCRuntime().GetClass(Builder, ReceiverClass);
-  } else {
-    Receiver = EmitScalarExpr(E->getBase());
-  }
+  llvm::Value *Receiver = Dst.getPropertyRefBaseAddr();
+  const ObjCInterfaceDecl *ReceiverClass
+    = (E->isClassReceiver() ? E->getClassReceiver() : 0);
 
   CallArgList Args;
   Args.push_back(std::make_pair(Src, ArgType));