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