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