CGValue.h revision 77c059060f9c8c121d5e8b76957d187223677558
12eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar//===-- CGValue.h - LLVM CodeGen wrappers for llvm::Value* ------*- C++ -*-===// 22eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// 32eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// The LLVM Compiler Infrastructure 42eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// 52eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// This file is distributed under the University of Illinois Open Source 62eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// License. See LICENSE.TXT for details. 72eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// 82eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar//===----------------------------------------------------------------------===// 92eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// 102eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// These classes implement wrappers around llvm::Value in order to 112eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// fully represent the range of values for C L- and R- values. 122eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar// 132eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar//===----------------------------------------------------------------------===// 142eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 152eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar#ifndef CLANG_CODEGEN_CGVALUE_H 162eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar#define CLANG_CODEGEN_CGVALUE_H 172eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 185cf8bfec711116b3c4acc70a00717b2e119e7550Daniel Dunbar#include "clang/AST/ASTContext.h" 192eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar#include "clang/AST/Type.h" 202eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 2146f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbarnamespace llvm { 2246f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar class Constant; 2346f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar class Value; 2446f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar} 2546f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar 262eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarnamespace clang { 2785c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar class ObjCPropertyRefExpr; 2809105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian class ObjCImplicitSetterGetterRefExpr; 2985c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar 302eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarnamespace CodeGen { 31f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar class CGBitFieldInfo; 322eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 332eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// RValue - This trivial value class is used to represent the result of an 342eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// expression that is evaluated. It can be one of three things: either a 352eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// simple LLVM SSA value, a pair of SSA values for complex numbers, or the 362eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// address of an aggregate value in memory. 372eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarclass RValue { 3881bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer enum Flavor { Scalar, Complex, Aggregate }; 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4081bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer // Stores first value and flavor. 4181bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer llvm::PointerIntPair<llvm::Value *, 2, Flavor> V1; 4281bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer // Stores second value and volatility. 4381bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer llvm::PointerIntPair<llvm::Value *, 1, bool> V2; 441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4581bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramerpublic: 4681bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer bool isScalar() const { return V1.getInt() == Scalar; } 4781bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer bool isComplex() const { return V1.getInt() == Complex; } 4881bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer bool isAggregate() const { return V1.getInt() == Aggregate; } 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5081bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer bool isVolatileQualified() const { return V2.getInt(); } 518b3d93a5947981baa1fc21ad3a6e1220aa953e00Mike Stump 52519202d315e3f74f42d8a1dea7b2f23dee1a66f0Mike Stump /// getScalarVal() - Return the Value* of this scalar value. 532eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getScalarVal() const { 542eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar assert(isScalar() && "Not a scalar!"); 5581bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer return V1.getPointer(); 562eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 572eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 582eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar /// getComplexVal - Return the real/imag components of this complex value. 592eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar /// 602eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar std::pair<llvm::Value *, llvm::Value *> getComplexVal() const { 6181bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer return std::make_pair(V1.getPointer(), V2.getPointer()); 622eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 642eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar /// getAggregateAddr() - Return the Value* of the address of the aggregate. 652eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getAggregateAddr() const { 662eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar assert(isAggregate() && "Not an aggregate!"); 6781bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer return V1.getPointer(); 682eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 702eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static RValue get(llvm::Value *V) { 712eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar RValue ER; 7281bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setPointer(V); 7381bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setInt(Scalar); 7481bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V2.setInt(false); 752eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return ER; 762eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 772eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static RValue getComplex(llvm::Value *V1, llvm::Value *V2) { 782eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar RValue ER; 7981bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setPointer(V1); 8081bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V2.setPointer(V2); 8181bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setInt(Complex); 8281bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V2.setInt(false); 832eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return ER; 842eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 852eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static RValue getComplex(const std::pair<llvm::Value *, llvm::Value *> &C) { 8681bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer return getComplex(C.first, C.second); 872eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 888b3d93a5947981baa1fc21ad3a6e1220aa953e00Mike Stump // FIXME: Aggregate rvalues need to retain information about whether they are 898b3d93a5947981baa1fc21ad3a6e1220aa953e00Mike Stump // volatile or not. Remove default to find all places that probably get this 908b3d93a5947981baa1fc21ad3a6e1220aa953e00Mike Stump // wrong. 9181bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer static RValue getAggregate(llvm::Value *V, bool Volatile = false) { 922eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar RValue ER; 9381bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setPointer(V); 9481bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setInt(Aggregate); 9581bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V2.setInt(Volatile); 962eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return ER; 972eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 982eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar}; 992eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 1002eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 1012eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// LValue - This represents an lvalue references. Because C/C++ allow 1022eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// bitfields, this is not a simple LLVM pointer, it may be a pointer plus a 1032eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// bitrange. 1042eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarclass LValue { 1052eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // FIXME: alignment? 1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1072eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar enum { 1082eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar Simple, // This is a normal l-value, use getAddress(). 1092eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar VectorElt, // This is a vector element l-value (V[i]), use getVector* 1102eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar BitField, // This is a bitfield l-value, use getBitfield*. 11185c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar ExtVectorElt, // This is an extended vector subset, use getExtVectorComp 11243f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian PropertyRef, // This is an Objective-C property reference, use 11385c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar // getPropertyRefExpr 11443f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian KVCRef // This is an objective-c 'implicit' property ref, 11543f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian // use getKVCRefExpr 1162eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } LVType; 11758626500527695865683d1d65053743de8770b60Fariborz Jahanian 1182eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *V; 1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1202eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar union { 1212eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // Index into a vector subscript: V[i] 1222eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *VectorIdx; 1232eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 1242eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // ExtVector element subset: V.xyx 1252eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Constant *VectorElts; 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1272eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // BitField start bit and size 128f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar const CGBitFieldInfo *BitFieldInfo; 12985c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar 13085c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar // Obj-C property reference expression 13185c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar const ObjCPropertyRefExpr *PropertyRefExpr; 132f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 13343f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian // ObjC 'implicit' property reference expression 13409105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian const ObjCImplicitSetterGetterRefExpr *KVCRefExpr; 1352eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar }; 1362eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 1370953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // 'const' is unused here 1380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers Quals; 13958626500527695865683d1d65053743de8770b60Fariborz Jahanian 1409f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar /// The alignment to use when accessing this lvalue. 14177c059060f9c8c121d5e8b76957d187223677558Daniel Dunbar unsigned short Alignment; 1429f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar 143d1cc8040ea57775e52d23765a9a6c1fa4b75526fFariborz Jahanian // objective-c's ivar 144d1cc8040ea57775e52d23765a9a6c1fa4b75526fFariborz Jahanian bool Ivar:1; 1451c1afc4ed3ec30fc99e172220c8bb74a13b117b0Fariborz Jahanian 1461c1afc4ed3ec30fc99e172220c8bb74a13b117b0Fariborz Jahanian // objective-c's ivar is an array 147fd02ed702e754f8dd0b4c979325ba99c2234f270Fariborz Jahanian bool ObjIsArray:1; 1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1494f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian // LValue is non-gc'able for any reason, including being a parameter or local 1504f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian // variable. 1514f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian bool NonGC: 1; 152d1cc8040ea57775e52d23765a9a6c1fa4b75526fFariborz Jahanian 153bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian // Lvalue is a global reference of an objective-c object 154bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian bool GlobalObjCRef : 1; 155021a7a63984f0f912dc9e9dae2a1b3e1509a40ceFariborz Jahanian 156021a7a63984f0f912dc9e9dae2a1b3e1509a40ceFariborz Jahanian // Lvalue is a thread local reference 157021a7a63984f0f912dc9e9dae2a1b3e1509a40ceFariborz Jahanian bool ThreadLocalRef : 1; 158bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian 1596c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian Expr *BaseIvarExp; 1602eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarprivate: 1619f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar void Initialize(Qualifiers Quals, unsigned Alignment = 0) { 1620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall this->Quals = Quals; 1639f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar this->Alignment = Alignment; 1649f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar assert(this->Alignment == Alignment && "Alignment exceeds allowed max!"); 1659f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar 1669f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar // Initialize Objective-C flags. 1670953e767ff7817f97b3ab20896b229891eeff45bJohn McCall this->Ivar = this->ObjIsArray = this->NonGC = this->GlobalObjCRef = false; 168021a7a63984f0f912dc9e9dae2a1b3e1509a40ceFariborz Jahanian this->ThreadLocalRef = false; 1696c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian this->BaseIvarExp = 0; 1702eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 1711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1722eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarpublic: 1732eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar bool isSimple() const { return LVType == Simple; } 1742eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar bool isVectorElt() const { return LVType == VectorElt; } 175f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar bool isBitField() const { return LVType == BitField; } 1762eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar bool isExtVectorElt() const { return LVType == ExtVectorElt; } 17785c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar bool isPropertyRef() const { return LVType == PropertyRef; } 17843f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian bool isKVCRef() const { return LVType == KVCRef; } 17985c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar 1800953e767ff7817f97b3ab20896b229891eeff45bJohn McCall bool isVolatileQualified() const { return Quals.hasVolatile(); } 1810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall bool isRestrictQualified() const { return Quals.hasRestrict(); } 1820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned getVRQualifiers() const { 1830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return Quals.getCVRQualifiers() & ~Qualifiers::Const; 1841bd885efe4bfeadb1980b39315b026cefe2795c3Chris Lattner } 1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 186d1cc8040ea57775e52d23765a9a6c1fa4b75526fFariborz Jahanian bool isObjCIvar() const { return Ivar; } 1873491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar void setObjCIvar(bool Value) { Ivar = Value; } 1883491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar 189fd02ed702e754f8dd0b4c979325ba99c2234f270Fariborz Jahanian bool isObjCArray() const { return ObjIsArray; } 1903491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar void setObjCArray(bool Value) { ObjIsArray = Value; } 191ea619177353e0a9f35b7d926a92df0e103515dbeDaniel Dunbar 1924f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian bool isNonGC () const { return NonGC; } 193ea619177353e0a9f35b7d926a92df0e103515dbeDaniel Dunbar void setNonGC(bool Value) { NonGC = Value; } 194ea619177353e0a9f35b7d926a92df0e103515dbeDaniel Dunbar 195bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian bool isGlobalObjCRef() const { return GlobalObjCRef; } 1963491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar void setGlobalObjCRef(bool Value) { GlobalObjCRef = Value; } 1973491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar 198021a7a63984f0f912dc9e9dae2a1b3e1509a40ceFariborz Jahanian bool isThreadLocalRef() const { return ThreadLocalRef; } 1993491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar void setThreadLocalRef(bool Value) { ThreadLocalRef = Value;} 2003491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar 2013491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar bool isObjCWeak() const { 2023491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar return Quals.getObjCGCAttr() == Qualifiers::Weak; 2033491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar } 2043491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar bool isObjCStrong() const { 2053491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar return Quals.getObjCGCAttr() == Qualifiers::Strong; 2063491b3d38b9569ab19f417ed2c3c8a86885345a2Daniel Dunbar } 2076c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian 2086c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian Expr *getBaseIvarExp() const { return BaseIvarExp; } 2096c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian void setBaseIvarExp(Expr *V) { BaseIvarExp = V; } 210c6a38a47bf3908ab2183d7946498138d8b07c886Mon P Wang 21199ad7df957b2dc24df55ceff3e05a07ab5959fbdDaniel Dunbar const Qualifiers &getQuals() const { return Quals; } 21299ad7df957b2dc24df55ceff3e05a07ab5959fbdDaniel Dunbar Qualifiers &getQuals() { return Quals; } 21399ad7df957b2dc24df55ceff3e05a07ab5959fbdDaniel Dunbar 2140953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned getAddressSpace() const { return Quals.getAddressSpace(); } 215c6a38a47bf3908ab2183d7946498138d8b07c886Mon P Wang 2169f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar unsigned getAlignment() const { return Alignment; } 2179f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar 2182eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // simple lvalue 2192eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getAddress() const { assert(isSimple()); return V; } 220f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 2212eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // vector elt lvalue 2222eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getVectorAddr() const { assert(isVectorElt()); return V; } 2232eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getVectorIdx() const { assert(isVectorElt()); return VectorIdx; } 224f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 2252eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // extended vector elements. 2262eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getExtVectorAddr() const { assert(isExtVectorElt()); return V; } 2272eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Constant *getExtVectorElts() const { 2282eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar assert(isExtVectorElt()); 2292eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return VectorElts; 2302eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 231f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 2322eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // bitfield lvalue 2337f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar llvm::Value *getBitFieldBaseAddr() const { 234f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar assert(isBitField()); 235f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar return V; 2362eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 237f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar const CGBitFieldInfo &getBitFieldInfo() const { 238f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar assert(isBitField()); 239f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar return *BitFieldInfo; 2402eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 241f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 24285c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar // property ref lvalue 24385c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar const ObjCPropertyRefExpr *getPropertyRefExpr() const { 24485c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar assert(isPropertyRef()); 24585c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar return PropertyRefExpr; 24685c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar } 2472eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 24843f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian // 'implicit' property ref lvalue 24909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian const ObjCImplicitSetterGetterRefExpr *getKVCRefExpr() const { 25043f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian assert(isKVCRef()); 25143f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian return KVCRefExpr; 25243f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian } 25343f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian 254f1fbda380b200923ea6275c61cd22cc99d4d75c0Daniel Dunbar static LValue MakeAddr(llvm::Value *V, QualType T, unsigned Alignment, 255f1fbda380b200923ea6275c61cd22cc99d4d75c0Daniel Dunbar ASTContext &Context) { 256f1fbda380b200923ea6275c61cd22cc99d4d75c0Daniel Dunbar Qualifiers Quals = Context.getCanonicalType(T).getQualifiers(); 257f1fbda380b200923ea6275c61cd22cc99d4d75c0Daniel Dunbar Quals.setObjCGCAttr(Context.getObjCGCAttrKind(T)); 258f1fbda380b200923ea6275c61cd22cc99d4d75c0Daniel Dunbar 2592eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar LValue R; 2602eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.LVType = Simple; 2612eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.V = V; 2629f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310Daniel Dunbar R.Initialize(Quals, Alignment); 2632eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return R; 2642eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2662eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static LValue MakeVectorElt(llvm::Value *Vec, llvm::Value *Idx, 2670953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned CVR) { 2682eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar LValue R; 2692eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.LVType = VectorElt; 2702eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.V = Vec; 2712eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.VectorIdx = Idx; 272de988818f4960cae954c6727cb1251142a03d750Daniel Dunbar R.Initialize(Qualifiers::fromCVRMask(CVR)); 2732eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return R; 2742eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2762eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static LValue MakeExtVectorElt(llvm::Value *Vec, llvm::Constant *Elts, 2770953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned CVR) { 2782eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar LValue R; 2792eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.LVType = ExtVectorElt; 2802eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.V = Vec; 2812eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.VectorElts = Elts; 282de988818f4960cae954c6727cb1251142a03d750Daniel Dunbar R.Initialize(Qualifiers::fromCVRMask(CVR)); 2832eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return R; 2842eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 2852eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 2867f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// \brief Create a new object to represent a bit-field access. 2877f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// 2887f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// \param BaseValue - The base address of the structure containing the 2897f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// bit-field. 2907f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// \param Info - The information describing how to perform the bit-field 2917f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// access. 2927f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar static LValue MakeBitfield(llvm::Value *BaseValue, const CGBitFieldInfo &Info, 293efbf487da83883c2da81181cac6f040928aa4289Daniel Dunbar unsigned CVR) { 2942eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar LValue R; 2952eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.LVType = BitField; 2967f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar R.V = BaseValue; 297f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar R.BitFieldInfo = &Info; 298de988818f4960cae954c6727cb1251142a03d750Daniel Dunbar R.Initialize(Qualifiers::fromCVRMask(CVR)); 2992eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return R; 3002eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 30185c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar 302f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: It is probably bad that we aren't emitting the target when we build 303f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // the lvalue. However, this complicates the code a bit, and I haven't figured 304f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // out how to make it go wrong yet. 30585c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar static LValue MakePropertyRef(const ObjCPropertyRefExpr *E, 3060953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned CVR) { 30785c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar LValue R; 30885c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar R.LVType = PropertyRef; 30985c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar R.PropertyRefExpr = E; 310de988818f4960cae954c6727cb1251142a03d750Daniel Dunbar R.Initialize(Qualifiers::fromCVRMask(CVR)); 31185c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar return R; 31285c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar } 3131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static LValue MakeKVCRef(const ObjCImplicitSetterGetterRefExpr *E, 3150953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned CVR) { 31643f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian LValue R; 31743f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian R.LVType = KVCRef; 31843f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian R.KVCRefExpr = E; 319de988818f4960cae954c6727cb1251142a03d750Daniel Dunbar R.Initialize(Qualifiers::fromCVRMask(CVR)); 32043f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian return R; 32143f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian } 3222eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar}; 3232eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 3242eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar} // end namespace CodeGen 3252eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar} // end namespace clang 3262eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 3272eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar#endif 328