CGValue.h revision 6da2c716017d5c8530ec99779524491ebc5dadb8
12311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com//===-- CGValue.h - LLVM CodeGen wrappers for llvm::Value* ------*- C++ -*-===//
22311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com//
32311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com//                     The LLVM Compiler Infrastructure
42311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com//
52311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com// This file is distributed under the University of Illinois Open Source
62311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com// License. See LICENSE.TXT for details.
72311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com//
82311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com//===----------------------------------------------------------------------===//
92311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com//
102311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com// These classes implement wrappers around llvm::Value in order to
112311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com// fully represent the range of values for C L- and R- values.
122311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com//
132311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com//===----------------------------------------------------------------------===//
142311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
152311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com#ifndef CLANG_CODEGEN_CGVALUE_H
162311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com#define CLANG_CODEGEN_CGVALUE_H
172311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
182311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com#include "clang/AST/ASTContext.h"
192311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com#include "clang/AST/CharUnits.h"
202311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com#include "clang/AST/Type.h"
212311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
222311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.comnamespace llvm {
232311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  class Constant;
242311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  class Value;
252311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com}
262311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
276c44f0fd1d666cedaede84717e4015c25a3eb16dborenet@google.comnamespace clang {
286c44f0fd1d666cedaede84717e4015c25a3eb16dborenet@google.comnamespace CodeGen {
296c44f0fd1d666cedaede84717e4015c25a3eb16dborenet@google.com  class AggValueSlot;
306c44f0fd1d666cedaede84717e4015c25a3eb16dborenet@google.com  class CGBitFieldInfo;
316c44f0fd1d666cedaede84717e4015c25a3eb16dborenet@google.com
326c44f0fd1d666cedaede84717e4015c25a3eb16dborenet@google.com/// RValue - This trivial value class is used to represent the result of an
332311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com/// expression that is evaluated.  It can be one of three things: either a
342311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com/// simple LLVM SSA value, a pair of SSA values for complex numbers, or the
352311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com/// address of an aggregate value in memory.
362311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.comclass RValue {
372311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  enum Flavor { Scalar, Complex, Aggregate };
382311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
392311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // Stores first value and flavor.
402311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::PointerIntPair<llvm::Value *, 2, Flavor> V1;
412311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // Stores second value and volatility.
422311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::PointerIntPair<llvm::Value *, 1, bool> V2;
432311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
442311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.compublic:
452311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isScalar() const { return V1.getInt() == Scalar; }
462311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isComplex() const { return V1.getInt() == Complex; }
473515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com  bool isAggregate() const { return V1.getInt() == Aggregate; }
483515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com
493515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com  bool isVolatileQualified() const { return V2.getInt(); }
502311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
513515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com  /// getScalarVal() - Return the Value* of this scalar value.
523515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com  llvm::Value *getScalarVal() const {
533515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com    assert(isScalar() && "Not a scalar!");
542311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return V1.getPointer();
553515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com  }
563515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com
573515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com  /// getComplexVal - Return the real/imag components of this complex value.
582311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  ///
592311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  std::pair<llvm::Value *, llvm::Value *> getComplexVal() const {
602311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return std::make_pair(V1.getPointer(), V2.getPointer());
612311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
623515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com
632311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// getAggregateAddr() - Return the Value* of the address of the aggregate.
642311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::Value *getAggregateAddr() const {
652311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    assert(isAggregate() && "Not an aggregate!");
662311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return V1.getPointer();
672311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
682311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
692311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  static RValue get(llvm::Value *V) {
702311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    RValue ER;
712311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    ER.V1.setPointer(V);
722311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    ER.V1.setInt(Scalar);
732311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    ER.V2.setInt(false);
742311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return ER;
752311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
762311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  static RValue getComplex(llvm::Value *V1, llvm::Value *V2) {
772311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    RValue ER;
782311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    ER.V1.setPointer(V1);
792311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    ER.V2.setPointer(V2);
802311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    ER.V1.setInt(Complex);
813515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com    ER.V2.setInt(false);
823515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com    return ER;
832311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
842311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  static RValue getComplex(const std::pair<llvm::Value *, llvm::Value *> &C) {
852311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return getComplex(C.first, C.second);
862311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
872311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // FIXME: Aggregate rvalues need to retain information about whether they are
882311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // volatile or not.  Remove default to find all places that probably get this
892311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // wrong.
902311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  static RValue getAggregate(llvm::Value *V, bool Volatile = false) {
912311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    RValue ER;
922311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    ER.V1.setPointer(V);
932311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    ER.V1.setInt(Aggregate);
942311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    ER.V2.setInt(Volatile);
952311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return ER;
962311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
972311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com};
982311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
992311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1002311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com/// LValue - This represents an lvalue references.  Because C/C++ allow
1012311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com/// bitfields, this is not a simple LLVM pointer, it may be a pointer plus a
1022311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com/// bitrange.
1032311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.comclass LValue {
1042311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  enum {
1052311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    Simple,       // This is a normal l-value, use getAddress().
106c27af8426e3647239ca1e662904b938e3fd424bdreed@google.com    VectorElt,    // This is a vector element l-value (V[i]), use getVector*
107c27af8426e3647239ca1e662904b938e3fd424bdreed@google.com    BitField,     // This is a bitfield l-value, use getBitfield*.
108c27af8426e3647239ca1e662904b938e3fd424bdreed@google.com    ExtVectorElt  // This is an extended vector subset, use getExtVectorComp
109c27af8426e3647239ca1e662904b938e3fd424bdreed@google.com  } LVType;
1102311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1112311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::Value *V;
1122311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1132311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  union {
1142311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    // Index into a vector subscript: V[i]
1152311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    llvm::Value *VectorIdx;
1162311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1172311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    // ExtVector element subset: V.xyx
1182311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    llvm::Constant *VectorElts;
1192311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1202311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    // BitField start bit and size
1212311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    const CGBitFieldInfo *BitFieldInfo;
1222311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  };
1232311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1242311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  QualType Type;
1252311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1262311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // 'const' is unused here
1272311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  Qualifiers Quals;
128dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com
1292311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// The alignment to use when accessing this lvalue.
1302311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  unsigned short Alignment;
1312311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1322311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // objective-c's ivar
1332311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool Ivar:1;
1342311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1352311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // objective-c's ivar is an array
1362311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool ObjIsArray:1;
1372311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1382311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // LValue is non-gc'able for any reason, including being a parameter or local
1392311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // variable.
1402311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool NonGC: 1;
1412311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1422311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // Lvalue is a global reference of an objective-c object
1432311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool GlobalObjCRef : 1;
1442311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1452311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // Lvalue is a thread local reference
1462311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool ThreadLocalRef : 1;
1472311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1482311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  Expr *BaseIvarExp;
1492311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1502311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// TBAAInfo - TBAA information to attach to dereferences of this LValue.
151dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com  llvm::MDNode *TBAAInfo;
152dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com
153c27af8426e3647239ca1e662904b938e3fd424bdreed@google.comprivate:
154c2b0bdf43b88038b3c81ad8442b22365dd5fce5dreed@google.com  void Initialize(QualType Type, Qualifiers Quals,
1552311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                  CharUnits Alignment = CharUnits(),
156dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com                  llvm::MDNode *TBAAInfo = 0) {
1572311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    this->Type = Type;
158c27af8426e3647239ca1e662904b938e3fd424bdreed@google.com    this->Quals = Quals;
159c2b0bdf43b88038b3c81ad8442b22365dd5fce5dreed@google.com    this->Alignment = Alignment.getQuantity();
1602311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    assert(this->Alignment == Alignment.getQuantity() &&
1612311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com           "Alignment exceeds allowed max!");
1622311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
163c27af8426e3647239ca1e662904b938e3fd424bdreed@google.com    // Initialize Objective-C flags.
164c2b0bdf43b88038b3c81ad8442b22365dd5fce5dreed@google.com    this->Ivar = this->ObjIsArray = this->NonGC = this->GlobalObjCRef = false;
1652311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    this->ThreadLocalRef = false;
1662311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    this->BaseIvarExp = 0;
1672311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    this->TBAAInfo = TBAAInfo;
1682311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
1692311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1702311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.compublic:
1712311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isSimple() const { return LVType == Simple; }
1722311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isVectorElt() const { return LVType == VectorElt; }
1732311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isBitField() const { return LVType == BitField; }
1742311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isExtVectorElt() const { return LVType == ExtVectorElt; }
1752311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1762311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isVolatileQualified() const { return Quals.hasVolatile(); }
1772311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isRestrictQualified() const { return Quals.hasRestrict(); }
1782311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  unsigned getVRQualifiers() const {
1792311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return Quals.getCVRQualifiers() & ~Qualifiers::Const;
1802311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
1812311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1822311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  QualType getType() const { return Type; }
1832311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1842311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  Qualifiers::ObjCLifetime getObjCLifetime() const {
1852311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return Quals.getObjCLifetime();
1862311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
1872311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
188dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com  bool isObjCIvar() const { return Ivar; }
1892311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setObjCIvar(bool Value) { Ivar = Value; }
1902311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
1912311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isObjCArray() const { return ObjIsArray; }
1922311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setObjCArray(bool Value) { ObjIsArray = Value; }
1932311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
194dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com  bool isNonGC () const { return NonGC; }
195dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com  void setNonGC(bool Value) { NonGC = Value; }
196dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com
1972311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isGlobalObjCRef() const { return GlobalObjCRef; }
1982311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setGlobalObjCRef(bool Value) { GlobalObjCRef = Value; }
1992311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2002311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isThreadLocalRef() const { return ThreadLocalRef; }
2012311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setThreadLocalRef(bool Value) { ThreadLocalRef = Value;}
2022311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2032311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isObjCWeak() const {
2042311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return Quals.getObjCGCAttr() == Qualifiers::Weak;
2059b621b9ed88418cc67296c3492a10cbf26509926bsalomon@google.com  }
2062311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isObjCStrong() const {
2072311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return Quals.getObjCGCAttr() == Qualifiers::Strong;
2082311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
2092311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2102311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isVolatile() const {
2112311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return Quals.hasVolatile();
2122311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
2139b621b9ed88418cc67296c3492a10cbf26509926bsalomon@google.com
2142311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  Expr *getBaseIvarExp() const { return BaseIvarExp; }
2152311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setBaseIvarExp(Expr *V) { BaseIvarExp = V; }
2162311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2172311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::MDNode *getTBAAInfo() const { return TBAAInfo; }
2182311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setTBAAInfo(llvm::MDNode *N) { TBAAInfo = N; }
2192311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2202311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  const Qualifiers &getQuals() const { return Quals; }
2212311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  Qualifiers &getQuals() { return Quals; }
2222311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2232311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  unsigned getAddressSpace() const { return Quals.getAddressSpace(); }
2242311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2252311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  CharUnits getAlignment() const { return CharUnits::fromQuantity(Alignment); }
2262311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setAlignment(CharUnits A) { Alignment = A.getQuantity(); }
2272311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2282311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // simple lvalue
2292311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::Value *getAddress() const { assert(isSimple()); return V; }
2302311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setAddress(llvm::Value *address) {
2312311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    assert(isSimple());
2322311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    V = address;
2332311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
2342311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2352311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // vector elt lvalue
2362311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::Value *getVectorAddr() const { assert(isVectorElt()); return V; }
2372311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::Value *getVectorIdx() const { assert(isVectorElt()); return VectorIdx; }
2382311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2392311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // extended vector elements.
2402311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::Value *getExtVectorAddr() const { assert(isExtVectorElt()); return V; }
2412311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::Constant *getExtVectorElts() const {
2422311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    assert(isExtVectorElt());
2432311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return VectorElts;
2442311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
2452311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2462311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // bitfield lvalue
2472311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::Value *getBitFieldBaseAddr() const {
2482311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    assert(isBitField());
2492311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return V;
2502311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
2512311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  const CGBitFieldInfo &getBitFieldInfo() const {
252dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com    assert(isBitField());
2532311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return *BitFieldInfo;
2542311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
2552311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2562311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  static LValue MakeAddr(llvm::Value *address, QualType type,
2572311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                         CharUnits alignment, ASTContext &Context,
2582311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                         llvm::MDNode *TBAAInfo = 0) {
2592311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    Qualifiers qs = type.getQualifiers();
2602311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    qs.setObjCGCAttr(Context.getObjCGCAttrKind(type));
2612311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2622311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    LValue R;
2632311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.LVType = Simple;
264dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com    R.V = address;
2652311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.Initialize(type, qs, alignment, TBAAInfo);
2662311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return R;
2672311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
2682311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2692311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  static LValue MakeVectorElt(llvm::Value *Vec, llvm::Value *Idx,
2702311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                              QualType type) {
2712311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    LValue R;
2722311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.LVType = VectorElt;
2732311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.V = Vec;
2742311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.VectorIdx = Idx;
2752311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.Initialize(type, type.getQualifiers());
2762311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return R;
2772311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
2782311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
2792311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  static LValue MakeExtVectorElt(llvm::Value *Vec, llvm::Constant *Elts,
2802311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                                 QualType type) {
2812311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    LValue R;
2822311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.LVType = ExtVectorElt;
2832311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.V = Vec;
2842311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.VectorElts = Elts;
2852311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.Initialize(type, type.getQualifiers());
2862311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return R;
2872311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
2882311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
289dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com  /// \brief Create a new object to represent a bit-field access.
2902311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  ///
2912311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// \param BaseValue - The base address of the structure containing the
2922311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// bit-field.
2932311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// \param Info - The information describing how to perform the bit-field
2942311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// access.
2952311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  static LValue MakeBitfield(llvm::Value *BaseValue,
2962311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                             const CGBitFieldInfo &Info,
2972311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                             QualType type) {
2982311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    LValue R;
2992311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.LVType = BitField;
3002311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.V = BaseValue;
3012311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.BitFieldInfo = &Info;
3022311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    R.Initialize(type, type.getQualifiers());
3032311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return R;
3042311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
3052311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
3062311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  RValue asAggregateRValue() const {
3072311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    // FIMXE: Alignment
3082311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return RValue::getAggregate(getAddress(), isVolatileQualified());
3092311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
3102311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com};
3112311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
3122311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com/// An aggregate value slot.
3132311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.comclass AggValueSlot {
3142311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// The address.
3152311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  llvm::Value *Addr;
3162311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
3172311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  // Qualifiers
3182311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  Qualifiers Quals;
3192311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
320dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com  unsigned short Alignment;
3212311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
3222311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// DestructedFlag - This is set to true if some external code is
3232311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// responsible for setting up a destructor for the slot.  Otherwise
3242311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// the code which constructs it should push the appropriate cleanup.
3252311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool DestructedFlag : 1;
3263515569a78b58fbb57f20ec909fffde8f945c19cbsalomon@google.com
3272311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// ObjCGCFlag - This is set to true if writing to the memory in the
328fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// slot might require calling an appropriate Objective-C GC
329223aab74b8f72b08a24f8fe8bdd91a365b14cde6bsalomon@google.com  /// barrier.  The exact interaction here is unnecessarily mysterious.
3302311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool ObjCGCFlag : 1;
331223aab74b8f72b08a24f8fe8bdd91a365b14cde6bsalomon@google.com
3322311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// ZeroedFlag - This is set to true if the memory in the slot is
3332311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// known to be zero before the assignment into it.  This means that
3342311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// zero fields don't need to be set.
3352311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool ZeroedFlag : 1;
3362311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
3372311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// AliasedFlag - This is set to true if the slot might be aliased
3382311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// and it's not undefined behavior to access it through such an
3392311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// alias.  Note that it's always undefined behavior to access a C++
340223aab74b8f72b08a24f8fe8bdd91a365b14cde6bsalomon@google.com  /// object that's under construction through an alias derived from
341fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// outside the construction process.
342fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  ///
343fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// This flag controls whether calls that produce the aggregate
344fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// value may be evaluated directly into the slot, or whether they
345fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// must be evaluated into an unaliased temporary and then memcpy'ed
346fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// over.  Since it's invalid in general to memcpy a non-POD C++
347fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// object, it's important that this flag never be set when
348fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// evaluating an expression which constructs such an object.
349fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  bool AliasedFlag : 1;
350fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com
351fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.compublic:
352fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  enum IsAliased_t { IsNotAliased, IsAliased };
353fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  enum IsDestructed_t { IsNotDestructed, IsDestructed };
354fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  enum IsZeroed_t { IsNotZeroed, IsZeroed };
355fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  enum NeedsGCBarriers_t { DoesNotNeedGCBarriers, NeedsGCBarriers };
356fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com
357fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// ignored - Returns an aggregate value slot indicating that the
358fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  /// aggregate value is being ignored.
359fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  static AggValueSlot ignored() {
360fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com    AggValueSlot AV;
361fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com    AV.Addr = 0;
3622311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    AV.Quals = Qualifiers();
3632311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    AV.DestructedFlag = AV.ObjCGCFlag = AV.ZeroedFlag = AV.AliasedFlag = false;
3642311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return AV;
3652311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
3662311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
3672311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// forAddr - Make a slot for an aggregate value.
3682311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  ///
3692311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// \param quals - The qualifiers that dictate how the slot should
3702311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// be initialied. Only 'volatile' and the Objective-C lifetime
3712311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// qualifiers matter.
3722311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  ///
3732311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  /// \param isDestructed - true if something else is responsible
3742311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  ///   for calling destructors on this object
3754404ba23b98ac00b236f65977876edbe7cba7e57bungeman@google.com  /// \param needsGC - true if the slot is potentially located
3764404ba23b98ac00b236f65977876edbe7cba7e57bungeman@google.com  ///   somewhere that ObjC GC calls should be emitted for
3774404ba23b98ac00b236f65977876edbe7cba7e57bungeman@google.com  static AggValueSlot forAddr(llvm::Value *addr, CharUnits align,
3782311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                              Qualifiers quals,
3792311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                              IsDestructed_t isDestructed,
3802311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                              NeedsGCBarriers_t needsGC,
3811384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com                              IsAliased_t isAliased,
3821384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com                              IsZeroed_t isZeroed = IsNotZeroed) {
3831384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com    AggValueSlot AV;
3841384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com    AV.Addr = addr;
385fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com    AV.Alignment = align.getQuantity();
386fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com    AV.Quals = quals;
3871384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com    AV.DestructedFlag = isDestructed;
3881384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com    AV.ObjCGCFlag = needsGC;
389dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com    AV.ZeroedFlag = isZeroed;
3902311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    AV.AliasedFlag = isAliased;
3911384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com    return AV;
3922311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
3932311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
3942311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  static AggValueSlot forLValue(LValue LV, IsDestructed_t isDestructed,
3952311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                                NeedsGCBarriers_t needsGC,
3962311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                                IsAliased_t isAliased,
3972311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                                IsZeroed_t isZeroed = IsNotZeroed) {
3982311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return forAddr(LV.getAddress(), LV.getAlignment(),
3992311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com                   LV.getQuals(), isDestructed, needsGC, isAliased, isZeroed);
4001384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  }
4012311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
4022311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  IsDestructed_t isExternallyDestructed() const {
4032311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return IsDestructed_t(DestructedFlag);
4042311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
4052311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setExternallyDestructed(bool destructed = true) {
4062311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    DestructedFlag = destructed;
4072311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
4082311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
4092311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  Qualifiers getQualifiers() const { return Quals; }
4102311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
4112311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  bool isVolatile() const {
4122311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return Quals.hasVolatile();
4132311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
4142311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
4152311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  Qualifiers::ObjCLifetime getObjCLifetime() const {
4162311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return Quals.getObjCLifetime();
4172311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  }
4182311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
4192311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  NeedsGCBarriers_t requiresGCollection() const {
4202311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return NeedsGCBarriers_t(ObjCGCFlag);
4211384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  }
4221384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com
4231384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  llvm::Value *getAddr() const {
4241384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com    return Addr;
4251384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  }
4261384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com
4271384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  bool isIgnored() const {
4281384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com    return Addr == 0;
4291384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  }
4301384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com
4311384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  CharUnits getAlignment() const {
4321384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com    return CharUnits::fromQuantity(Alignment);
4331384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  }
4341384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com
435fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  IsAliased_t isPotentiallyAliased() const {
4361384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com    return IsAliased_t(AliasedFlag);
4371384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  }
4381384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com
4391384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  // FIXME: Alignment?
4401384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  RValue asRValue() const {
441fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com    return RValue::getAggregate(getAddr(), isVolatile());
4421384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com  }
4431384bfab5e27e4e0f662b9a544dfd85d0dec58dbbsalomon@google.com
4442311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  void setZeroed(bool V = true) { ZeroedFlag = V; }
4452311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com  IsZeroed_t isZeroed() const {
4462311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com    return IsZeroed_t(ZeroedFlag);
447fccc635b85dd699828c7ea99154892d754772ed1bsalomon@google.com  }
448dfb3e3c0faadabc131ac1532e29ca71667328513rmistry@google.com};
4492311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
4502311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com}  // end namespace CodeGen
4512311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com}  // end namespace clang
4522311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com
4532311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com#endif
4542311dfb56cd7f9746a13538d510821e98712a4a0bsalomon@google.com