Add special "property reference" CodeGen::LValue type for emitting
Objective-C property references.
 - This handles property references "more correctly" but setters still
   don't work.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55534 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGValue.h b/lib/CodeGen/CGValue.h
index ba4ea0e..bc9a15f 100644
--- a/lib/CodeGen/CGValue.h
+++ b/lib/CodeGen/CGValue.h
@@ -18,6 +18,8 @@
 #include "clang/AST/Type.h"
 
 namespace clang {
+  class ObjCPropertyRefExpr;
+
 namespace CodeGen {
 
 /// RValue - This trivial value class is used to represent the result of an
@@ -95,7 +97,9 @@
     Simple,       // This is a normal l-value, use getAddress().
     VectorElt,    // This is a vector element l-value (V[i]), use getVector*
     BitField,     // This is a bitfield l-value, use getBitfield*.
-    ExtVectorElt  // This is an extended vector subset, use getExtVectorComp
+    ExtVectorElt, // This is an extended vector subset, use getExtVectorComp
+    PropertyRef   // This is an Objective-C property reference, use
+                  // getPropertyRefExpr
   } LVType;
   
   llvm::Value *V;
@@ -113,6 +117,9 @@
       unsigned short Size;
       bool IsSigned;
     } BitfieldData;
+
+    // Obj-C property reference expression
+    const ObjCPropertyRefExpr *PropertyRefExpr;
   };
 
   bool Volatile:1;
@@ -130,7 +137,8 @@
   bool isVectorElt() const { return LVType == VectorElt; }
   bool isBitfield() const { return LVType == BitField; }
   bool isExtVectorElt() const { return LVType == ExtVectorElt; }
-  
+  bool isPropertyRef() const { return LVType == PropertyRef; }
+
   bool isVolatileQualified() const { return Volatile; }
   bool isRestrictQualified() const { return Restrict; }
 
@@ -159,6 +167,11 @@
     assert(isBitfield());
     return BitfieldData.IsSigned;
   }
+  // property ref lvalue
+  const ObjCPropertyRefExpr *getPropertyRefExpr() const {
+    assert(isPropertyRef());
+    return PropertyRefExpr;
+  }
 
   static LValue MakeAddr(llvm::Value *V, unsigned Qualifiers) {
     LValue R;
@@ -200,6 +213,15 @@
     SetQualifiers(Qualifiers,R);
     return R;
   }
+
+  static LValue MakePropertyRef(const ObjCPropertyRefExpr *E,
+                                unsigned Qualifiers) {
+    LValue R;
+    R.LVType = PropertyRef;
+    R.PropertyRefExpr = E;
+    SetQualifiers(Qualifiers,R);
+    return R;
+  }
 };
 
 }  // end namespace CodeGen