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