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
) {
393 if (Kind
!= None
&& Kind
!= Indeterminate
)
394 DestroyDataAndMakeUninit();
401 void APValue::DestroyDataAndMakeUninit() {
403 ((APSInt
*)(char *)&Data
)->~APSInt();
404 else if (Kind
== Float
)
405 ((APFloat
*)(char *)&Data
)->~APFloat();
406 else if (Kind
== FixedPoint
)
407 ((APFixedPoint
*)(char *)&Data
)->~APFixedPoint();
408 else if (Kind
== Vector
)
409 ((Vec
*)(char *)&Data
)->~Vec();
410 else if (Kind
== ComplexInt
)
411 ((ComplexAPSInt
*)(char *)&Data
)->~ComplexAPSInt();
412 else if (Kind
== ComplexFloat
)
413 ((ComplexAPFloat
*)(char *)&Data
)->~ComplexAPFloat();
414 else if (Kind
== LValue
)
415 ((LV
*)(char *)&Data
)->~LV();
416 else if (Kind
== Array
)
417 ((Arr
*)(char *)&Data
)->~Arr();
418 else if (Kind
== Struct
)
419 ((StructData
*)(char *)&Data
)->~StructData();
420 else if (Kind
== Union
)
421 ((UnionData
*)(char *)&Data
)->~UnionData();
422 else if (Kind
== MemberPointer
)
423 ((MemberPointerData
*)(char *)&Data
)->~MemberPointerData();
424 else if (Kind
== AddrLabelDiff
)
425 ((AddrLabelDiffData
*)(char *)&Data
)->~AddrLabelDiffData();
429 bool APValue::needsCleanup() const {
441 return getInt().needsCleanup();
443 return getFloat().needsCleanup();
445 return getFixedPoint().getValue().needsCleanup();
447 assert(getComplexFloatImag().needsCleanup() ==
448 getComplexFloatReal().needsCleanup() &&
449 "In _Complex float types, real and imaginary values always have the "
451 return getComplexFloatReal().needsCleanup();
453 assert(getComplexIntImag().needsCleanup() ==
454 getComplexIntReal().needsCleanup() &&
455 "In _Complex int types, real and imaginary values must have the "
457 return getComplexIntReal().needsCleanup();
459 return reinterpret_cast<const LV
*>(&Data
)->hasPathPtr();
461 return reinterpret_cast<const MemberPointerData
*>(&Data
)->hasPathPtr();
463 llvm_unreachable("Unknown APValue kind!");
466 void APValue::swap(APValue
&RHS
) {
467 std::swap(Kind
, RHS
.Kind
);
468 std::swap(Data
, RHS
.Data
);
471 /// Profile the value of an APInt, excluding its bit-width.
472 static void profileIntValue(llvm::FoldingSetNodeID
&ID
, const llvm::APInt
&V
) {
473 for (unsigned I
= 0, N
= V
.getBitWidth(); I
< N
; I
+= 32)
474 ID
.AddInteger((uint32_t)V
.extractBitsAsZExtValue(std::min(32u, N
- I
), I
));
477 void APValue::Profile(llvm::FoldingSetNodeID
&ID
) const {
478 // Note that our profiling assumes that only APValues of the same type are
479 // ever compared. As a result, we don't consider collisions that could only
480 // happen if the types are different. (For example, structs with different
481 // numbers of members could profile the same.)
491 ID
.AddPointer(getAddrLabelDiffLHS()->getLabel()->getCanonicalDecl());
492 ID
.AddPointer(getAddrLabelDiffRHS()->getLabel()->getCanonicalDecl());
496 for (unsigned I
= 0, N
= getStructNumBases(); I
!= N
; ++I
)
497 getStructBase(I
).Profile(ID
);
498 for (unsigned I
= 0, N
= getStructNumFields(); I
!= N
; ++I
)
499 getStructField(I
).Profile(ID
);
503 if (!getUnionField()) {
507 ID
.AddInteger(getUnionField()->getFieldIndex() + 1);
508 getUnionValue().Profile(ID
);
512 if (getArraySize() == 0)
515 // The profile should not depend on whether the array is expanded or
516 // not, but we don't want to profile the array filler many times for
517 // a large array. So treat all equal trailing elements as the filler.
518 // Elements are profiled in reverse order to support this, and the
519 // first profiled element is followed by a count. For example:
521 // ['a', 'c', 'x', 'x', 'x'] is profiled as
522 // [5, 'x', 3, 'c', 'a']
523 llvm::FoldingSetNodeID FillerID
;
524 (hasArrayFiller() ? getArrayFiller()
525 : getArrayInitializedElt(getArrayInitializedElts() - 1))
527 ID
.AddNodeID(FillerID
);
528 unsigned NumFillers
= getArraySize() - getArrayInitializedElts();
529 unsigned N
= getArrayInitializedElts();
531 // Count the number of elements equal to the last one. This loop ends
532 // by adding an integer indicating the number of such elements, with
533 // N set to the number of elements left to profile.
536 // All elements are fillers.
537 assert(NumFillers
== getArraySize());
538 ID
.AddInteger(NumFillers
);
542 // No need to check if the last element is equal to the last
544 if (N
!= getArraySize()) {
545 llvm::FoldingSetNodeID ElemID
;
546 getArrayInitializedElt(N
- 1).Profile(ElemID
);
547 if (ElemID
!= FillerID
) {
548 ID
.AddInteger(NumFillers
);
549 ID
.AddNodeID(ElemID
);
560 // Emit the remaining elements.
562 getArrayInitializedElt(N
- 1).Profile(ID
);
567 for (unsigned I
= 0, N
= getVectorLength(); I
!= N
; ++I
)
568 getVectorElt(I
).Profile(ID
);
572 profileIntValue(ID
, getInt());
576 profileIntValue(ID
, getFloat().bitcastToAPInt());
580 profileIntValue(ID
, getFixedPoint().getValue());
584 profileIntValue(ID
, getComplexFloatReal().bitcastToAPInt());
585 profileIntValue(ID
, getComplexFloatImag().bitcastToAPInt());
589 profileIntValue(ID
, getComplexIntReal());
590 profileIntValue(ID
, getComplexIntImag());
594 getLValueBase().Profile(ID
);
595 ID
.AddInteger(getLValueOffset().getQuantity());
596 ID
.AddInteger((isNullPointer() ? 1 : 0) |
597 (isLValueOnePastTheEnd() ? 2 : 0) |
598 (hasLValuePath() ? 4 : 0));
599 if (hasLValuePath()) {
600 ID
.AddInteger(getLValuePath().size());
601 // For uniqueness, we only need to profile the entries corresponding
602 // to union members, but we don't have the type here so we don't know
603 // how to interpret the entries.
604 for (LValuePathEntry E
: getLValuePath())
610 ID
.AddPointer(getMemberPointerDecl());
611 ID
.AddInteger(isMemberPointerToDerivedMember());
612 for (const CXXRecordDecl
*D
: getMemberPointerPath())
617 llvm_unreachable("Unknown APValue kind!");
620 static double GetApproxValue(const llvm::APFloat
&F
) {
623 V
.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven
,
625 return V
.convertToDouble();
628 static bool TryPrintAsStringLiteral(raw_ostream
&Out
,
629 const PrintingPolicy
&Policy
,
630 const ArrayType
*ATy
,
631 ArrayRef
<APValue
> Inits
) {
635 QualType Ty
= ATy
->getElementType();
636 if (!Ty
->isAnyCharacterType())
639 // Nothing we can do about a sequence that is not null-terminated
640 if (!Inits
.back().isInt() || !Inits
.back().getInt().isZero())
643 Inits
= Inits
.drop_back();
645 llvm::SmallString
<40> Buf
;
648 // Better than printing a two-digit sequence of 10 integers.
649 constexpr size_t MaxN
= 36;
651 if (Inits
.size() > MaxN
&& !Policy
.EntireContentsOfLargeArray
) {
654 Inits
.take_front(std::min(MaxN
- Ellipsis
.size() / 2, Inits
.size()));
657 for (auto &Val
: Inits
) {
660 int64_t Char64
= Val
.getInt().getExtValue();
661 if (!isASCII(Char64
))
662 return false; // Bye bye, see you in integers.
663 auto Ch
= static_cast<unsigned char>(Char64
);
664 // The diagnostic message is 'quoted'
665 StringRef Escaped
= escapeCStyle
<EscapeChar::SingleAndDouble
>(Ch
);
666 if (Escaped
.empty()) {
667 if (!isPrintable(Ch
))
669 Buf
.emplace_back(Ch
);
675 Buf
.append(Ellipsis
);
678 if (Ty
->isWideCharType())
680 else if (Ty
->isChar8Type())
682 else if (Ty
->isChar16Type())
684 else if (Ty
->isChar32Type())
691 void APValue::printPretty(raw_ostream
&Out
, const ASTContext
&Ctx
,
693 printPretty(Out
, Ctx
.getPrintingPolicy(), Ty
, &Ctx
);
696 void APValue::printPretty(raw_ostream
&Out
, const PrintingPolicy
&Policy
,
697 QualType Ty
, const ASTContext
*Ctx
) const {
698 // There are no objects of type 'void', but values of this type can be
699 // returned from functions.
700 if (Ty
->isVoidType()) {
707 Out
<< "<out of lifetime>";
709 case APValue::Indeterminate
:
710 Out
<< "<uninitialized>";
713 if (Ty
->isBooleanType())
714 Out
<< (getInt().getBoolValue() ? "true" : "false");
719 Out
<< GetApproxValue(getFloat());
721 case APValue::FixedPoint
:
722 Out
<< getFixedPoint();
724 case APValue::Vector
: {
726 QualType ElemTy
= Ty
->castAs
<VectorType
>()->getElementType();
727 getVectorElt(0).printPretty(Out
, Policy
, ElemTy
, Ctx
);
728 for (unsigned i
= 1; i
!= getVectorLength(); ++i
) {
730 getVectorElt(i
).printPretty(Out
, Policy
, ElemTy
, Ctx
);
735 case APValue::ComplexInt
:
736 Out
<< getComplexIntReal() << "+" << getComplexIntImag() << "i";
738 case APValue::ComplexFloat
:
739 Out
<< GetApproxValue(getComplexFloatReal()) << "+"
740 << GetApproxValue(getComplexFloatImag()) << "i";
742 case APValue::LValue
: {
743 bool IsReference
= Ty
->isReferenceType();
745 = IsReference
? Ty
.getNonReferenceType() : Ty
->getPointeeType();
746 if (InnerTy
.isNull())
749 LValueBase Base
= getLValueBase();
751 if (isNullPointer()) {
752 Out
<< (Policy
.Nullptr
? "nullptr" : "0");
753 } else if (IsReference
) {
754 Out
<< "*(" << InnerTy
.stream(Policy
) << "*)"
755 << getLValueOffset().getQuantity();
757 Out
<< "(" << Ty
.stream(Policy
) << ")"
758 << getLValueOffset().getQuantity();
763 if (!hasLValuePath()) {
764 // No lvalue path: just print the offset.
765 CharUnits O
= getLValueOffset();
766 CharUnits S
= Ctx
? Ctx
->getTypeSizeInCharsIfKnown(InnerTy
).value_or(
772 if (S
.isZero() || O
% S
) {
774 S
= CharUnits::One();
777 } else if (!IsReference
) {
781 if (const ValueDecl
*VD
= Base
.dyn_cast
<const ValueDecl
*>())
783 else if (TypeInfoLValue TI
= Base
.dyn_cast
<TypeInfoLValue
>()) {
784 TI
.print(Out
, Policy
);
785 } else if (DynamicAllocLValue DA
= Base
.dyn_cast
<DynamicAllocLValue
>()) {
787 << Base
.getDynamicAllocType().stream(Policy
) << "#"
788 << DA
.getIndex() << "}";
790 assert(Base
.get
<const Expr
*>() != nullptr &&
791 "Expecting non-null Expr");
792 Base
.get
<const Expr
*>()->printPretty(Out
, nullptr, Policy
);
796 Out
<< " + " << (O
/ S
);
803 // We have an lvalue path. Print it out nicely.
806 else if (isLValueOnePastTheEnd())
809 QualType ElemTy
= Base
.getType();
810 if (const ValueDecl
*VD
= Base
.dyn_cast
<const ValueDecl
*>()) {
812 } else if (TypeInfoLValue TI
= Base
.dyn_cast
<TypeInfoLValue
>()) {
813 TI
.print(Out
, Policy
);
814 } else if (DynamicAllocLValue DA
= Base
.dyn_cast
<DynamicAllocLValue
>()) {
815 Out
<< "{*new " << Base
.getDynamicAllocType().stream(Policy
) << "#"
816 << DA
.getIndex() << "}";
818 const Expr
*E
= Base
.get
<const Expr
*>();
819 assert(E
!= nullptr && "Expecting non-null Expr");
820 E
->printPretty(Out
, nullptr, Policy
);
823 ArrayRef
<LValuePathEntry
> Path
= getLValuePath();
824 const CXXRecordDecl
*CastToBase
= nullptr;
825 for (unsigned I
= 0, N
= Path
.size(); I
!= N
; ++I
) {
826 if (ElemTy
->isRecordType()) {
827 // The lvalue refers to a class type, so the next path entry is a base
829 const Decl
*BaseOrMember
= Path
[I
].getAsBaseOrMember().getPointer();
830 if (const CXXRecordDecl
*RD
= dyn_cast
<CXXRecordDecl
>(BaseOrMember
)) {
832 // Leave ElemTy referring to the most-derived class. The actual type
833 // doesn't matter except for array types.
835 const ValueDecl
*VD
= cast
<ValueDecl
>(BaseOrMember
);
838 Out
<< *CastToBase
<< "::";
840 ElemTy
= VD
->getType();
843 // The lvalue must refer to an array.
844 Out
<< '[' << Path
[I
].getAsArrayIndex() << ']';
845 ElemTy
= ElemTy
->castAsArrayTypeUnsafe()->getElementType();
849 // Handle formatting of one-past-the-end lvalues.
850 if (isLValueOnePastTheEnd()) {
851 // FIXME: If CastToBase is non-0, we should prefix the output with
859 case APValue::Array
: {
860 const ArrayType
*AT
= Ty
->castAsArrayTypeUnsafe();
861 unsigned N
= getArrayInitializedElts();
862 if (N
!= 0 && TryPrintAsStringLiteral(Out
, Policy
, AT
,
863 {&getArrayInitializedElt(0), N
}))
865 QualType ElemTy
= AT
->getElementType();
870 for (; I
!= N
; ++I
) {
872 if (I
== 10 && !Policy
.EntireContentsOfLargeArray
) {
878 getArrayInitializedElt(I
).printPretty(Out
, Policy
, ElemTy
, Ctx
);
884 case APValue::Struct
: {
886 const RecordDecl
*RD
= Ty
->castAs
<RecordType
>()->getDecl();
888 if (unsigned N
= getStructNumBases()) {
889 const CXXRecordDecl
*CD
= cast
<CXXRecordDecl
>(RD
);
890 CXXRecordDecl::base_class_const_iterator BI
= CD
->bases_begin();
891 for (unsigned I
= 0; I
!= N
; ++I
, ++BI
) {
892 assert(BI
!= CD
->bases_end());
895 getStructBase(I
).printPretty(Out
, Policy
, BI
->getType(), Ctx
);
899 for (const auto *FI
: RD
->fields()) {
902 if (FI
->isUnnamedBitfield()) continue;
903 getStructField(FI
->getFieldIndex()).
904 printPretty(Out
, Policy
, FI
->getType(), Ctx
);
912 if (const FieldDecl
*FD
= getUnionField()) {
913 Out
<< "." << *FD
<< " = ";
914 getUnionValue().printPretty(Out
, Policy
, FD
->getType(), Ctx
);
918 case APValue::MemberPointer
:
919 // FIXME: This is not enough to unambiguously identify the member in a
920 // multiple-inheritance scenario.
921 if (const ValueDecl
*VD
= getMemberPointerDecl()) {
922 Out
<< '&' << *cast
<CXXRecordDecl
>(VD
->getDeclContext()) << "::" << *VD
;
927 case APValue::AddrLabelDiff
:
928 Out
<< "&&" << getAddrLabelDiffLHS()->getLabel()->getName();
930 Out
<< "&&" << getAddrLabelDiffRHS()->getLabel()->getName();
933 llvm_unreachable("Unknown APValue kind!");
936 std::string
APValue::getAsString(const ASTContext
&Ctx
, QualType Ty
) const {
938 llvm::raw_string_ostream
Out(Result
);
939 printPretty(Out
, Ctx
, Ty
);
944 bool APValue::toIntegralConstant(APSInt
&Result
, QualType SrcTy
,
945 const ASTContext
&Ctx
) const {
951 if (isLValue() && isNullPointer()) {
952 Result
= Ctx
.MakeIntValue(Ctx
.getTargetNullPointerValue(SrcTy
), SrcTy
);
956 if (isLValue() && !getLValueBase()) {
957 Result
= Ctx
.MakeIntValue(getLValueOffset().getQuantity(), SrcTy
);
964 const APValue::LValueBase
APValue::getLValueBase() const {
965 assert(isLValue() && "Invalid accessor");
966 return ((const LV
*)(const void *)&Data
)->Base
;
969 bool APValue::isLValueOnePastTheEnd() const {
970 assert(isLValue() && "Invalid accessor");
971 return ((const LV
*)(const void *)&Data
)->IsOnePastTheEnd
;
974 CharUnits
&APValue::getLValueOffset() {
975 assert(isLValue() && "Invalid accessor");
976 return ((LV
*)(void *)&Data
)->Offset
;
979 bool APValue::hasLValuePath() const {
980 assert(isLValue() && "Invalid accessor");
981 return ((const LV
*)(const char *)&Data
)->hasPath();
984 ArrayRef
<APValue::LValuePathEntry
> APValue::getLValuePath() const {
985 assert(isLValue() && hasLValuePath() && "Invalid accessor");
986 const LV
&LVal
= *((const LV
*)(const char *)&Data
);
987 return llvm::ArrayRef(LVal
.getPath(), LVal
.PathLength
);
990 unsigned APValue::getLValueCallIndex() const {
991 assert(isLValue() && "Invalid accessor");
992 return ((const LV
*)(const char *)&Data
)->Base
.getCallIndex();
995 unsigned APValue::getLValueVersion() const {
996 assert(isLValue() && "Invalid accessor");
997 return ((const LV
*)(const char *)&Data
)->Base
.getVersion();
1000 bool APValue::isNullPointer() const {
1001 assert(isLValue() && "Invalid usage");
1002 return ((const LV
*)(const char *)&Data
)->IsNullPtr
;
1005 void APValue::setLValue(LValueBase B
, const CharUnits
&O
, NoLValuePath
,
1007 assert(isLValue() && "Invalid accessor");
1008 LV
&LVal
= *((LV
*)(char *)&Data
);
1010 LVal
.IsOnePastTheEnd
= false;
1012 LVal
.resizePath((unsigned)-1);
1013 LVal
.IsNullPtr
= IsNullPtr
;
1016 MutableArrayRef
<APValue::LValuePathEntry
>
1017 APValue::setLValueUninit(LValueBase B
, const CharUnits
&O
, unsigned Size
,
1018 bool IsOnePastTheEnd
, bool IsNullPtr
) {
1019 assert(isLValue() && "Invalid accessor");
1020 LV
&LVal
= *((LV
*)(char *)&Data
);
1022 LVal
.IsOnePastTheEnd
= IsOnePastTheEnd
;
1024 LVal
.IsNullPtr
= IsNullPtr
;
1025 LVal
.resizePath(Size
);
1026 return {LVal
.getPath(), Size
};
1029 void APValue::setLValue(LValueBase B
, const CharUnits
&O
,
1030 ArrayRef
<LValuePathEntry
> Path
, bool IsOnePastTheEnd
,
1032 MutableArrayRef
<APValue::LValuePathEntry
> InternalPath
=
1033 setLValueUninit(B
, O
, Path
.size(), IsOnePastTheEnd
, IsNullPtr
);
1035 memcpy(InternalPath
.data(), Path
.data(),
1036 Path
.size() * sizeof(LValuePathEntry
));
1040 void APValue::setUnion(const FieldDecl
*Field
, const APValue
&Value
) {
1041 assert(isUnion() && "Invalid accessor");
1042 ((UnionData
*)(char *)&Data
)->Field
=
1043 Field
? Field
->getCanonicalDecl() : nullptr;
1044 *((UnionData
*)(char *)&Data
)->Value
= Value
;
1047 const ValueDecl
*APValue::getMemberPointerDecl() const {
1048 assert(isMemberPointer() && "Invalid accessor");
1049 const MemberPointerData
&MPD
=
1050 *((const MemberPointerData
*)(const char *)&Data
);
1051 return MPD
.MemberAndIsDerivedMember
.getPointer();
1054 bool APValue::isMemberPointerToDerivedMember() const {
1055 assert(isMemberPointer() && "Invalid accessor");
1056 const MemberPointerData
&MPD
=
1057 *((const MemberPointerData
*)(const char *)&Data
);
1058 return MPD
.MemberAndIsDerivedMember
.getInt();
1061 ArrayRef
<const CXXRecordDecl
*> APValue::getMemberPointerPath() const {
1062 assert(isMemberPointer() && "Invalid accessor");
1063 const MemberPointerData
&MPD
=
1064 *((const MemberPointerData
*)(const char *)&Data
);
1065 return llvm::ArrayRef(MPD
.getPath(), MPD
.PathLength
);
1068 void APValue::MakeLValue() {
1069 assert(isAbsent() && "Bad state change");
1070 static_assert(sizeof(LV
) <= DataSize
, "LV too big");
1071 new ((void *)(char *)&Data
) LV();
1075 void APValue::MakeArray(unsigned InitElts
, unsigned Size
) {
1076 assert(isAbsent() && "Bad state change");
1077 new ((void *)(char *)&Data
) Arr(InitElts
, Size
);
1081 MutableArrayRef
<APValue::LValuePathEntry
>
1082 setLValueUninit(APValue::LValueBase B
, const CharUnits
&O
, unsigned Size
,
1083 bool OnePastTheEnd
, bool IsNullPtr
);
1085 MutableArrayRef
<const CXXRecordDecl
*>
1086 APValue::setMemberPointerUninit(const ValueDecl
*Member
, bool IsDerivedMember
,
1088 assert(isAbsent() && "Bad state change");
1089 MemberPointerData
*MPD
= new ((void *)(char *)&Data
) MemberPointerData
;
1090 Kind
= MemberPointer
;
1091 MPD
->MemberAndIsDerivedMember
.setPointer(
1092 Member
? cast
<ValueDecl
>(Member
->getCanonicalDecl()) : nullptr);
1093 MPD
->MemberAndIsDerivedMember
.setInt(IsDerivedMember
);
1094 MPD
->resizePath(Size
);
1095 return {MPD
->getPath(), MPD
->PathLength
};
1098 void APValue::MakeMemberPointer(const ValueDecl
*Member
, bool IsDerivedMember
,
1099 ArrayRef
<const CXXRecordDecl
*> Path
) {
1100 MutableArrayRef
<const CXXRecordDecl
*> InternalPath
=
1101 setMemberPointerUninit(Member
, IsDerivedMember
, Path
.size());
1102 for (unsigned I
= 0; I
!= Path
.size(); ++I
)
1103 InternalPath
[I
] = Path
[I
]->getCanonicalDecl();
1106 LinkageInfo
LinkageComputer::getLVForValue(const APValue
&V
,
1107 LVComputationKind computation
) {
1108 LinkageInfo LV
= LinkageInfo::external();
1110 auto MergeLV
= [&](LinkageInfo MergeLV
) {
1112 return LV
.getLinkage() == InternalLinkage
;
1114 auto Merge
= [&](const APValue
&V
) {
1115 return MergeLV(getLVForValue(V
, computation
));
1118 switch (V
.getKind()) {
1120 case APValue::Indeterminate
:
1122 case APValue::Float
:
1123 case APValue::FixedPoint
:
1124 case APValue::ComplexInt
:
1125 case APValue::ComplexFloat
:
1126 case APValue::Vector
:
1129 case APValue::AddrLabelDiff
:
1130 // Even for an inline function, it's not reasonable to treat a difference
1131 // between the addresses of labels as an external value.
1132 return LinkageInfo::internal();
1134 case APValue::Struct
: {
1135 for (unsigned I
= 0, N
= V
.getStructNumBases(); I
!= N
; ++I
)
1136 if (Merge(V
.getStructBase(I
)))
1138 for (unsigned I
= 0, N
= V
.getStructNumFields(); I
!= N
; ++I
)
1139 if (Merge(V
.getStructField(I
)))
1144 case APValue::Union
:
1145 if (V
.getUnionField())
1146 Merge(V
.getUnionValue());
1149 case APValue::Array
: {
1150 for (unsigned I
= 0, N
= V
.getArrayInitializedElts(); I
!= N
; ++I
)
1151 if (Merge(V
.getArrayInitializedElt(I
)))
1153 if (V
.hasArrayFiller())
1154 Merge(V
.getArrayFiller());
1158 case APValue::LValue
: {
1159 if (!V
.getLValueBase()) {
1160 // Null or absolute address: this is external.
1161 } else if (const auto *VD
=
1162 V
.getLValueBase().dyn_cast
<const ValueDecl
*>()) {
1163 if (VD
&& MergeLV(getLVForDecl(VD
, computation
)))
1165 } else if (const auto TI
= V
.getLValueBase().dyn_cast
<TypeInfoLValue
>()) {
1166 if (MergeLV(getLVForType(*TI
.getType(), computation
)))
1168 } else if (const Expr
*E
= V
.getLValueBase().dyn_cast
<const Expr
*>()) {
1169 // Almost all expression bases are internal. The exception is
1170 // lifetime-extended temporaries.
1171 // FIXME: These should be modeled as having the
1172 // LifetimeExtendedTemporaryDecl itself as the base.
1173 // FIXME: If we permit Objective-C object literals in template arguments,
1174 // they should not imply internal linkage.
1175 auto *MTE
= dyn_cast
<MaterializeTemporaryExpr
>(E
);
1176 if (!MTE
|| MTE
->getStorageDuration() == SD_FullExpression
)
1177 return LinkageInfo::internal();
1178 if (MergeLV(getLVForDecl(MTE
->getExtendingDecl(), computation
)))
1181 assert(V
.getLValueBase().is
<DynamicAllocLValue
>() &&
1182 "unexpected LValueBase kind");
1183 return LinkageInfo::internal();
1185 // The lvalue path doesn't matter: pointers to all subobjects always have
1186 // the same visibility as pointers to the complete object.
1190 case APValue::MemberPointer
:
1191 if (const NamedDecl
*D
= V
.getMemberPointerDecl())
1192 MergeLV(getLVForDecl(D
, computation
));
1193 // Note that we could have a base-to-derived conversion here to a member of
1194 // a derived class with less linkage/visibility. That's covered by the
1195 // linkage and visibility of the value's type.