164c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner//===--- APValue.cpp - Union class for APFloat/APSInt/Complex -------------===// 264c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner// 364c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner// The LLVM Compiler Infrastructure 464c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner// 564c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner// This file is distributed under the University of Illinois Open Source 664c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner// License. See LICENSE.TXT for details. 764c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner// 864c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner//===----------------------------------------------------------------------===// 964c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner// 1064c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner// This file implements the APValue class. 1164c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner// 1264c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner//===----------------------------------------------------------------------===// 1364c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner 1464c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner#include "clang/AST/APValue.h" 1508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith#include "clang/AST/ASTContext.h" 16a73058324197b7bdfd19307965954f626e26199dKen Dyck#include "clang/AST/CharUnits.h" 1708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith#include "clang/AST/DeclCXX.h" 1808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith#include "clang/AST/Expr.h" 1908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith#include "clang/AST/Type.h" 205b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin#include "clang/Basic/Diagnostic.h" 215b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin#include "llvm/ADT/SmallString.h" 229fe8c74a93ac8e92512615c5f83e7a328b3b0544David Blaikie#include "llvm/Support/ErrorHandling.h" 2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h" 2464c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattnerusing namespace clang; 2564c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner 26a73058324197b7bdfd19307965954f626e26199dKen Dycknamespace { 279a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith struct LVBase { 28e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith llvm::PointerIntPair<APValue::LValueBase, 1, bool> BaseAndIsOnePastTheEnd; 29a73058324197b7bdfd19307965954f626e26199dKen Dyck CharUnits Offset; 309a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith unsigned PathLength; 3183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith unsigned CallIndex; 32a73058324197b7bdfd19307965954f626e26199dKen Dyck }; 33a73058324197b7bdfd19307965954f626e26199dKen Dyck} 34a73058324197b7bdfd19307965954f626e26199dKen Dyck 359a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithstruct APValue::LV : LVBase { 369a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith static const unsigned InlinePathSpace = 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (DataSize - sizeof(LVBase)) / sizeof(LValuePathEntry); 389a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 399a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith /// Path - The sequence of base classes, fields and array indices to follow to 409a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith /// walk from Base to the subobject. When performing GCC-style folding, there 419a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith /// may not be such a path. 429a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith union { 439a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith LValuePathEntry Path[InlinePathSpace]; 449a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith LValuePathEntry *PathPtr; 459a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith }; 469a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 479a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith LV() { PathLength = (unsigned)-1; } 48e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ~LV() { resizePath(0); } 499a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 50e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith void resizePath(unsigned Length) { 51e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Length == PathLength) 52e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return; 53e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (hasPathPtr()) 54e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith delete [] PathPtr; 55e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathLength = Length; 56e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (hasPathPtr()) 57e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathPtr = new LValuePathEntry[Length]; 589a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith } 599a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 609a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith bool hasPath() const { return PathLength != (unsigned)-1; } 619a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith bool hasPathPtr() const { return hasPath() && PathLength > InlinePathSpace; } 629a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 639a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith LValuePathEntry *getPath() { return hasPathPtr() ? PathPtr : Path; } 6438dce9b19c3cc85698fb44ea182f9e7fa0fa4a69Richard Smith const LValuePathEntry *getPath() const { 6538dce9b19c3cc85698fb44ea182f9e7fa0fa4a69Richard Smith return hasPathPtr() ? PathPtr : Path; 6638dce9b19c3cc85698fb44ea182f9e7fa0fa4a69Richard Smith } 679a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith}; 689a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 69e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithnamespace { 70e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith struct MemberPointerBase { 71e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith llvm::PointerIntPair<const ValueDecl*, 1, bool> MemberAndIsDerivedMember; 72e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith unsigned PathLength; 73e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith }; 74e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 75e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 76e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithstruct APValue::MemberPointerData : MemberPointerBase { 77e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith static const unsigned InlinePathSpace = 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (DataSize - sizeof(MemberPointerBase)) / sizeof(const CXXRecordDecl*); 79e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith typedef const CXXRecordDecl *PathElem; 80e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith union { 81e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathElem Path[InlinePathSpace]; 82e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathElem *PathPtr; 83e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith }; 84e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 85e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MemberPointerData() { PathLength = 0; } 86e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ~MemberPointerData() { resizePath(0); } 87e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 88e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith void resizePath(unsigned Length) { 89e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (Length == PathLength) 90e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return; 91e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (hasPathPtr()) 92e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith delete [] PathPtr; 93e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathLength = Length; 94e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith if (hasPathPtr()) 95e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathPtr = new PathElem[Length]; 96e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 97e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 98e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith bool hasPathPtr() const { return PathLength > InlinePathSpace; } 99e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 100e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith PathElem *getPath() { return hasPathPtr() ? PathPtr : Path; } 101e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith const PathElem *getPath() const { 102e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return hasPathPtr() ? PathPtr : Path; 103e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith } 104e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith}; 105e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 106cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith// FIXME: Reduce the malloc traffic here. 107cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 108cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard SmithAPValue::Arr::Arr(unsigned NumElts, unsigned Size) : 109cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Elts(new APValue[NumElts + (NumElts != Size ? 1 : 0)]), 110cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith NumElts(NumElts), ArrSize(Size) {} 111cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard SmithAPValue::Arr::~Arr() { delete [] Elts; } 112cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 113180f47959a066795cc0f409433023af448bb0328Richard SmithAPValue::StructData::StructData(unsigned NumBases, unsigned NumFields) : 114180f47959a066795cc0f409433023af448bb0328Richard Smith Elts(new APValue[NumBases+NumFields]), 115180f47959a066795cc0f409433023af448bb0328Richard Smith NumBases(NumBases), NumFields(NumFields) {} 116180f47959a066795cc0f409433023af448bb0328Richard SmithAPValue::StructData::~StructData() { 117180f47959a066795cc0f409433023af448bb0328Richard Smith delete [] Elts; 118180f47959a066795cc0f409433023af448bb0328Richard Smith} 119180f47959a066795cc0f409433023af448bb0328Richard Smith 1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesAPValue::UnionData::UnionData() : Field(nullptr), Value(new APValue) {} 121180f47959a066795cc0f409433023af448bb0328Richard SmithAPValue::UnionData::~UnionData () { 122180f47959a066795cc0f409433023af448bb0328Richard Smith delete Value; 123180f47959a066795cc0f409433023af448bb0328Richard Smith} 124180f47959a066795cc0f409433023af448bb0328Richard Smith 1250069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard SmithAPValue::APValue(const APValue &RHS) : Kind(Uninitialized) { 1260069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith switch (RHS.getKind()) { 1270069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case Uninitialized: 1280069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1290069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case Int: 1300069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeInt(); 13164c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner setInt(RHS.getInt()); 1320069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1330069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case Float: 1340069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeFloat(); 13564c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner setFloat(RHS.getFloat()); 1360069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1370069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case Vector: 1380069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeVector(); 139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines setVector(((const Vec *)(const char *)RHS.Data.buffer)->Elts, 140cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman RHS.getVectorLength()); 1410069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1420069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case ComplexInt: 1430069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeComplexInt(); 14464c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner setComplexInt(RHS.getComplexIntReal(), RHS.getComplexIntImag()); 1450069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1460069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case ComplexFloat: 1470069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeComplexFloat(); 14864c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner setComplexFloat(RHS.getComplexFloatReal(), RHS.getComplexFloatImag()); 1490069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1500069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case LValue: 1510069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeLValue(); 1529a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith if (RHS.hasLValuePath()) 153e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith setLValue(RHS.getLValueBase(), RHS.getLValueOffset(), RHS.getLValuePath(), 15483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith RHS.isLValueOnePastTheEnd(), RHS.getLValueCallIndex()); 1559a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith else 15683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith setLValue(RHS.getLValueBase(), RHS.getLValueOffset(), NoLValuePath(), 15783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith RHS.getLValueCallIndex()); 1580069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1590069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case Array: 1600069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeArray(RHS.getArrayInitializedElts(), RHS.getArraySize()); 161cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith for (unsigned I = 0, N = RHS.getArrayInitializedElts(); I != N; ++I) 162cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith getArrayInitializedElt(I) = RHS.getArrayInitializedElt(I); 163cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (RHS.hasArrayFiller()) 164cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith getArrayFiller() = RHS.getArrayFiller(); 1650069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1660069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case Struct: 1670069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeStruct(RHS.getStructNumBases(), RHS.getStructNumFields()); 168180f47959a066795cc0f409433023af448bb0328Richard Smith for (unsigned I = 0, N = RHS.getStructNumBases(); I != N; ++I) 169180f47959a066795cc0f409433023af448bb0328Richard Smith getStructBase(I) = RHS.getStructBase(I); 170180f47959a066795cc0f409433023af448bb0328Richard Smith for (unsigned I = 0, N = RHS.getStructNumFields(); I != N; ++I) 171180f47959a066795cc0f409433023af448bb0328Richard Smith getStructField(I) = RHS.getStructField(I); 1720069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1730069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case Union: 1740069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeUnion(); 175180f47959a066795cc0f409433023af448bb0328Richard Smith setUnion(RHS.getUnionField(), RHS.getUnionValue()); 1760069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1770069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case MemberPointer: 1780069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeMemberPointer(RHS.getMemberPointerDecl(), 1790069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith RHS.isMemberPointerToDerivedMember(), 1800069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith RHS.getMemberPointerPath()); 1810069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 1820069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith case AddrLabelDiff: 1830069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith MakeAddrLabelDiff(); 18465639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman setAddrLabelDiff(RHS.getAddrLabelDiffLHS(), RHS.getAddrLabelDiffRHS()); 1850069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith break; 18665639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman } 18764c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner} 18864c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner 1897a8c758868f00b7fbe105ad2b469a289cfc92b6dDaniel Dunbarvoid APValue::DestroyDataAndMakeUninit() { 19064c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner if (Kind == Int) 191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((APSInt*)(char*)Data.buffer)->~APSInt(); 19264c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner else if (Kind == Float) 193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((APFloat*)(char*)Data.buffer)->~APFloat(); 1943d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman else if (Kind == Vector) 195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((Vec*)(char*)Data.buffer)->~Vec(); 19664c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner else if (Kind == ComplexInt) 197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((ComplexAPSInt*)(char*)Data.buffer)->~ComplexAPSInt(); 19864c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner else if (Kind == ComplexFloat) 199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((ComplexAPFloat*)(char*)Data.buffer)->~ComplexAPFloat(); 200cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith else if (Kind == LValue) 201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((LV*)(char*)Data.buffer)->~LV(); 202cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith else if (Kind == Array) 203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((Arr*)(char*)Data.buffer)->~Arr(); 204180f47959a066795cc0f409433023af448bb0328Richard Smith else if (Kind == Struct) 205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((StructData*)(char*)Data.buffer)->~StructData(); 206180f47959a066795cc0f409433023af448bb0328Richard Smith else if (Kind == Union) 207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((UnionData*)(char*)Data.buffer)->~UnionData(); 208e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith else if (Kind == MemberPointer) 209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((MemberPointerData*)(char*)Data.buffer)->~MemberPointerData(); 21065639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman else if (Kind == AddrLabelDiff) 211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((AddrLabelDiffData*)(char*)Data.buffer)->~AddrLabelDiffData(); 2123d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman Kind = Uninitialized; 21364c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner} 21464c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner 215f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimekbool APValue::needsCleanup() const { 216f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek switch (getKind()) { 217f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case Uninitialized: 218f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case AddrLabelDiff: 219f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek return false; 220f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case Struct: 221f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case Union: 222f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case Array: 223f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case Vector: 224f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek return true; 225f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case Int: 226f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek return getInt().needsCleanup(); 227f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case Float: 228f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek return getFloat().needsCleanup(); 229f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case ComplexFloat: 230f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek assert(getComplexFloatImag().needsCleanup() == 231f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek getComplexFloatReal().needsCleanup() && 232f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "In _Complex float types, real and imaginary values always have the " 233f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "same size."); 234f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek return getComplexFloatReal().needsCleanup(); 235f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case ComplexInt: 236f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek assert(getComplexIntImag().needsCleanup() == 237f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek getComplexIntReal().needsCleanup() && 238f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "In _Complex int types, real and imaginary values must have the " 239f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek "same size."); 240f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek return getComplexIntReal().needsCleanup(); 241f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case LValue: 242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return reinterpret_cast<const LV *>(Data.buffer)->hasPathPtr(); 243f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek case MemberPointer: 244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return reinterpret_cast<const MemberPointerData *>(Data.buffer) 245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ->hasPathPtr(); 246f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek } 2478fcb0452235eeecfae8cabd7381e146327a8472eBenjamin Kramer llvm_unreachable("Unknown APValue kind!"); 248f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek} 249f0f353b36f173ea282209070fcdbbedab84c19dbManuel Klimek 2500069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smithvoid APValue::swap(APValue &RHS) { 2510069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith std::swap(Kind, RHS.Kind); 252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char TmpData[DataSize]; 253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines memcpy(TmpData, Data.buffer, DataSize); 254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines memcpy(Data.buffer, RHS.Data.buffer, DataSize); 255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines memcpy(RHS.Data.buffer, TmpData, DataSize); 2560069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith} 2570069b84c2aa7cc39263e85997b7cb1ed0b132ccdRichard Smith 25864c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattnervoid APValue::dump() const { 25908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith dump(llvm::errs()); 26064c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner llvm::errs() << '\n'; 26164c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner} 26264c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner 26364c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattnerstatic double GetApproxValue(const llvm::APFloat &F) { 26464c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner llvm::APFloat V = F; 26564c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner bool ignored; 26664c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven, 26764c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner &ignored); 26864c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner return V.convertToDouble(); 26964c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner} 27064c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner 27108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithvoid APValue::dump(raw_ostream &OS) const { 27264c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner switch (getKind()) { 27364c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner case Uninitialized: 27464c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner OS << "Uninitialized"; 27564c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner return; 27664c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner case Int: 27764c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner OS << "Int: " << getInt(); 27864c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner return; 27964c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner case Float: 28064c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner OS << "Float: " << GetApproxValue(getFloat()); 28164c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner return; 2823d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman case Vector: 28308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith OS << "Vector: "; 28408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getVectorElt(0).dump(OS); 28508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for (unsigned i = 1; i != getVectorLength(); ++i) { 28608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith OS << ", "; 28708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getVectorElt(i).dump(OS); 28808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 2893d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman return; 29064c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner case ComplexInt: 29164c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner OS << "ComplexInt: " << getComplexIntReal() << ", " << getComplexIntImag(); 29264c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner return; 29364c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner case ComplexFloat: 29464c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner OS << "ComplexFloat: " << GetApproxValue(getComplexFloatReal()) 29564c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner << ", " << GetApproxValue(getComplexFloatImag()); 296cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return; 29764c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner case LValue: 29864c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner OS << "LValue: <todo>"; 29964c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner return; 300cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith case Array: 301cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith OS << "Array: "; 302cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith for (unsigned I = 0, N = getArrayInitializedElts(); I != N; ++I) { 30308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getArrayInitializedElt(I).dump(OS); 304cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith if (I != getArraySize() - 1) OS << ", "; 305cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 30608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (hasArrayFiller()) { 30708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith OS << getArraySize() - getArrayInitializedElts() << " x "; 30808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getArrayFiller().dump(OS); 30908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 310cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith return; 311180f47959a066795cc0f409433023af448bb0328Richard Smith case Struct: 312180f47959a066795cc0f409433023af448bb0328Richard Smith OS << "Struct "; 313180f47959a066795cc0f409433023af448bb0328Richard Smith if (unsigned N = getStructNumBases()) { 31408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith OS << " bases: "; 31508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getStructBase(0).dump(OS); 31608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for (unsigned I = 1; I != N; ++I) { 31708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith OS << ", "; 31808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getStructBase(I).dump(OS); 31908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 320180f47959a066795cc0f409433023af448bb0328Richard Smith } 321180f47959a066795cc0f409433023af448bb0328Richard Smith if (unsigned N = getStructNumFields()) { 32208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith OS << " fields: "; 32308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getStructField(0).dump(OS); 32408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for (unsigned I = 1; I != N; ++I) { 32508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith OS << ", "; 32608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getStructField(I).dump(OS); 32708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 328180f47959a066795cc0f409433023af448bb0328Richard Smith } 329180f47959a066795cc0f409433023af448bb0328Richard Smith return; 330180f47959a066795cc0f409433023af448bb0328Richard Smith case Union: 33108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith OS << "Union: "; 33208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getUnionValue().dump(OS); 333180f47959a066795cc0f409433023af448bb0328Richard Smith return; 334e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case MemberPointer: 335e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith OS << "MemberPointer: <todo>"; 336e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return; 33765639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman case AddrLabelDiff: 33865639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman OS << "AddrLabelDiff: <todo>"; 33965639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman return; 34064c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner } 341180f47959a066795cc0f409433023af448bb0328Richard Smith llvm_unreachable("Unknown APValue kind!"); 34264c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner} 34364c34f1c6f613eef02a7b488f8edadbe7a8650a8Chris Lattner 34408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithvoid APValue::printPretty(raw_ostream &Out, ASTContext &Ctx, QualType Ty) const{ 34508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith switch (getKind()) { 3465b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin case APValue::Uninitialized: 34708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "<uninitialized>"; 348180f47959a066795cc0f409433023af448bb0328Richard Smith return; 3495b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin case APValue::Int: 350f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith if (Ty->isBooleanType()) 351f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith Out << (getInt().getBoolValue() ? "true" : "false"); 352f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith else 353f602806965531ee06fd8664b9d7a8912c4af2870Richard Smith Out << getInt(); 354180f47959a066795cc0f409433023af448bb0328Richard Smith return; 3555b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin case APValue::Float: 35608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << GetApproxValue(getFloat()); 357180f47959a066795cc0f409433023af448bb0328Richard Smith return; 35808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith case APValue::Vector: { 35908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << '{'; 36008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith QualType ElemTy = Ty->getAs<VectorType>()->getElementType(); 36108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getVectorElt(0).printPretty(Out, Ctx, ElemTy); 36208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for (unsigned i = 1; i != getVectorLength(); ++i) { 3635b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin Out << ", "; 36408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getVectorElt(i).printPretty(Out, Ctx, ElemTy); 3655b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin } 36608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << '}'; 367180f47959a066795cc0f409433023af448bb0328Richard Smith return; 36808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 3695b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin case APValue::ComplexInt: 37008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << getComplexIntReal() << "+" << getComplexIntImag() << "i"; 371180f47959a066795cc0f409433023af448bb0328Richard Smith return; 3725b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin case APValue::ComplexFloat: 37308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << GetApproxValue(getComplexFloatReal()) << "+" 37408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith << GetApproxValue(getComplexFloatImag()) << "i"; 375180f47959a066795cc0f409433023af448bb0328Richard Smith return; 37608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith case APValue::LValue: { 37708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith LValueBase Base = getLValueBase(); 37808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (!Base) { 37908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "0"; 38008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith return; 38108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 38208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 38308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith bool IsReference = Ty->isReferenceType(); 38408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith QualType InnerTy 38508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith = IsReference ? Ty.getNonReferenceType() : Ty->getPointeeType(); 386f727e1c6cc382c1b5fe23b38ba04df2d4a2f358aDouglas Gregor if (InnerTy.isNull()) 387f727e1c6cc382c1b5fe23b38ba04df2d4a2f358aDouglas Gregor InnerTy = Ty; 38808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 38908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (!hasLValuePath()) { 39008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // No lvalue path: just print the offset. 39108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CharUnits O = getLValueOffset(); 39208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CharUnits S = Ctx.getTypeSizeInChars(InnerTy); 39308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (!O.isZero()) { 39408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (IsReference) 39508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "*("; 39608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (O % S) { 39708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "(char*)"; 39808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith S = CharUnits::One(); 39908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 40008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << '&'; 40108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } else if (!IsReference) 40208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << '&'; 40308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 40408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>()) 40508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << *VD; 406ef8225444452a1486bd721f3285301fe84643b00Stephen Hines else { 407ef8225444452a1486bd721f3285301fe84643b00Stephen Hines assert(Base.get<const Expr *>() != nullptr && 408ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "Expecting non-null Expr"); 4096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Base.get<const Expr*>()->printPretty(Out, nullptr, 4106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Ctx.getPrintingPolicy()); 411ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 412ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 41308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (!O.isZero()) { 41408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << " + " << (O / S); 41508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (IsReference) 41608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << ')'; 41708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 41808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith return; 41908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 42008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 42108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // We have an lvalue path. Print it out nicely. 42208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (!IsReference) 42308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << '&'; 42408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith else if (isLValueOnePastTheEnd()) 42508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "*(&"; 42608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 42708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith QualType ElemTy; 42808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>()) { 42908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << *VD; 43008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith ElemTy = VD->getType(); 43108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } else { 43208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const Expr *E = Base.get<const Expr*>(); 433ef8225444452a1486bd721f3285301fe84643b00Stephen Hines assert(E != nullptr && "Expecting non-null Expr"); 4346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines E->printPretty(Out, nullptr, Ctx.getPrintingPolicy()); 43508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith ElemTy = E->getType(); 43608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 43708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 43808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith ArrayRef<LValuePathEntry> Path = getLValuePath(); 4396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const CXXRecordDecl *CastToBase = nullptr; 44008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for (unsigned I = 0, N = Path.size(); I != N; ++I) { 44108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (ElemTy->getAs<RecordType>()) { 44208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // The lvalue refers to a class type, so the next path entry is a base 44308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // or member. 44408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const Decl *BaseOrMember = 44508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith BaseOrMemberType::getFromOpaqueValue(Path[I].BaseOrMember).getPointer(); 44608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(BaseOrMember)) { 44708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CastToBase = RD; 44808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith ElemTy = Ctx.getRecordType(RD); 44908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } else { 45008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const ValueDecl *VD = cast<ValueDecl>(BaseOrMember); 45108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "."; 45208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (CastToBase) 45308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << *CastToBase << "::"; 45408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << *VD; 45508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith ElemTy = VD->getType(); 45608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 45708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } else { 45808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // The lvalue must refer to an array. 45908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << '[' << Path[I].ArrayIndex << ']'; 46008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith ElemTy = Ctx.getAsArrayType(ElemTy)->getElementType(); 46108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 46208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 46308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 46408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // Handle formatting of one-past-the-end lvalues. 46508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (isLValueOnePastTheEnd()) { 46608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // FIXME: If CastToBase is non-0, we should prefix the output with 46708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // "(CastToBase*)". 46808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << " + 1"; 46908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (IsReference) 47008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << ')'; 47108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 472180f47959a066795cc0f409433023af448bb0328Richard Smith return; 47308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 47408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith case APValue::Array: { 47508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const ArrayType *AT = Ctx.getAsArrayType(Ty); 47608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith QualType ElemTy = AT->getElementType(); 477cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Out << '{'; 47808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (unsigned N = getArrayInitializedElts()) { 47908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getArrayInitializedElt(0).printPretty(Out, Ctx, ElemTy); 48008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for (unsigned I = 1; I != N; ++I) { 48108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << ", "; 48208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (I == 10) { 48308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // Avoid printing out the entire contents of large arrays. 48408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "..."; 48508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith break; 48608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 48708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getArrayInitializedElt(I).printPretty(Out, Ctx, ElemTy); 48808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 489cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith } 490cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Out << '}'; 491180f47959a066795cc0f409433023af448bb0328Richard Smith return; 49208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 49308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith case APValue::Struct: { 494180f47959a066795cc0f409433023af448bb0328Richard Smith Out << '{'; 49508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const RecordDecl *RD = Ty->getAs<RecordType>()->getDecl(); 49608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith bool First = true; 49708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (unsigned N = getStructNumBases()) { 49808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith const CXXRecordDecl *CD = cast<CXXRecordDecl>(RD); 49908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CXXRecordDecl::base_class_const_iterator BI = CD->bases_begin(); 50008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith for (unsigned I = 0; I != N; ++I, ++BI) { 50108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith assert(BI != CD->bases_end()); 50208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (!First) 50308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << ", "; 50408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getStructBase(I).printPretty(Out, Ctx, BI->getType()); 50508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith First = false; 50608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 507180f47959a066795cc0f409433023af448bb0328Richard Smith } 508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *FI : RD->fields()) { 50908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (!First) 51008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << ", "; 511262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie if (FI->isUnnamedBitfield()) continue; 512262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie getStructField(FI->getFieldIndex()). 513262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie printPretty(Out, Ctx, FI->getType()); 51408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith First = false; 515180f47959a066795cc0f409433023af448bb0328Richard Smith } 516180f47959a066795cc0f409433023af448bb0328Richard Smith Out << '}'; 517180f47959a066795cc0f409433023af448bb0328Richard Smith return; 51808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 519180f47959a066795cc0f409433023af448bb0328Richard Smith case APValue::Union: 52008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << '{'; 52108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (const FieldDecl *FD = getUnionField()) { 52208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "." << *FD << " = "; 52308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith getUnionValue().printPretty(Out, Ctx, FD->getType()); 52408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 52508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << '}'; 526180f47959a066795cc0f409433023af448bb0328Richard Smith return; 527e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith case APValue::MemberPointer: 52808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // FIXME: This is not enough to unambiguously identify the member in a 52908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith // multiple-inheritance scenario. 53008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (const ValueDecl *VD = getMemberPointerDecl()) { 53108d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << '&' << *cast<CXXRecordDecl>(VD->getDeclContext()) << "::" << *VD; 53208d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith return; 53308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 53408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith Out << "0"; 535e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return; 53665639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman case APValue::AddrLabelDiff: 53765639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman Out << "&&" << getAddrLabelDiffLHS()->getLabel()->getName(); 53865639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman Out << " - "; 53965639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman Out << "&&" << getAddrLabelDiffRHS()->getLabel()->getName(); 54065639284118d54ddf2e51a05d2ffccda567fe246Eli Friedman return; 5415b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin } 542180f47959a066795cc0f409433023af448bb0328Richard Smith llvm_unreachable("Unknown APValue kind!"); 5435b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin} 5445b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin 54508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smithstd::string APValue::getAsString(ASTContext &Ctx, QualType Ty) const { 54608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith std::string Result; 54708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith llvm::raw_string_ostream Out(Result); 54808d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith printPretty(Out, Ctx, Ty); 549d9ce41e19dfd848a8192c2a7f6f9c5b0f3448076Eli Friedman Out.flush(); 55008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith return Result; 5515b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin} 5525b106a872d66f57522b1cc6d1b67f93704409114Jeffrey Yasskin 5531bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smithconst APValue::LValueBase APValue::getLValueBase() const { 554a73058324197b7bdfd19307965954f626e26199dKen Dyck assert(isLValue() && "Invalid accessor"); 555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ((const LV*)(const void*)Data.buffer)->BaseAndIsOnePastTheEnd.getPointer(); 556e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 557e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 558e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool APValue::isLValueOnePastTheEnd() const { 559e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(isLValue() && "Invalid accessor"); 560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ((const LV*)(const void*)Data.buffer)->BaseAndIsOnePastTheEnd.getInt(); 561a73058324197b7bdfd19307965954f626e26199dKen Dyck} 562a73058324197b7bdfd19307965954f626e26199dKen Dyck 56347a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard SmithCharUnits &APValue::getLValueOffset() { 56447a1eed1cdd36edbefc318f29be6c0f3212b0c41Richard Smith assert(isLValue() && "Invalid accessor"); 565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ((LV*)(void*)Data.buffer)->Offset; 566a73058324197b7bdfd19307965954f626e26199dKen Dyck} 567a73058324197b7bdfd19307965954f626e26199dKen Dyck 5689a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smithbool APValue::hasLValuePath() const { 5699a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith assert(isLValue() && "Invalid accessor"); 570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ((const LV*)(const char*)Data.buffer)->hasPath(); 5719a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith} 5729a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 5739a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard SmithArrayRef<APValue::LValuePathEntry> APValue::getLValuePath() const { 5749a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith assert(isLValue() && hasLValuePath() && "Invalid accessor"); 575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const LV &LVal = *((const LV*)(const char*)Data.buffer); 5769a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith return ArrayRef<LValuePathEntry>(LVal.getPath(), LVal.PathLength); 5779a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith} 5789a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 57983587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithunsigned APValue::getLValueCallIndex() const { 58083587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith assert(isLValue() && "Invalid accessor"); 581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ((const LV*)(const char*)Data.buffer)->CallIndex; 58283587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith} 58383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith 58483587db1bda97f45d2b5a4189e584e2a18be511aRichard Smithvoid APValue::setLValue(LValueBase B, const CharUnits &O, NoLValuePath, 58583587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith unsigned CallIndex) { 5869a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith assert(isLValue() && "Invalid accessor"); 587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LV &LVal = *((LV*)(char*)Data.buffer); 588e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LVal.BaseAndIsOnePastTheEnd.setPointer(B); 589e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LVal.BaseAndIsOnePastTheEnd.setInt(false); 5909a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith LVal.Offset = O; 59183587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith LVal.CallIndex = CallIndex; 592e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LVal.resizePath((unsigned)-1); 5939a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith} 5949a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith 5951bf9a9e6a5bdc0de7939908855dcddf46b661800Richard Smithvoid APValue::setLValue(LValueBase B, const CharUnits &O, 59683587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith ArrayRef<LValuePathEntry> Path, bool IsOnePastTheEnd, 59783587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith unsigned CallIndex) { 598a73058324197b7bdfd19307965954f626e26199dKen Dyck assert(isLValue() && "Invalid accessor"); 599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LV &LVal = *((LV*)(char*)Data.buffer); 600e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LVal.BaseAndIsOnePastTheEnd.setPointer(B); 601e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LVal.BaseAndIsOnePastTheEnd.setInt(IsOnePastTheEnd); 6029a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith LVal.Offset = O; 60383587db1bda97f45d2b5a4189e584e2a18be511aRichard Smith LVal.CallIndex = CallIndex; 604e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith LVal.resizePath(Path.size()); 6059a17a680c74ef661bf3d864029adf7e74d9cb5b8Richard Smith memcpy(LVal.getPath(), Path.data(), Path.size() * sizeof(LValuePathEntry)); 606a73058324197b7bdfd19307965954f626e26199dKen Dyck} 607a73058324197b7bdfd19307965954f626e26199dKen Dyck 608e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithconst ValueDecl *APValue::getMemberPointerDecl() const { 609e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(isMemberPointer() && "Invalid accessor"); 610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const MemberPointerData &MPD = 611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines *((const MemberPointerData *)(const char *)Data.buffer); 612e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return MPD.MemberAndIsDerivedMember.getPointer(); 613e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 614e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 615e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithbool APValue::isMemberPointerToDerivedMember() const { 616e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(isMemberPointer() && "Invalid accessor"); 617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const MemberPointerData &MPD = 618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines *((const MemberPointerData *)(const char *)Data.buffer); 619e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return MPD.MemberAndIsDerivedMember.getInt(); 620e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 621e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 622e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard SmithArrayRef<const CXXRecordDecl*> APValue::getMemberPointerPath() const { 623e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(isMemberPointer() && "Invalid accessor"); 624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const MemberPointerData &MPD = 625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines *((const MemberPointerData *)(const char *)Data.buffer); 626e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith return ArrayRef<const CXXRecordDecl*>(MPD.getPath(), MPD.PathLength); 627e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 628e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 629a73058324197b7bdfd19307965954f626e26199dKen Dyckvoid APValue::MakeLValue() { 630a73058324197b7bdfd19307965954f626e26199dKen Dyck assert(isUninit() && "Bad state change"); 631651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static_assert(sizeof(LV) <= DataSize, "LV too big"); 632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines new ((void*)(char*)Data.buffer) LV(); 633a73058324197b7bdfd19307965954f626e26199dKen Dyck Kind = LValue; 634a73058324197b7bdfd19307965954f626e26199dKen Dyck} 635cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith 636cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smithvoid APValue::MakeArray(unsigned InitElts, unsigned Size) { 637cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith assert(isUninit() && "Bad state change"); 638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines new ((void*)(char*)Data.buffer) Arr(InitElts, Size); 639cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith Kind = Array; 640cc5d4f637cdf83adc174b96d2bfe27cef1cf0f36Richard Smith} 641e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith 642e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smithvoid APValue::MakeMemberPointer(const ValueDecl *Member, bool IsDerivedMember, 643e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith ArrayRef<const CXXRecordDecl*> Path) { 644e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith assert(isUninit() && "Bad state change"); 645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MemberPointerData *MPD = new ((void*)(char*)Data.buffer) MemberPointerData; 646e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith Kind = MemberPointer; 647e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MPD->MemberAndIsDerivedMember.setPointer(Member); 648e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MPD->MemberAndIsDerivedMember.setInt(IsDerivedMember); 649e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith MPD->resizePath(Path.size()); 650e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith memcpy(MPD->getPath(), Path.data(), Path.size()*sizeof(const CXXRecordDecl*)); 651e24f5fc8c763f1b5536b8d70dd510ca959db3a80Richard Smith} 652