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