1 //===--- APValue.cpp - Union class for APFloat/APSInt/Complex -------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the APValue class.
11 //===----------------------------------------------------------------------===//
13 #include "clang/AST/APValue.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/CharUnits.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/Expr.h"
19 #include "clang/AST/ExprCXX.h"
20 #include "clang/AST/Type.h"
21 #include "llvm/Support/ErrorHandling.h"
22 #include "llvm/Support/raw_ostream.h"
23 using namespace clang
;
25 /// The identity of a type_info object depends on the canonical unqualified
27 TypeInfoLValue::TypeInfoLValue(const Type
*T
)
28 : T(T
->getCanonicalTypeUnqualified().getTypePtr()) {}
30 void TypeInfoLValue::print(llvm::raw_ostream
&Out
,
31 const PrintingPolicy
&Policy
) const {
33 QualType(getType(), 0).print(Out
, Policy
);
38 1 << llvm::PointerLikeTypeTraits
<TypeInfoLValue
>::NumLowBitsAvailable
<=
40 "Type is insufficiently aligned");
42 APValue::LValueBase::LValueBase(const ValueDecl
*P
, unsigned I
, unsigned V
)
43 : Ptr(P
? cast
<ValueDecl
>(P
->getCanonicalDecl()) : nullptr), Local
{I
, V
} {}
44 APValue::LValueBase::LValueBase(const Expr
*P
, unsigned I
, unsigned V
)
45 : Ptr(P
), Local
{I
, V
} {}
47 APValue::LValueBase
APValue::LValueBase::getDynamicAlloc(DynamicAllocLValue LV
,
51 Base
.DynamicAllocType
= Type
.getAsOpaquePtr();
55 APValue::LValueBase
APValue::LValueBase::getTypeInfo(TypeInfoLValue LV
,
59 Base
.TypeInfoType
= TypeInfo
.getAsOpaquePtr();
63 QualType
APValue::LValueBase::getType() const {
64 if (!*this) return QualType();
65 if (const ValueDecl
*D
= dyn_cast
<const ValueDecl
*>()) {
66 // FIXME: It's unclear where we're supposed to take the type from, and
67 // this actually matters for arrays of unknown bound. Eg:
69 // extern int arr[]; void f() { extern int arr[3]; };
70 // constexpr int *p = &arr[1]; // valid?
72 // For now, we take the most complete type we can find.
73 for (auto *Redecl
= cast
<ValueDecl
>(D
->getMostRecentDecl()); Redecl
;
74 Redecl
= cast_or_null
<ValueDecl
>(Redecl
->getPreviousDecl())) {
75 QualType T
= Redecl
->getType();
76 if (!T
->isIncompleteArrayType())
82 if (is
<TypeInfoLValue
>())
83 return getTypeInfoType();
85 if (is
<DynamicAllocLValue
>())
86 return getDynamicAllocType();
88 const Expr
*Base
= get
<const Expr
*>();
90 // For a materialized temporary, the type of the temporary we materialized
91 // may not be the type of the expression.
92 if (const MaterializeTemporaryExpr
*MTE
=
93 clang::dyn_cast
<MaterializeTemporaryExpr
>(Base
)) {
94 SmallVector
<const Expr
*, 2> CommaLHSs
;
95 SmallVector
<SubobjectAdjustment
, 2> Adjustments
;
96 const Expr
*Temp
= MTE
->getSubExpr();
97 const Expr
*Inner
= Temp
->skipRValueSubobjectAdjustments(CommaLHSs
,
99 // Keep any cv-qualifiers from the reference if we generated a temporary
100 // for it directly. Otherwise use the type after adjustment.
101 if (!Adjustments
.empty())
102 return Inner
->getType();
105 return Base
->getType();
108 unsigned APValue::LValueBase::getCallIndex() const {
109 return (is
<TypeInfoLValue
>() || is
<DynamicAllocLValue
>()) ? 0
113 unsigned APValue::LValueBase::getVersion() const {
114 return (is
<TypeInfoLValue
>() || is
<DynamicAllocLValue
>()) ? 0 : Local
.Version
;
117 QualType
APValue::LValueBase::getTypeInfoType() const {
118 assert(is
<TypeInfoLValue
>() && "not a type_info lvalue");
119 return QualType::getFromOpaquePtr(TypeInfoType
);
122 QualType
APValue::LValueBase::getDynamicAllocType() const {
123 assert(is
<DynamicAllocLValue
>() && "not a dynamic allocation lvalue");
124 return QualType::getFromOpaquePtr(DynamicAllocType
);
127 void APValue::LValueBase::Profile(llvm::FoldingSetNodeID
&ID
) const {
128 ID
.AddPointer(Ptr
.getOpaqueValue());
129 if (is
<TypeInfoLValue
>() || is
<DynamicAllocLValue
>())
131 ID
.AddInteger(Local
.CallIndex
);
132 ID
.AddInteger(Local
.Version
);
136 bool operator==(const APValue::LValueBase
&LHS
,
137 const APValue::LValueBase
&RHS
) {
138 if (LHS
.Ptr
!= RHS
.Ptr
)
140 if (LHS
.is
<TypeInfoLValue
>() || LHS
.is
<DynamicAllocLValue
>())
142 return LHS
.Local
.CallIndex
== RHS
.Local
.CallIndex
&&
143 LHS
.Local
.Version
== RHS
.Local
.Version
;
147 APValue::LValuePathEntry::LValuePathEntry(BaseOrMemberType BaseOrMember
) {
148 if (const Decl
*D
= BaseOrMember
.getPointer())
149 BaseOrMember
.setPointer(D
->getCanonicalDecl());
150 Value
= reinterpret_cast<uintptr_t>(BaseOrMember
.getOpaqueValue());
153 void APValue::LValuePathEntry::Profile(llvm::FoldingSetNodeID
&ID
) const {
154 ID
.AddInteger(Value
);
157 APValue::LValuePathSerializationHelper::LValuePathSerializationHelper(
158 ArrayRef
<LValuePathEntry
> Path
, QualType ElemTy
)
159 : Ty((const void *)ElemTy
.getTypePtrOrNull()), Path(Path
) {}
161 QualType
APValue::LValuePathSerializationHelper::getType() {
162 return QualType::getFromOpaquePtr(Ty
);
167 APValue::LValueBase Base
;
171 bool IsOnePastTheEnd
: 1;
175 void *APValue::LValueBase::getOpaqueValue() const {
176 return Ptr
.getOpaqueValue();
179 bool APValue::LValueBase::isNull() const {
183 APValue::LValueBase::operator bool () const {
184 return static_cast<bool>(Ptr
);
187 clang::APValue::LValueBase
188 llvm::DenseMapInfo
<clang::APValue::LValueBase
>::getEmptyKey() {
189 clang::APValue::LValueBase B
;
190 B
.Ptr
= DenseMapInfo
<const ValueDecl
*>::getEmptyKey();
194 clang::APValue::LValueBase
195 llvm::DenseMapInfo
<clang::APValue::LValueBase
>::getTombstoneKey() {
196 clang::APValue::LValueBase B
;
197 B
.Ptr
= DenseMapInfo
<const ValueDecl
*>::getTombstoneKey();
202 llvm::hash_code
hash_value(const APValue::LValueBase
&Base
) {
203 if (Base
.is
<TypeInfoLValue
>() || Base
.is
<DynamicAllocLValue
>())
204 return llvm::hash_value(Base
.getOpaqueValue());
205 return llvm::hash_combine(Base
.getOpaqueValue(), Base
.getCallIndex(),
210 unsigned llvm::DenseMapInfo
<clang::APValue::LValueBase
>::getHashValue(
211 const clang::APValue::LValueBase
&Base
) {
212 return hash_value(Base
);
215 bool llvm::DenseMapInfo
<clang::APValue::LValueBase
>::isEqual(
216 const clang::APValue::LValueBase
&LHS
,
217 const clang::APValue::LValueBase
&RHS
) {
221 struct APValue::LV
: LVBase
{
222 static const unsigned InlinePathSpace
=
223 (DataSize
- sizeof(LVBase
)) / sizeof(LValuePathEntry
);
225 /// Path - The sequence of base classes, fields and array indices to follow to
226 /// walk from Base to the subobject. When performing GCC-style folding, there
227 /// may not be such a path.
229 LValuePathEntry Path
[InlinePathSpace
];
230 LValuePathEntry
*PathPtr
;
233 LV() { PathLength
= (unsigned)-1; }
234 ~LV() { resizePath(0); }
236 void resizePath(unsigned Length
) {
237 if (Length
== PathLength
)
243 PathPtr
= new LValuePathEntry
[Length
];
246 bool hasPath() const { return PathLength
!= (unsigned)-1; }
247 bool hasPathPtr() const { return hasPath() && PathLength
> InlinePathSpace
; }
249 LValuePathEntry
*getPath() { return hasPathPtr() ? PathPtr
: Path
; }
250 const LValuePathEntry
*getPath() const {
251 return hasPathPtr() ? PathPtr
: Path
;
256 struct MemberPointerBase
{
257 llvm::PointerIntPair
<const ValueDecl
*, 1, bool> MemberAndIsDerivedMember
;
262 struct APValue::MemberPointerData
: MemberPointerBase
{
263 static const unsigned InlinePathSpace
=
264 (DataSize
- sizeof(MemberPointerBase
)) / sizeof(const CXXRecordDecl
*);
265 typedef const CXXRecordDecl
*PathElem
;
267 PathElem Path
[InlinePathSpace
];
271 MemberPointerData() { PathLength
= 0; }
272 ~MemberPointerData() { resizePath(0); }
274 void resizePath(unsigned Length
) {
275 if (Length
== PathLength
)
281 PathPtr
= new PathElem
[Length
];
284 bool hasPathPtr() const { return PathLength
> InlinePathSpace
; }
286 PathElem
*getPath() { return hasPathPtr() ? PathPtr
: Path
; }
287 const PathElem
*getPath() const {
288 return hasPathPtr() ? PathPtr
: Path
;
292 // FIXME: Reduce the malloc traffic here.
294 APValue::Arr::Arr(unsigned NumElts
, unsigned Size
) :
295 Elts(new APValue
[NumElts
+ (NumElts
!= Size
? 1 : 0)]),
296 NumElts(NumElts
), ArrSize(Size
) {}
297 APValue::Arr::~Arr() { delete [] Elts
; }
299 APValue::StructData::StructData(unsigned NumBases
, unsigned NumFields
) :
300 Elts(new APValue
[NumBases
+NumFields
]),
301 NumBases(NumBases
), NumFields(NumFields
) {}
302 APValue::StructData::~StructData() {
306 APValue::UnionData::UnionData() : Field(nullptr), Value(new APValue
) {}
307 APValue::UnionData::~UnionData () {
311 APValue::APValue(const APValue
&RHS
) : Kind(None
) {
312 switch (RHS
.getKind()) {
315 Kind
= RHS
.getKind();
319 setInt(RHS
.getInt());
323 setFloat(RHS
.getFloat());
326 APFixedPoint FXCopy
= RHS
.getFixedPoint();
327 MakeFixedPoint(std::move(FXCopy
));
332 setVector(((const Vec
*)(const char *)&RHS
.Data
)->Elts
,
333 RHS
.getVectorLength());
337 setComplexInt(RHS
.getComplexIntReal(), RHS
.getComplexIntImag());
341 setComplexFloat(RHS
.getComplexFloatReal(), RHS
.getComplexFloatImag());
345 if (RHS
.hasLValuePath())
346 setLValue(RHS
.getLValueBase(), RHS
.getLValueOffset(), RHS
.getLValuePath(),
347 RHS
.isLValueOnePastTheEnd(), RHS
.isNullPointer());
349 setLValue(RHS
.getLValueBase(), RHS
.getLValueOffset(), NoLValuePath(),
350 RHS
.isNullPointer());
353 MakeArray(RHS
.getArrayInitializedElts(), RHS
.getArraySize());
354 for (unsigned I
= 0, N
= RHS
.getArrayInitializedElts(); I
!= N
; ++I
)
355 getArrayInitializedElt(I
) = RHS
.getArrayInitializedElt(I
);
356 if (RHS
.hasArrayFiller())
357 getArrayFiller() = RHS
.getArrayFiller();
360 MakeStruct(RHS
.getStructNumBases(), RHS
.getStructNumFields());
361 for (unsigned I
= 0, N
= RHS
.getStructNumBases(); I
!= N
; ++I
)
362 getStructBase(I
) = RHS
.getStructBase(I
);
363 for (unsigned I
= 0, N
= RHS
.getStructNumFields(); I
!= N
; ++I
)
364 getStructField(I
) = RHS
.getStructField(I
);
368 setUnion(RHS
.getUnionField(), RHS
.getUnionValue());
371 MakeMemberPointer(RHS
.getMemberPointerDecl(),
372 RHS
.isMemberPointerToDerivedMember(),
373 RHS
.getMemberPointerPath());
377 setAddrLabelDiff(RHS
.getAddrLabelDiffLHS(), RHS
.getAddrLabelDiffRHS());
382 APValue::APValue(APValue
&&RHS
) : Kind(RHS
.Kind
), Data(RHS
.Data
) {
386 APValue
&APValue::operator=(const APValue
&RHS
) {
388 *this = APValue(RHS
);
392 APValue
&APValue::operator=(APValue
&&RHS
) {
394 if (Kind
!= None
&& Kind
!= Indeterminate
)
395 DestroyDataAndMakeUninit();
403 void APValue::DestroyDataAndMakeUninit() {
405 ((APSInt
*)(char *)&Data
)->~APSInt();
406 else if (Kind
== Float
)
407 ((APFloat
*)(char *)&Data
)->~APFloat();
408 else if (Kind
== FixedPoint
)
409 ((APFixedPoint
*)(char *)&Data
)->~APFixedPoint();
410 else if (Kind
== Vector
)
411 ((Vec
*)(char *)&Data
)->~Vec();
412 else if (Kind
== ComplexInt
)
413 ((ComplexAPSInt
*)(char *)&Data
)->~ComplexAPSInt();
414 else if (Kind
== ComplexFloat
)
415 ((ComplexAPFloat
*)(char *)&Data
)->~ComplexAPFloat();
416 else if (Kind
== LValue
)
417 ((LV
*)(char *)&Data
)->~LV();
418 else if (Kind
== Array
)
419 ((Arr
*)(char *)&Data
)->~Arr();
420 else if (Kind
== Struct
)
421 ((StructData
*)(char *)&Data
)->~StructData();
422 else if (Kind
== Union
)
423 ((UnionData
*)(char *)&Data
)->~UnionData();
424 else if (Kind
== MemberPointer
)
425 ((MemberPointerData
*)(char *)&Data
)->~MemberPointerData();
426 else if (Kind
== AddrLabelDiff
)
427 ((AddrLabelDiffData
*)(char *)&Data
)->~AddrLabelDiffData();
431 bool APValue::needsCleanup() const {
443 return getInt().needsCleanup();
445 return getFloat().needsCleanup();
447 return getFixedPoint().getValue().needsCleanup();
449 assert(getComplexFloatImag().needsCleanup() ==
450 getComplexFloatReal().needsCleanup() &&
451 "In _Complex float types, real and imaginary values always have the "
453 return getComplexFloatReal().needsCleanup();
455 assert(getComplexIntImag().needsCleanup() ==
456 getComplexIntReal().needsCleanup() &&
457 "In _Complex int types, real and imaginary values must have the "
459 return getComplexIntReal().needsCleanup();
461 return reinterpret_cast<const LV
*>(&Data
)->hasPathPtr();
463 return reinterpret_cast<const MemberPointerData
*>(&Data
)->hasPathPtr();
465 llvm_unreachable("Unknown APValue kind!");
468 void APValue::swap(APValue
&RHS
) {
469 std::swap(Kind
, RHS
.Kind
);
470 std::swap(Data
, RHS
.Data
);
473 /// Profile the value of an APInt, excluding its bit-width.
474 static void profileIntValue(llvm::FoldingSetNodeID
&ID
, const llvm::APInt
&V
) {
475 for (unsigned I
= 0, N
= V
.getBitWidth(); I
< N
; I
+= 32)
476 ID
.AddInteger((uint32_t)V
.extractBitsAsZExtValue(std::min(32u, N
- I
), I
));
479 void APValue::Profile(llvm::FoldingSetNodeID
&ID
) const {
480 // Note that our profiling assumes that only APValues of the same type are
481 // ever compared. As a result, we don't consider collisions that could only
482 // happen if the types are different. (For example, structs with different
483 // numbers of members could profile the same.)
493 ID
.AddPointer(getAddrLabelDiffLHS()->getLabel()->getCanonicalDecl());
494 ID
.AddPointer(getAddrLabelDiffRHS()->getLabel()->getCanonicalDecl());
498 for (unsigned I
= 0, N
= getStructNumBases(); I
!= N
; ++I
)
499 getStructBase(I
).Profile(ID
);
500 for (unsigned I
= 0, N
= getStructNumFields(); I
!= N
; ++I
)
501 getStructField(I
).Profile(ID
);
505 if (!getUnionField()) {
509 ID
.AddInteger(getUnionField()->getFieldIndex() + 1);
510 getUnionValue().Profile(ID
);
514 if (getArraySize() == 0)
517 // The profile should not depend on whether the array is expanded or
518 // not, but we don't want to profile the array filler many times for
519 // a large array. So treat all equal trailing elements as the filler.
520 // Elements are profiled in reverse order to support this, and the
521 // first profiled element is followed by a count. For example:
523 // ['a', 'c', 'x', 'x', 'x'] is profiled as
524 // [5, 'x', 3, 'c', 'a']
525 llvm::FoldingSetNodeID FillerID
;
526 (hasArrayFiller() ? getArrayFiller()
527 : getArrayInitializedElt(getArrayInitializedElts() - 1))
529 ID
.AddNodeID(FillerID
);
530 unsigned NumFillers
= getArraySize() - getArrayInitializedElts();
531 unsigned N
= getArrayInitializedElts();
533 // Count the number of elements equal to the last one. This loop ends
534 // by adding an integer indicating the number of such elements, with
535 // N set to the number of elements left to profile.
538 // All elements are fillers.
539 assert(NumFillers
== getArraySize());
540 ID
.AddInteger(NumFillers
);
544 // No need to check if the last element is equal to the last
546 if (N
!= getArraySize()) {
547 llvm::FoldingSetNodeID ElemID
;
548 getArrayInitializedElt(N
- 1).Profile(ElemID
);
549 if (ElemID
!= FillerID
) {
550 ID
.AddInteger(NumFillers
);
551 ID
.AddNodeID(ElemID
);
562 // Emit the remaining elements.
564 getArrayInitializedElt(N
- 1).Profile(ID
);
569 for (unsigned I
= 0, N
= getVectorLength(); I
!= N
; ++I
)
570 getVectorElt(I
).Profile(ID
);
574 profileIntValue(ID
, getInt());
578 profileIntValue(ID
, getFloat().bitcastToAPInt());
582 profileIntValue(ID
, getFixedPoint().getValue());
586 profileIntValue(ID
, getComplexFloatReal().bitcastToAPInt());
587 profileIntValue(ID
, getComplexFloatImag().bitcastToAPInt());
591 profileIntValue(ID
, getComplexIntReal());
592 profileIntValue(ID
, getComplexIntImag());
596 getLValueBase().Profile(ID
);
597 ID
.AddInteger(getLValueOffset().getQuantity());
598 ID
.AddInteger((isNullPointer() ? 1 : 0) |
599 (isLValueOnePastTheEnd() ? 2 : 0) |
600 (hasLValuePath() ? 4 : 0));
601 if (hasLValuePath()) {
602 ID
.AddInteger(getLValuePath().size());
603 // For uniqueness, we only need to profile the entries corresponding
604 // to union members, but we don't have the type here so we don't know
605 // how to interpret the entries.
606 for (LValuePathEntry E
: getLValuePath())
612 ID
.AddPointer(getMemberPointerDecl());
613 ID
.AddInteger(isMemberPointerToDerivedMember());
614 for (const CXXRecordDecl
*D
: getMemberPointerPath())
619 llvm_unreachable("Unknown APValue kind!");
622 static double GetApproxValue(const llvm::APFloat
&F
) {
625 V
.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven
,
627 return V
.convertToDouble();
630 static bool TryPrintAsStringLiteral(raw_ostream
&Out
,
631 const PrintingPolicy
&Policy
,
632 const ArrayType
*ATy
,
633 ArrayRef
<APValue
> Inits
) {
637 QualType Ty
= ATy
->getElementType();
638 if (!Ty
->isAnyCharacterType())
641 // Nothing we can do about a sequence that is not null-terminated
642 if (!Inits
.back().isInt() || !Inits
.back().getInt().isZero())
645 Inits
= Inits
.drop_back();
647 llvm::SmallString
<40> Buf
;
650 // Better than printing a two-digit sequence of 10 integers.
651 constexpr size_t MaxN
= 36;
653 if (Inits
.size() > MaxN
&& !Policy
.EntireContentsOfLargeArray
) {
656 Inits
.take_front(std::min(MaxN
- Ellipsis
.size() / 2, Inits
.size()));
659 for (auto &Val
: Inits
) {
662 int64_t Char64
= Val
.getInt().getExtValue();
663 if (!isASCII(Char64
))
664 return false; // Bye bye, see you in integers.
665 auto Ch
= static_cast<unsigned char>(Char64
);
666 // The diagnostic message is 'quoted'
667 StringRef Escaped
= escapeCStyle
<EscapeChar::SingleAndDouble
>(Ch
);
668 if (Escaped
.empty()) {
669 if (!isPrintable(Ch
))
671 Buf
.emplace_back(Ch
);
677 Buf
.append(Ellipsis
);
680 if (Ty
->isWideCharType())
682 else if (Ty
->isChar8Type())
684 else if (Ty
->isChar16Type())
686 else if (Ty
->isChar32Type())
693 void APValue::printPretty(raw_ostream
&Out
, const ASTContext
&Ctx
,
695 printPretty(Out
, Ctx
.getPrintingPolicy(), Ty
, &Ctx
);
698 void APValue::printPretty(raw_ostream
&Out
, const PrintingPolicy
&Policy
,
699 QualType Ty
, const ASTContext
*Ctx
) const {
700 // There are no objects of type 'void', but values of this type can be
701 // returned from functions.
702 if (Ty
->isVoidType()) {
709 Out
<< "<out of lifetime>";
711 case APValue::Indeterminate
:
712 Out
<< "<uninitialized>";
715 if (Ty
->isBooleanType())
716 Out
<< (getInt().getBoolValue() ? "true" : "false");
721 Out
<< GetApproxValue(getFloat());
723 case APValue::FixedPoint
:
724 Out
<< getFixedPoint();
726 case APValue::Vector
: {
728 QualType ElemTy
= Ty
->castAs
<VectorType
>()->getElementType();
729 getVectorElt(0).printPretty(Out
, Policy
, ElemTy
, Ctx
);
730 for (unsigned i
= 1; i
!= getVectorLength(); ++i
) {
732 getVectorElt(i
).printPretty(Out
, Policy
, ElemTy
, Ctx
);
737 case APValue::ComplexInt
:
738 Out
<< getComplexIntReal() << "+" << getComplexIntImag() << "i";
740 case APValue::ComplexFloat
:
741 Out
<< GetApproxValue(getComplexFloatReal()) << "+"
742 << GetApproxValue(getComplexFloatImag()) << "i";
744 case APValue::LValue
: {
745 bool IsReference
= Ty
->isReferenceType();
747 = IsReference
? Ty
.getNonReferenceType() : Ty
->getPointeeType();
748 if (InnerTy
.isNull())
751 LValueBase Base
= getLValueBase();
753 if (isNullPointer()) {
754 Out
<< (Policy
.Nullptr
? "nullptr" : "0");
755 } else if (IsReference
) {
756 Out
<< "*(" << InnerTy
.stream(Policy
) << "*)"
757 << getLValueOffset().getQuantity();
759 Out
<< "(" << Ty
.stream(Policy
) << ")"
760 << getLValueOffset().getQuantity();
765 if (!hasLValuePath()) {
766 // No lvalue path: just print the offset.
767 CharUnits O
= getLValueOffset();
768 CharUnits S
= Ctx
? Ctx
->getTypeSizeInCharsIfKnown(InnerTy
).value_or(
774 if (S
.isZero() || O
% S
) {
776 S
= CharUnits::One();
779 } else if (!IsReference
) {
783 if (const ValueDecl
*VD
= Base
.dyn_cast
<const ValueDecl
*>())
785 else if (TypeInfoLValue TI
= Base
.dyn_cast
<TypeInfoLValue
>()) {
786 TI
.print(Out
, Policy
);
787 } else if (DynamicAllocLValue DA
= Base
.dyn_cast
<DynamicAllocLValue
>()) {
789 << Base
.getDynamicAllocType().stream(Policy
) << "#"
790 << DA
.getIndex() << "}";
792 assert(Base
.get
<const Expr
*>() != nullptr &&
793 "Expecting non-null Expr");
794 Base
.get
<const Expr
*>()->printPretty(Out
, nullptr, Policy
);
798 Out
<< " + " << (O
/ S
);
805 // We have an lvalue path. Print it out nicely.
808 else if (isLValueOnePastTheEnd())
811 QualType ElemTy
= Base
.getType();
812 if (const ValueDecl
*VD
= Base
.dyn_cast
<const ValueDecl
*>()) {
814 } else if (TypeInfoLValue TI
= Base
.dyn_cast
<TypeInfoLValue
>()) {
815 TI
.print(Out
, Policy
);
816 } else if (DynamicAllocLValue DA
= Base
.dyn_cast
<DynamicAllocLValue
>()) {
817 Out
<< "{*new " << Base
.getDynamicAllocType().stream(Policy
) << "#"
818 << DA
.getIndex() << "}";
820 const Expr
*E
= Base
.get
<const Expr
*>();
821 assert(E
!= nullptr && "Expecting non-null Expr");
822 E
->printPretty(Out
, nullptr, Policy
);
825 ArrayRef
<LValuePathEntry
> Path
= getLValuePath();
826 const CXXRecordDecl
*CastToBase
= nullptr;
827 for (unsigned I
= 0, N
= Path
.size(); I
!= N
; ++I
) {
828 if (ElemTy
->isRecordType()) {
829 // The lvalue refers to a class type, so the next path entry is a base
831 const Decl
*BaseOrMember
= Path
[I
].getAsBaseOrMember().getPointer();
832 if (const CXXRecordDecl
*RD
= dyn_cast
<CXXRecordDecl
>(BaseOrMember
)) {
834 // Leave ElemTy referring to the most-derived class. The actual type
835 // doesn't matter except for array types.
837 const ValueDecl
*VD
= cast
<ValueDecl
>(BaseOrMember
);
840 Out
<< *CastToBase
<< "::";
842 ElemTy
= VD
->getType();
844 } else if (ElemTy
->isAnyComplexType()) {
845 // The lvalue refers to a complex type
846 Out
<< (Path
[I
].getAsArrayIndex() == 0 ? ".real" : ".imag");
847 ElemTy
= ElemTy
->castAs
<ComplexType
>()->getElementType();
849 // The lvalue must refer to an array.
850 Out
<< '[' << Path
[I
].getAsArrayIndex() << ']';
851 ElemTy
= ElemTy
->castAsArrayTypeUnsafe()->getElementType();
855 // Handle formatting of one-past-the-end lvalues.
856 if (isLValueOnePastTheEnd()) {
857 // FIXME: If CastToBase is non-0, we should prefix the output with
865 case APValue::Array
: {
866 const ArrayType
*AT
= Ty
->castAsArrayTypeUnsafe();
867 unsigned N
= getArrayInitializedElts();
868 if (N
!= 0 && TryPrintAsStringLiteral(Out
, Policy
, AT
,
869 {&getArrayInitializedElt(0), N
}))
871 QualType ElemTy
= AT
->getElementType();
876 for (; I
!= N
; ++I
) {
878 if (I
== 10 && !Policy
.EntireContentsOfLargeArray
) {
884 getArrayInitializedElt(I
).printPretty(Out
, Policy
, ElemTy
, Ctx
);
890 case APValue::Struct
: {
892 const RecordDecl
*RD
= Ty
->castAs
<RecordType
>()->getDecl();
894 if (unsigned N
= getStructNumBases()) {
895 const CXXRecordDecl
*CD
= cast
<CXXRecordDecl
>(RD
);
896 CXXRecordDecl::base_class_const_iterator BI
= CD
->bases_begin();
897 for (unsigned I
= 0; I
!= N
; ++I
, ++BI
) {
898 assert(BI
!= CD
->bases_end());
901 getStructBase(I
).printPretty(Out
, Policy
, BI
->getType(), Ctx
);
905 for (const auto *FI
: RD
->fields()) {
908 if (FI
->isUnnamedBitfield()) continue;
909 getStructField(FI
->getFieldIndex()).
910 printPretty(Out
, Policy
, FI
->getType(), Ctx
);
918 if (const FieldDecl
*FD
= getUnionField()) {
919 Out
<< "." << *FD
<< " = ";
920 getUnionValue().printPretty(Out
, Policy
, FD
->getType(), Ctx
);
924 case APValue::MemberPointer
:
925 // FIXME: This is not enough to unambiguously identify the member in a
926 // multiple-inheritance scenario.
927 if (const ValueDecl
*VD
= getMemberPointerDecl()) {
928 Out
<< '&' << *cast
<CXXRecordDecl
>(VD
->getDeclContext()) << "::" << *VD
;
933 case APValue::AddrLabelDiff
:
934 Out
<< "&&" << getAddrLabelDiffLHS()->getLabel()->getName();
936 Out
<< "&&" << getAddrLabelDiffRHS()->getLabel()->getName();
939 llvm_unreachable("Unknown APValue kind!");
942 std::string
APValue::getAsString(const ASTContext
&Ctx
, QualType Ty
) const {
944 llvm::raw_string_ostream
Out(Result
);
945 printPretty(Out
, Ctx
, Ty
);
950 bool APValue::toIntegralConstant(APSInt
&Result
, QualType SrcTy
,
951 const ASTContext
&Ctx
) const {
957 if (isLValue() && isNullPointer()) {
958 Result
= Ctx
.MakeIntValue(Ctx
.getTargetNullPointerValue(SrcTy
), SrcTy
);
962 if (isLValue() && !getLValueBase()) {
963 Result
= Ctx
.MakeIntValue(getLValueOffset().getQuantity(), SrcTy
);
970 const APValue::LValueBase
APValue::getLValueBase() const {
971 assert(isLValue() && "Invalid accessor");
972 return ((const LV
*)(const void *)&Data
)->Base
;
975 bool APValue::isLValueOnePastTheEnd() const {
976 assert(isLValue() && "Invalid accessor");
977 return ((const LV
*)(const void *)&Data
)->IsOnePastTheEnd
;
980 CharUnits
&APValue::getLValueOffset() {
981 assert(isLValue() && "Invalid accessor");
982 return ((LV
*)(void *)&Data
)->Offset
;
985 bool APValue::hasLValuePath() const {
986 assert(isLValue() && "Invalid accessor");
987 return ((const LV
*)(const char *)&Data
)->hasPath();
990 ArrayRef
<APValue::LValuePathEntry
> APValue::getLValuePath() const {
991 assert(isLValue() && hasLValuePath() && "Invalid accessor");
992 const LV
&LVal
= *((const LV
*)(const char *)&Data
);
993 return llvm::ArrayRef(LVal
.getPath(), LVal
.PathLength
);
996 unsigned APValue::getLValueCallIndex() const {
997 assert(isLValue() && "Invalid accessor");
998 return ((const LV
*)(const char *)&Data
)->Base
.getCallIndex();
1001 unsigned APValue::getLValueVersion() const {
1002 assert(isLValue() && "Invalid accessor");
1003 return ((const LV
*)(const char *)&Data
)->Base
.getVersion();
1006 bool APValue::isNullPointer() const {
1007 assert(isLValue() && "Invalid usage");
1008 return ((const LV
*)(const char *)&Data
)->IsNullPtr
;
1011 void APValue::setLValue(LValueBase B
, const CharUnits
&O
, NoLValuePath
,
1013 assert(isLValue() && "Invalid accessor");
1014 LV
&LVal
= *((LV
*)(char *)&Data
);
1016 LVal
.IsOnePastTheEnd
= false;
1018 LVal
.resizePath((unsigned)-1);
1019 LVal
.IsNullPtr
= IsNullPtr
;
1022 MutableArrayRef
<APValue::LValuePathEntry
>
1023 APValue::setLValueUninit(LValueBase B
, const CharUnits
&O
, unsigned Size
,
1024 bool IsOnePastTheEnd
, bool IsNullPtr
) {
1025 assert(isLValue() && "Invalid accessor");
1026 LV
&LVal
= *((LV
*)(char *)&Data
);
1028 LVal
.IsOnePastTheEnd
= IsOnePastTheEnd
;
1030 LVal
.IsNullPtr
= IsNullPtr
;
1031 LVal
.resizePath(Size
);
1032 return {LVal
.getPath(), Size
};
1035 void APValue::setLValue(LValueBase B
, const CharUnits
&O
,
1036 ArrayRef
<LValuePathEntry
> Path
, bool IsOnePastTheEnd
,
1038 MutableArrayRef
<APValue::LValuePathEntry
> InternalPath
=
1039 setLValueUninit(B
, O
, Path
.size(), IsOnePastTheEnd
, IsNullPtr
);
1041 memcpy(InternalPath
.data(), Path
.data(),
1042 Path
.size() * sizeof(LValuePathEntry
));
1046 void APValue::setUnion(const FieldDecl
*Field
, const APValue
&Value
) {
1047 assert(isUnion() && "Invalid accessor");
1048 ((UnionData
*)(char *)&Data
)->Field
=
1049 Field
? Field
->getCanonicalDecl() : nullptr;
1050 *((UnionData
*)(char *)&Data
)->Value
= Value
;
1053 const ValueDecl
*APValue::getMemberPointerDecl() const {
1054 assert(isMemberPointer() && "Invalid accessor");
1055 const MemberPointerData
&MPD
=
1056 *((const MemberPointerData
*)(const char *)&Data
);
1057 return MPD
.MemberAndIsDerivedMember
.getPointer();
1060 bool APValue::isMemberPointerToDerivedMember() const {
1061 assert(isMemberPointer() && "Invalid accessor");
1062 const MemberPointerData
&MPD
=
1063 *((const MemberPointerData
*)(const char *)&Data
);
1064 return MPD
.MemberAndIsDerivedMember
.getInt();
1067 ArrayRef
<const CXXRecordDecl
*> APValue::getMemberPointerPath() const {
1068 assert(isMemberPointer() && "Invalid accessor");
1069 const MemberPointerData
&MPD
=
1070 *((const MemberPointerData
*)(const char *)&Data
);
1071 return llvm::ArrayRef(MPD
.getPath(), MPD
.PathLength
);
1074 void APValue::MakeLValue() {
1075 assert(isAbsent() && "Bad state change");
1076 static_assert(sizeof(LV
) <= DataSize
, "LV too big");
1077 new ((void *)(char *)&Data
) LV();
1081 void APValue::MakeArray(unsigned InitElts
, unsigned Size
) {
1082 assert(isAbsent() && "Bad state change");
1083 new ((void *)(char *)&Data
) Arr(InitElts
, Size
);
1087 MutableArrayRef
<APValue::LValuePathEntry
>
1088 setLValueUninit(APValue::LValueBase B
, const CharUnits
&O
, unsigned Size
,
1089 bool OnePastTheEnd
, bool IsNullPtr
);
1091 MutableArrayRef
<const CXXRecordDecl
*>
1092 APValue::setMemberPointerUninit(const ValueDecl
*Member
, bool IsDerivedMember
,
1094 assert(isAbsent() && "Bad state change");
1095 MemberPointerData
*MPD
= new ((void *)(char *)&Data
) MemberPointerData
;
1096 Kind
= MemberPointer
;
1097 MPD
->MemberAndIsDerivedMember
.setPointer(
1098 Member
? cast
<ValueDecl
>(Member
->getCanonicalDecl()) : nullptr);
1099 MPD
->MemberAndIsDerivedMember
.setInt(IsDerivedMember
);
1100 MPD
->resizePath(Size
);
1101 return {MPD
->getPath(), MPD
->PathLength
};
1104 void APValue::MakeMemberPointer(const ValueDecl
*Member
, bool IsDerivedMember
,
1105 ArrayRef
<const CXXRecordDecl
*> Path
) {
1106 MutableArrayRef
<const CXXRecordDecl
*> InternalPath
=
1107 setMemberPointerUninit(Member
, IsDerivedMember
, Path
.size());
1108 for (unsigned I
= 0; I
!= Path
.size(); ++I
)
1109 InternalPath
[I
] = Path
[I
]->getCanonicalDecl();
1112 LinkageInfo
LinkageComputer::getLVForValue(const APValue
&V
,
1113 LVComputationKind computation
) {
1114 LinkageInfo LV
= LinkageInfo::external();
1116 auto MergeLV
= [&](LinkageInfo MergeLV
) {
1118 return LV
.getLinkage() == InternalLinkage
;
1120 auto Merge
= [&](const APValue
&V
) {
1121 return MergeLV(getLVForValue(V
, computation
));
1124 switch (V
.getKind()) {
1126 case APValue::Indeterminate
:
1128 case APValue::Float
:
1129 case APValue::FixedPoint
:
1130 case APValue::ComplexInt
:
1131 case APValue::ComplexFloat
:
1132 case APValue::Vector
:
1135 case APValue::AddrLabelDiff
:
1136 // Even for an inline function, it's not reasonable to treat a difference
1137 // between the addresses of labels as an external value.
1138 return LinkageInfo::internal();
1140 case APValue::Struct
: {
1141 for (unsigned I
= 0, N
= V
.getStructNumBases(); I
!= N
; ++I
)
1142 if (Merge(V
.getStructBase(I
)))
1144 for (unsigned I
= 0, N
= V
.getStructNumFields(); I
!= N
; ++I
)
1145 if (Merge(V
.getStructField(I
)))
1150 case APValue::Union
:
1151 if (V
.getUnionField())
1152 Merge(V
.getUnionValue());
1155 case APValue::Array
: {
1156 for (unsigned I
= 0, N
= V
.getArrayInitializedElts(); I
!= N
; ++I
)
1157 if (Merge(V
.getArrayInitializedElt(I
)))
1159 if (V
.hasArrayFiller())
1160 Merge(V
.getArrayFiller());
1164 case APValue::LValue
: {
1165 if (!V
.getLValueBase()) {
1166 // Null or absolute address: this is external.
1167 } else if (const auto *VD
=
1168 V
.getLValueBase().dyn_cast
<const ValueDecl
*>()) {
1169 if (VD
&& MergeLV(getLVForDecl(VD
, computation
)))
1171 } else if (const auto TI
= V
.getLValueBase().dyn_cast
<TypeInfoLValue
>()) {
1172 if (MergeLV(getLVForType(*TI
.getType(), computation
)))
1174 } else if (const Expr
*E
= V
.getLValueBase().dyn_cast
<const Expr
*>()) {
1175 // Almost all expression bases are internal. The exception is
1176 // lifetime-extended temporaries.
1177 // FIXME: These should be modeled as having the
1178 // LifetimeExtendedTemporaryDecl itself as the base.
1179 // FIXME: If we permit Objective-C object literals in template arguments,
1180 // they should not imply internal linkage.
1181 auto *MTE
= dyn_cast
<MaterializeTemporaryExpr
>(E
);
1182 if (!MTE
|| MTE
->getStorageDuration() == SD_FullExpression
)
1183 return LinkageInfo::internal();
1184 if (MergeLV(getLVForDecl(MTE
->getExtendingDecl(), computation
)))
1187 assert(V
.getLValueBase().is
<DynamicAllocLValue
>() &&
1188 "unexpected LValueBase kind");
1189 return LinkageInfo::internal();
1191 // The lvalue path doesn't matter: pointers to all subobjects always have
1192 // the same visibility as pointers to the complete object.
1196 case APValue::MemberPointer
:
1197 if (const NamedDecl
*D
= V
.getMemberPointerDecl())
1198 MergeLV(getLVForDecl(D
, computation
));
1199 // Note that we could have a base-to-derived conversion here to a member of
1200 // a derived class with less linkage/visibility. That's covered by the
1201 // linkage and visibility of the value's type.