| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 1 | //===-- CGValue.h - LLVM CodeGen wrappers for llvm::Value* ------*- C++ -*-===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // These classes implement wrappers around llvm::Value in order to | 
|  | 11 | // fully represent the range of values for C L- and R- values. | 
|  | 12 | // | 
|  | 13 | //===----------------------------------------------------------------------===// | 
|  | 14 |  | 
|  | 15 | #ifndef CLANG_CODEGEN_CGVALUE_H | 
|  | 16 | #define CLANG_CODEGEN_CGVALUE_H | 
|  | 17 |  | 
|  | 18 | #include "clang/AST/Type.h" | 
|  | 19 |  | 
| Daniel Dunbar | 41cf9de | 2008-09-09 01:06:48 +0000 | [diff] [blame] | 20 | namespace llvm { | 
|  | 21 | class Constant; | 
|  | 22 | class Value; | 
|  | 23 | } | 
|  | 24 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 25 | namespace clang { | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 26 | class ObjCPropertyRefExpr; | 
| Fariborz Jahanian | 9a84665 | 2009-08-20 17:02:02 +0000 | [diff] [blame] | 27 | class ObjCImplicitSetterGetterRefExpr; | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 28 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 29 | namespace CodeGen { | 
|  | 30 |  | 
|  | 31 | /// RValue - This trivial value class is used to represent the result of an | 
|  | 32 | /// expression that is evaluated.  It can be one of three things: either a | 
|  | 33 | /// simple LLVM SSA value, a pair of SSA values for complex numbers, or the | 
|  | 34 | /// address of an aggregate value in memory. | 
|  | 35 | class RValue { | 
|  | 36 | llvm::Value *V1, *V2; | 
|  | 37 | // TODO: Encode this into the low bit of pointer for more efficient | 
|  | 38 | // return-by-value. | 
|  | 39 | enum { Scalar, Complex, Aggregate } Flavor; | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 40 |  | 
| Mike Stump | 93700fc | 2009-05-23 20:21:36 +0000 | [diff] [blame] | 41 | bool Volatile:1; | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 42 | public: | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 43 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 44 | bool isScalar() const { return Flavor == Scalar; } | 
|  | 45 | bool isComplex() const { return Flavor == Complex; } | 
|  | 46 | bool isAggregate() const { return Flavor == Aggregate; } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 47 |  | 
| Mike Stump | 93700fc | 2009-05-23 20:21:36 +0000 | [diff] [blame] | 48 | bool isVolatileQualified() const { return Volatile; } | 
|  | 49 |  | 
| Mike Stump | 462a4aa | 2009-11-03 16:11:57 +0000 | [diff] [blame] | 50 | /// getScalarVal() - Return the Value* of this scalar value. | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 51 | llvm::Value *getScalarVal() const { | 
|  | 52 | assert(isScalar() && "Not a scalar!"); | 
|  | 53 | return V1; | 
|  | 54 | } | 
|  | 55 |  | 
|  | 56 | /// getComplexVal - Return the real/imag components of this complex value. | 
|  | 57 | /// | 
|  | 58 | std::pair<llvm::Value *, llvm::Value *> getComplexVal() const { | 
|  | 59 | return std::pair<llvm::Value *, llvm::Value *>(V1, V2); | 
|  | 60 | } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 61 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 62 | /// getAggregateAddr() - Return the Value* of the address of the aggregate. | 
|  | 63 | llvm::Value *getAggregateAddr() const { | 
|  | 64 | assert(isAggregate() && "Not an aggregate!"); | 
|  | 65 | return V1; | 
|  | 66 | } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 67 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 68 | static RValue get(llvm::Value *V) { | 
|  | 69 | RValue ER; | 
|  | 70 | ER.V1 = V; | 
|  | 71 | ER.Flavor = Scalar; | 
| Mike Stump | 01c2d0a | 2009-05-28 00:16:27 +0000 | [diff] [blame] | 72 | ER.Volatile = false; | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 73 | return ER; | 
|  | 74 | } | 
|  | 75 | static RValue getComplex(llvm::Value *V1, llvm::Value *V2) { | 
|  | 76 | RValue ER; | 
|  | 77 | ER.V1 = V1; | 
|  | 78 | ER.V2 = V2; | 
|  | 79 | ER.Flavor = Complex; | 
| Mike Stump | 01c2d0a | 2009-05-28 00:16:27 +0000 | [diff] [blame] | 80 | ER.Volatile = false; | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 81 | return ER; | 
|  | 82 | } | 
|  | 83 | static RValue getComplex(const std::pair<llvm::Value *, llvm::Value *> &C) { | 
|  | 84 | RValue ER; | 
|  | 85 | ER.V1 = C.first; | 
|  | 86 | ER.V2 = C.second; | 
|  | 87 | ER.Flavor = Complex; | 
| Mike Stump | 01c2d0a | 2009-05-28 00:16:27 +0000 | [diff] [blame] | 88 | ER.Volatile = false; | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 89 | return ER; | 
|  | 90 | } | 
| Mike Stump | 93700fc | 2009-05-23 20:21:36 +0000 | [diff] [blame] | 91 | // FIXME: Aggregate rvalues need to retain information about whether they are | 
|  | 92 | // volatile or not.  Remove default to find all places that probably get this | 
|  | 93 | // wrong. | 
|  | 94 | static RValue getAggregate(llvm::Value *V, bool Vol = false) { | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 95 | RValue ER; | 
|  | 96 | ER.V1 = V; | 
|  | 97 | ER.Flavor = Aggregate; | 
| Mike Stump | 93700fc | 2009-05-23 20:21:36 +0000 | [diff] [blame] | 98 | ER.Volatile = Vol; | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 99 | return ER; | 
|  | 100 | } | 
|  | 101 | }; | 
|  | 102 |  | 
|  | 103 |  | 
|  | 104 | /// LValue - This represents an lvalue references.  Because C/C++ allow | 
|  | 105 | /// bitfields, this is not a simple LLVM pointer, it may be a pointer plus a | 
|  | 106 | /// bitrange. | 
|  | 107 | class LValue { | 
|  | 108 | // FIXME: alignment? | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 109 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 110 | enum { | 
|  | 111 | Simple,       // This is a normal l-value, use getAddress(). | 
|  | 112 | VectorElt,    // This is a vector element l-value (V[i]), use getVector* | 
|  | 113 | BitField,     // This is a bitfield l-value, use getBitfield*. | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 114 | ExtVectorElt, // This is an extended vector subset, use getExtVectorComp | 
| Fariborz Jahanian | 9ac5351 | 2008-11-22 22:30:21 +0000 | [diff] [blame] | 115 | PropertyRef,  // This is an Objective-C property reference, use | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 116 | // getPropertyRefExpr | 
| Fariborz Jahanian | 9ac5351 | 2008-11-22 22:30:21 +0000 | [diff] [blame] | 117 | KVCRef        // This is an objective-c 'implicit' property ref, | 
|  | 118 | // use getKVCRefExpr | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 119 | } LVType; | 
| Fariborz Jahanian | d7db964 | 2008-11-19 00:59:10 +0000 | [diff] [blame] | 120 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 121 | llvm::Value *V; | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 122 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 123 | union { | 
|  | 124 | // Index into a vector subscript: V[i] | 
|  | 125 | llvm::Value *VectorIdx; | 
|  | 126 |  | 
|  | 127 | // ExtVector element subset: V.xyx | 
|  | 128 | llvm::Constant *VectorElts; | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 129 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 130 | // BitField start bit and size | 
|  | 131 | struct { | 
|  | 132 | unsigned short StartBit; | 
|  | 133 | unsigned short Size; | 
|  | 134 | bool IsSigned; | 
|  | 135 | } BitfieldData; | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 136 |  | 
|  | 137 | // Obj-C property reference expression | 
|  | 138 | const ObjCPropertyRefExpr *PropertyRefExpr; | 
| Fariborz Jahanian | 9ac5351 | 2008-11-22 22:30:21 +0000 | [diff] [blame] | 139 | // ObjC 'implicit' property reference expression | 
| Fariborz Jahanian | 9a84665 | 2009-08-20 17:02:02 +0000 | [diff] [blame] | 140 | const ObjCImplicitSetterGetterRefExpr *KVCRefExpr; | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 141 | }; | 
|  | 142 |  | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 143 | // 'const' is unused here | 
|  | 144 | Qualifiers Quals; | 
| Fariborz Jahanian | d7db964 | 2008-11-19 00:59:10 +0000 | [diff] [blame] | 145 |  | 
| Fariborz Jahanian | 75686a5 | 2008-11-20 20:53:20 +0000 | [diff] [blame] | 146 | // objective-c's ivar | 
|  | 147 | bool Ivar:1; | 
| Fariborz Jahanian | 2e32ddc | 2009-09-18 00:04:00 +0000 | [diff] [blame] | 148 |  | 
|  | 149 | // objective-c's ivar is an array | 
| Fariborz Jahanian | 38c3ae9 | 2009-09-21 18:54:29 +0000 | [diff] [blame] | 150 | bool ObjIsArray:1; | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 151 |  | 
| Fariborz Jahanian | 10bec10 | 2009-02-21 00:30:43 +0000 | [diff] [blame] | 152 | // LValue is non-gc'able for any reason, including being a parameter or local | 
|  | 153 | // variable. | 
|  | 154 | bool NonGC: 1; | 
| Fariborz Jahanian | 75686a5 | 2008-11-20 20:53:20 +0000 | [diff] [blame] | 155 |  | 
| Fariborz Jahanian | 32ff7ae | 2009-05-04 23:27:20 +0000 | [diff] [blame] | 156 | // Lvalue is a global reference of an objective-c object | 
|  | 157 | bool GlobalObjCRef : 1; | 
|  | 158 |  | 
| Fariborz Jahanian | 7a95d72 | 2009-09-24 22:25:38 +0000 | [diff] [blame] | 159 | Expr *BaseIvarExp; | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 160 | private: | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 161 | void SetQualifiers(Qualifiers Quals) { | 
|  | 162 | this->Quals = Quals; | 
|  | 163 |  | 
| Mike Stump | 18bb928 | 2009-05-16 07:57:57 +0000 | [diff] [blame] | 164 | // FIXME: Convenient place to set objc flags to 0. This should really be | 
|  | 165 | // done in a user-defined constructor instead. | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 166 | this->Ivar = this->ObjIsArray = this->NonGC = this->GlobalObjCRef = false; | 
| Fariborz Jahanian | 7a95d72 | 2009-09-24 22:25:38 +0000 | [diff] [blame] | 167 | this->BaseIvarExp = 0; | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 168 | } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 169 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 170 | public: | 
|  | 171 | bool isSimple() const { return LVType == Simple; } | 
|  | 172 | bool isVectorElt() const { return LVType == VectorElt; } | 
|  | 173 | bool isBitfield() const { return LVType == BitField; } | 
|  | 174 | bool isExtVectorElt() const { return LVType == ExtVectorElt; } | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 175 | bool isPropertyRef() const { return LVType == PropertyRef; } | 
| Fariborz Jahanian | 9ac5351 | 2008-11-22 22:30:21 +0000 | [diff] [blame] | 176 | bool isKVCRef() const { return LVType == KVCRef; } | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 177 |  | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 178 | bool isVolatileQualified() const { return Quals.hasVolatile(); } | 
|  | 179 | bool isRestrictQualified() const { return Quals.hasRestrict(); } | 
|  | 180 | unsigned getVRQualifiers() const { | 
|  | 181 | return Quals.getCVRQualifiers() & ~Qualifiers::Const; | 
| Chris Lattner | e084c01 | 2009-02-16 22:25:49 +0000 | [diff] [blame] | 182 | } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 183 |  | 
| Fariborz Jahanian | 75686a5 | 2008-11-20 20:53:20 +0000 | [diff] [blame] | 184 | bool isObjCIvar() const { return Ivar; } | 
| Fariborz Jahanian | 38c3ae9 | 2009-09-21 18:54:29 +0000 | [diff] [blame] | 185 | bool isObjCArray() const { return ObjIsArray; } | 
| Fariborz Jahanian | 10bec10 | 2009-02-21 00:30:43 +0000 | [diff] [blame] | 186 | bool isNonGC () const { return NonGC; } | 
| Fariborz Jahanian | 32ff7ae | 2009-05-04 23:27:20 +0000 | [diff] [blame] | 187 | bool isGlobalObjCRef() const { return GlobalObjCRef; } | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 188 | bool isObjCWeak() const { return Quals.getObjCGCAttr() == Qualifiers::Weak; } | 
|  | 189 | bool isObjCStrong() const { return Quals.getObjCGCAttr() == Qualifiers::Strong; } | 
| Fariborz Jahanian | 7a95d72 | 2009-09-24 22:25:38 +0000 | [diff] [blame] | 190 |  | 
|  | 191 | Expr *getBaseIvarExp() const { return BaseIvarExp; } | 
|  | 192 | void setBaseIvarExp(Expr *V) { BaseIvarExp = V; } | 
| Mon P Wang | acedf77 | 2009-07-22 03:08:17 +0000 | [diff] [blame] | 193 |  | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 194 | unsigned getAddressSpace() const { return Quals.getAddressSpace(); } | 
| Mon P Wang | acedf77 | 2009-07-22 03:08:17 +0000 | [diff] [blame] | 195 |  | 
| Fariborz Jahanian | 735a415 | 2008-11-21 18:14:01 +0000 | [diff] [blame] | 196 | static void SetObjCIvar(LValue& R, bool iValue) { | 
|  | 197 | R.Ivar = iValue; | 
| Fariborz Jahanian | 75686a5 | 2008-11-20 20:53:20 +0000 | [diff] [blame] | 198 | } | 
| Fariborz Jahanian | 38c3ae9 | 2009-09-21 18:54:29 +0000 | [diff] [blame] | 199 | static void SetObjCArray(LValue& R, bool iValue) { | 
|  | 200 | R.ObjIsArray = iValue; | 
| Fariborz Jahanian | 2e32ddc | 2009-09-18 00:04:00 +0000 | [diff] [blame] | 201 | } | 
| Fariborz Jahanian | 32ff7ae | 2009-05-04 23:27:20 +0000 | [diff] [blame] | 202 | static void SetGlobalObjCRef(LValue& R, bool iValue) { | 
|  | 203 | R.GlobalObjCRef = iValue; | 
|  | 204 | } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 205 |  | 
| Fariborz Jahanian | 10bec10 | 2009-02-21 00:30:43 +0000 | [diff] [blame] | 206 | static void SetObjCNonGC(LValue& R, bool iValue) { | 
|  | 207 | R.NonGC = iValue; | 
|  | 208 | } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 209 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 210 | // simple lvalue | 
|  | 211 | llvm::Value *getAddress() const { assert(isSimple()); return V; } | 
|  | 212 | // vector elt lvalue | 
|  | 213 | llvm::Value *getVectorAddr() const { assert(isVectorElt()); return V; } | 
|  | 214 | llvm::Value *getVectorIdx() const { assert(isVectorElt()); return VectorIdx; } | 
|  | 215 | // extended vector elements. | 
|  | 216 | llvm::Value *getExtVectorAddr() const { assert(isExtVectorElt()); return V; } | 
|  | 217 | llvm::Constant *getExtVectorElts() const { | 
|  | 218 | assert(isExtVectorElt()); | 
|  | 219 | return VectorElts; | 
|  | 220 | } | 
|  | 221 | // bitfield lvalue | 
|  | 222 | llvm::Value *getBitfieldAddr() const { assert(isBitfield()); return V; } | 
|  | 223 | unsigned short getBitfieldStartBit() const { | 
|  | 224 | assert(isBitfield()); | 
|  | 225 | return BitfieldData.StartBit; | 
|  | 226 | } | 
|  | 227 | unsigned short getBitfieldSize() const { | 
|  | 228 | assert(isBitfield()); | 
|  | 229 | return BitfieldData.Size; | 
|  | 230 | } | 
|  | 231 | bool isBitfieldSigned() const { | 
|  | 232 | assert(isBitfield()); | 
|  | 233 | return BitfieldData.IsSigned; | 
|  | 234 | } | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 235 | // property ref lvalue | 
|  | 236 | const ObjCPropertyRefExpr *getPropertyRefExpr() const { | 
|  | 237 | assert(isPropertyRef()); | 
|  | 238 | return PropertyRefExpr; | 
|  | 239 | } | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 240 |  | 
| Fariborz Jahanian | 9ac5351 | 2008-11-22 22:30:21 +0000 | [diff] [blame] | 241 | // 'implicit' property ref lvalue | 
| Fariborz Jahanian | 9a84665 | 2009-08-20 17:02:02 +0000 | [diff] [blame] | 242 | const ObjCImplicitSetterGetterRefExpr *getKVCRefExpr() const { | 
| Fariborz Jahanian | 9ac5351 | 2008-11-22 22:30:21 +0000 | [diff] [blame] | 243 | assert(isKVCRef()); | 
|  | 244 | return KVCRefExpr; | 
|  | 245 | } | 
|  | 246 |  | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 247 | static LValue MakeAddr(llvm::Value *V, Qualifiers Quals) { | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 248 | LValue R; | 
|  | 249 | R.LVType = Simple; | 
|  | 250 | R.V = V; | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 251 | R.SetQualifiers(Quals); | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 252 | return R; | 
|  | 253 | } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 254 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 255 | static LValue MakeVectorElt(llvm::Value *Vec, llvm::Value *Idx, | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 256 | unsigned CVR) { | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 257 | LValue R; | 
|  | 258 | R.LVType = VectorElt; | 
|  | 259 | R.V = Vec; | 
|  | 260 | R.VectorIdx = Idx; | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 261 | R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 262 | return R; | 
|  | 263 | } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 264 |  | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 265 | static LValue MakeExtVectorElt(llvm::Value *Vec, llvm::Constant *Elts, | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 266 | unsigned CVR) { | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 267 | LValue R; | 
|  | 268 | R.LVType = ExtVectorElt; | 
|  | 269 | R.V = Vec; | 
|  | 270 | R.VectorElts = Elts; | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 271 | R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 272 | return R; | 
|  | 273 | } | 
|  | 274 |  | 
|  | 275 | static LValue MakeBitfield(llvm::Value *V, unsigned short StartBit, | 
|  | 276 | unsigned short Size, bool IsSigned, | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 277 | unsigned CVR) { | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 278 | LValue R; | 
|  | 279 | R.LVType = BitField; | 
|  | 280 | R.V = V; | 
|  | 281 | R.BitfieldData.StartBit = StartBit; | 
|  | 282 | R.BitfieldData.Size = Size; | 
|  | 283 | R.BitfieldData.IsSigned = IsSigned; | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 284 | R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 285 | return R; | 
|  | 286 | } | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 287 |  | 
| Mike Stump | 18bb928 | 2009-05-16 07:57:57 +0000 | [diff] [blame] | 288 | // FIXME: It is probably bad that we aren't emitting the target when we build | 
|  | 289 | // the lvalue. However, this complicates the code a bit, and I haven't figured | 
|  | 290 | // out how to make it go wrong yet. | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 291 | static LValue MakePropertyRef(const ObjCPropertyRefExpr *E, | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 292 | unsigned CVR) { | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 293 | LValue R; | 
|  | 294 | R.LVType = PropertyRef; | 
|  | 295 | R.PropertyRefExpr = E; | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 296 | R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); | 
| Daniel Dunbar | 9e22c0d | 2008-08-29 08:11:39 +0000 | [diff] [blame] | 297 | return R; | 
|  | 298 | } | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 299 |  | 
|  | 300 | static LValue MakeKVCRef(const ObjCImplicitSetterGetterRefExpr *E, | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 301 | unsigned CVR) { | 
| Fariborz Jahanian | 9ac5351 | 2008-11-22 22:30:21 +0000 | [diff] [blame] | 302 | LValue R; | 
|  | 303 | R.LVType = KVCRef; | 
|  | 304 | R.KVCRefExpr = E; | 
| John McCall | 8ccfcb5 | 2009-09-24 19:53:00 +0000 | [diff] [blame] | 305 | R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); | 
| Fariborz Jahanian | 9ac5351 | 2008-11-22 22:30:21 +0000 | [diff] [blame] | 306 | return R; | 
|  | 307 | } | 
| Daniel Dunbar | d4f616b | 2008-08-23 03:10:25 +0000 | [diff] [blame] | 308 | }; | 
|  | 309 |  | 
|  | 310 | }  // end namespace CodeGen | 
|  | 311 | }  // end namespace clang | 
|  | 312 |  | 
|  | 313 | #endif |