CGValue.h revision 81bf3b35667cb2a241b5157784f28ee9bd3928b2
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 182eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar#include "clang/AST/Type.h" 192eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 2046f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbarnamespace llvm { 2146f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar class Constant; 2246f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar class Value; 2346f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar} 2446f45b9bec4a265ad8400a538e5ec3a5683617f1Daniel Dunbar 252eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarnamespace clang { 2685c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar class ObjCPropertyRefExpr; 2709105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian class ObjCImplicitSetterGetterRefExpr; 2885c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar 292eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarnamespace CodeGen { 30f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar class CGBitFieldInfo; 312eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 322eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// RValue - This trivial value class is used to represent the result of an 332eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// expression that is evaluated. It can be one of three things: either a 342eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// simple LLVM SSA value, a pair of SSA values for complex numbers, or the 352eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// address of an aggregate value in memory. 362eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarclass RValue { 3781bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer enum Flavor { Scalar, Complex, Aggregate }; 381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3981bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer // Stores first value and flavor. 4081bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer llvm::PointerIntPair<llvm::Value *, 2, Flavor> V1; 4181bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer // Stores second value and volatility. 4281bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer llvm::PointerIntPair<llvm::Value *, 1, bool> V2; 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4481bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramerpublic: 4581bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer bool isScalar() const { return V1.getInt() == Scalar; } 4681bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer bool isComplex() const { return V1.getInt() == Complex; } 4781bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer bool isAggregate() const { return V1.getInt() == Aggregate; } 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4981bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer bool isVolatileQualified() const { return V2.getInt(); } 508b3d93a5947981baa1fc21ad3a6e1220aa953e00Mike Stump 51519202d315e3f74f42d8a1dea7b2f23dee1a66f0Mike Stump /// getScalarVal() - Return the Value* of this scalar value. 522eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getScalarVal() const { 532eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar assert(isScalar() && "Not a scalar!"); 5481bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer return V1.getPointer(); 552eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 562eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 572eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar /// getComplexVal - Return the real/imag components of this complex value. 582eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar /// 592eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar std::pair<llvm::Value *, llvm::Value *> getComplexVal() const { 6081bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer return std::make_pair(V1.getPointer(), V2.getPointer()); 612eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 632eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar /// getAggregateAddr() - Return the Value* of the address of the aggregate. 642eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getAggregateAddr() const { 652eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar assert(isAggregate() && "Not an aggregate!"); 6681bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer return V1.getPointer(); 672eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 692eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static RValue get(llvm::Value *V) { 702eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar RValue ER; 7181bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setPointer(V); 7281bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setInt(Scalar); 7381bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V2.setInt(false); 742eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return ER; 752eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 762eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static RValue getComplex(llvm::Value *V1, llvm::Value *V2) { 772eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar RValue ER; 7881bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setPointer(V1); 7981bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V2.setPointer(V2); 8081bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setInt(Complex); 8181bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V2.setInt(false); 822eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return ER; 832eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 842eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static RValue getComplex(const std::pair<llvm::Value *, llvm::Value *> &C) { 8581bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer return getComplex(C.first, C.second); 862eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 878b3d93a5947981baa1fc21ad3a6e1220aa953e00Mike Stump // FIXME: Aggregate rvalues need to retain information about whether they are 888b3d93a5947981baa1fc21ad3a6e1220aa953e00Mike Stump // volatile or not. Remove default to find all places that probably get this 898b3d93a5947981baa1fc21ad3a6e1220aa953e00Mike Stump // wrong. 9081bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer static RValue getAggregate(llvm::Value *V, bool Volatile = false) { 912eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar RValue ER; 9281bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setPointer(V); 9381bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V1.setInt(Aggregate); 9481bf3b35667cb2a241b5157784f28ee9bd3928b2Benjamin Kramer ER.V2.setInt(Volatile); 952eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return ER; 962eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 972eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar}; 982eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 992eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 1002eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// LValue - This represents an lvalue references. Because C/C++ allow 1012eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// bitfields, this is not a simple LLVM pointer, it may be a pointer plus a 1022eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar/// bitrange. 1032eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarclass LValue { 1042eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // FIXME: alignment? 1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1062eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar enum { 1072eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar Simple, // This is a normal l-value, use getAddress(). 1082eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar VectorElt, // This is a vector element l-value (V[i]), use getVector* 1092eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar BitField, // This is a bitfield l-value, use getBitfield*. 11085c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar ExtVectorElt, // This is an extended vector subset, use getExtVectorComp 11143f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian PropertyRef, // This is an Objective-C property reference, use 11285c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar // getPropertyRefExpr 11343f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian KVCRef // This is an objective-c 'implicit' property ref, 11443f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian // use getKVCRefExpr 1152eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } LVType; 11658626500527695865683d1d65053743de8770b60Fariborz Jahanian 1172eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *V; 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1192eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar union { 1202eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // Index into a vector subscript: V[i] 1212eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *VectorIdx; 1222eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 1232eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // ExtVector element subset: V.xyx 1242eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Constant *VectorElts; 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1262eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // BitField start bit and size 127f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar const CGBitFieldInfo *BitFieldInfo; 12885c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar 12985c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar // Obj-C property reference expression 13085c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar const ObjCPropertyRefExpr *PropertyRefExpr; 131f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 13243f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian // ObjC 'implicit' property reference expression 13309105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian const ObjCImplicitSetterGetterRefExpr *KVCRefExpr; 1342eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar }; 1352eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 1360953e767ff7817f97b3ab20896b229891eeff45bJohn McCall // 'const' is unused here 1370953e767ff7817f97b3ab20896b229891eeff45bJohn McCall Qualifiers Quals; 13858626500527695865683d1d65053743de8770b60Fariborz Jahanian 139d1cc8040ea57775e52d23765a9a6c1fa4b75526fFariborz Jahanian // objective-c's ivar 140d1cc8040ea57775e52d23765a9a6c1fa4b75526fFariborz Jahanian bool Ivar:1; 1411c1afc4ed3ec30fc99e172220c8bb74a13b117b0Fariborz Jahanian 1421c1afc4ed3ec30fc99e172220c8bb74a13b117b0Fariborz Jahanian // objective-c's ivar is an array 143fd02ed702e754f8dd0b4c979325ba99c2234f270Fariborz Jahanian bool ObjIsArray:1; 1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1454f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian // LValue is non-gc'able for any reason, including being a parameter or local 1464f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian // variable. 1474f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian bool NonGC: 1; 148d1cc8040ea57775e52d23765a9a6c1fa4b75526fFariborz Jahanian 149bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian // Lvalue is a global reference of an objective-c object 150bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian bool GlobalObjCRef : 1; 151bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian 1526c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian Expr *BaseIvarExp; 1532eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarprivate: 1540953e767ff7817f97b3ab20896b229891eeff45bJohn McCall void SetQualifiers(Qualifiers Quals) { 1550953e767ff7817f97b3ab20896b229891eeff45bJohn McCall this->Quals = Quals; 1560953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 157f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: Convenient place to set objc flags to 0. This should really be 158f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // done in a user-defined constructor instead. 1590953e767ff7817f97b3ab20896b229891eeff45bJohn McCall this->Ivar = this->ObjIsArray = this->NonGC = this->GlobalObjCRef = false; 1606c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian this->BaseIvarExp = 0; 1612eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1632eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbarpublic: 1642eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar bool isSimple() const { return LVType == Simple; } 1652eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar bool isVectorElt() const { return LVType == VectorElt; } 166f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar bool isBitField() const { return LVType == BitField; } 1672eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar bool isExtVectorElt() const { return LVType == ExtVectorElt; } 16885c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar bool isPropertyRef() const { return LVType == PropertyRef; } 16943f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian bool isKVCRef() const { return LVType == KVCRef; } 17085c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar 1710953e767ff7817f97b3ab20896b229891eeff45bJohn McCall bool isVolatileQualified() const { return Quals.hasVolatile(); } 1720953e767ff7817f97b3ab20896b229891eeff45bJohn McCall bool isRestrictQualified() const { return Quals.hasRestrict(); } 1730953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned getVRQualifiers() const { 1740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return Quals.getCVRQualifiers() & ~Qualifiers::Const; 1751bd885efe4bfeadb1980b39315b026cefe2795c3Chris Lattner } 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 177d1cc8040ea57775e52d23765a9a6c1fa4b75526fFariborz Jahanian bool isObjCIvar() const { return Ivar; } 178fd02ed702e754f8dd0b4c979325ba99c2234f270Fariborz Jahanian bool isObjCArray() const { return ObjIsArray; } 1794f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian bool isNonGC () const { return NonGC; } 180bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian bool isGlobalObjCRef() const { return GlobalObjCRef; } 1810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall bool isObjCWeak() const { return Quals.getObjCGCAttr() == Qualifiers::Weak; } 1820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall bool isObjCStrong() const { return Quals.getObjCGCAttr() == Qualifiers::Strong; } 1836c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian 1846c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian Expr *getBaseIvarExp() const { return BaseIvarExp; } 1856c7a1f364796ce1acb988714e9e42076d1ce332eFariborz Jahanian void setBaseIvarExp(Expr *V) { BaseIvarExp = V; } 186c6a38a47bf3908ab2183d7946498138d8b07c886Mon P Wang 1870953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned getAddressSpace() const { return Quals.getAddressSpace(); } 188c6a38a47bf3908ab2183d7946498138d8b07c886Mon P Wang 1892ab1968eb400331ffe47c560583326e4034aed4aFariborz Jahanian static void SetObjCIvar(LValue& R, bool iValue) { 1902ab1968eb400331ffe47c560583326e4034aed4aFariborz Jahanian R.Ivar = iValue; 191d1cc8040ea57775e52d23765a9a6c1fa4b75526fFariborz Jahanian } 192fd02ed702e754f8dd0b4c979325ba99c2234f270Fariborz Jahanian static void SetObjCArray(LValue& R, bool iValue) { 193fd02ed702e754f8dd0b4c979325ba99c2234f270Fariborz Jahanian R.ObjIsArray = iValue; 1941c1afc4ed3ec30fc99e172220c8bb74a13b117b0Fariborz Jahanian } 195bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian static void SetGlobalObjCRef(LValue& R, bool iValue) { 196bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian R.GlobalObjCRef = iValue; 197bf63b87ecf1e62ab8871a81325978377c84e1835Fariborz Jahanian } 1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1994f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian static void SetObjCNonGC(LValue& R, bool iValue) { 2004f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian R.NonGC = iValue; 2014f676edd08bf1f1281b162107424141afe143055Fariborz Jahanian } 2021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2032eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // simple lvalue 2042eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getAddress() const { assert(isSimple()); return V; } 205f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 2062eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // vector elt lvalue 2072eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getVectorAddr() const { assert(isVectorElt()); return V; } 2082eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getVectorIdx() const { assert(isVectorElt()); return VectorIdx; } 209f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 2102eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // extended vector elements. 2112eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Value *getExtVectorAddr() const { assert(isExtVectorElt()); return V; } 2122eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar llvm::Constant *getExtVectorElts() const { 2132eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar assert(isExtVectorElt()); 2142eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return VectorElts; 2152eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 216f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 2172eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar // bitfield lvalue 2187f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar llvm::Value *getBitFieldBaseAddr() const { 219f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar assert(isBitField()); 220f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar return V; 2212eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 222f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar const CGBitFieldInfo &getBitFieldInfo() const { 223f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar assert(isBitField()); 224f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar return *BitFieldInfo; 2252eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 226f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar 22785c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar // property ref lvalue 22885c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar const ObjCPropertyRefExpr *getPropertyRefExpr() const { 22985c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar assert(isPropertyRef()); 23085c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar return PropertyRefExpr; 23185c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar } 2322eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 23343f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian // 'implicit' property ref lvalue 23409105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian const ObjCImplicitSetterGetterRefExpr *getKVCRefExpr() const { 23543f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian assert(isKVCRef()); 23643f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian return KVCRefExpr; 23743f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian } 23843f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian 2390953e767ff7817f97b3ab20896b229891eeff45bJohn McCall static LValue MakeAddr(llvm::Value *V, Qualifiers Quals) { 2402eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar LValue R; 2412eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.LVType = Simple; 2422eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.V = V; 2430953e767ff7817f97b3ab20896b229891eeff45bJohn McCall R.SetQualifiers(Quals); 2442eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return R; 2452eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2472eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static LValue MakeVectorElt(llvm::Value *Vec, llvm::Value *Idx, 2480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned CVR) { 2492eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar LValue R; 2502eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.LVType = VectorElt; 2512eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.V = Vec; 2522eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.VectorIdx = Idx; 2530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); 2542eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return R; 2552eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 2561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2572eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar static LValue MakeExtVectorElt(llvm::Value *Vec, llvm::Constant *Elts, 2580953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned CVR) { 2592eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar LValue R; 2602eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.LVType = ExtVectorElt; 2612eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.V = Vec; 2622eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.VectorElts = Elts; 2630953e767ff7817f97b3ab20896b229891eeff45bJohn McCall R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); 2642eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return R; 2652eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 2662eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 2677f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// \brief Create a new object to represent a bit-field access. 2687f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// 2697f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// \param BaseValue - The base address of the structure containing the 2707f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// bit-field. 2717f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// \param Info - The information describing how to perform the bit-field 2727f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar /// access. 2737f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar static LValue MakeBitfield(llvm::Value *BaseValue, const CGBitFieldInfo &Info, 274efbf487da83883c2da81181cac6f040928aa4289Daniel Dunbar unsigned CVR) { 2752eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar LValue R; 2762eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar R.LVType = BitField; 2777f2896406c8f14bf123578610043a919ba1a1c8aDaniel Dunbar R.V = BaseValue; 278f0fe5bc0e46038dc79cdd27fcf0c77ad4789fdffDaniel Dunbar R.BitFieldInfo = &Info; 2790953e767ff7817f97b3ab20896b229891eeff45bJohn McCall R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); 2802eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar return R; 2812eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar } 28285c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar 283f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // FIXME: It is probably bad that we aren't emitting the target when we build 284f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // the lvalue. However, this complicates the code a bit, and I haven't figured 285f5408fe484495ee4efbdd709c8a2c2fdbbbdb328Mike Stump // out how to make it go wrong yet. 28685c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar static LValue MakePropertyRef(const ObjCPropertyRefExpr *E, 2870953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned CVR) { 28885c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar LValue R; 28985c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar R.LVType = PropertyRef; 29085c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar R.PropertyRefExpr = E; 2910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); 29285c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar return R; 29385c59edda02df48fae8dc85049743319bc6e7e89Daniel Dunbar } 2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static LValue MakeKVCRef(const ObjCImplicitSetterGetterRefExpr *E, 2960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall unsigned CVR) { 29743f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian LValue R; 29843f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian R.LVType = KVCRef; 29943f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian R.KVCRefExpr = E; 3000953e767ff7817f97b3ab20896b229891eeff45bJohn McCall R.SetQualifiers(Qualifiers::fromCVRMask(CVR)); 30143f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian return R; 30243f447098d5e6162fbfb97ed38365284207a7fbeFariborz Jahanian } 3032eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar}; 3042eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 3052eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar} // end namespace CodeGen 3062eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar} // end namespace clang 3072eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar 3082eecaab0fa5f569c3de82a7f04c5dc39298f472dDaniel Dunbar#endif 309