13#ifndef LLVM_CLANG_AST_INTERP_POINTER_H
14#define LLVM_CLANG_AST_INTERP_POINTER_H
23#include "llvm/Support/raw_ostream.h"
93 static constexpr unsigned PastEndMark = ~0u;
94 static constexpr unsigned RootPtrMark = ~0u;
105 : Offset(Offset), StorageKind(
Storage::
Int),
Int{Desc, Address} {}
107 : Offset(Offset), StorageKind(
Storage::
Fn),
Fn(F) {}
111 Typeid.TypeInfoType = TypeInfoType;
121 if (P.StorageKind != StorageKind)
147 return Fn.getIntegerRepresentation() + Offset;
148 return reinterpret_cast<uint64_t
>(
BS.Pointee) + Offset;
162 if (
BS.Base == RootPtrMark)
175 unsigned Field = Offset + Off;
176 return Pointer(
BS.Pointee, Field, Field);
182 assert(Offset >= Off);
183 unsigned O = Offset - Off;
198 if (
Base == RootPtrMark)
200 Offset == 0 ? Offset : PastEndMark);
206 if (Offset !=
Base) {
212 return Pointer(
BS.Pointee, Offset, Offset);
236 if (
BS.Base != Offset)
243 unsigned Next =
BS.Base - getInlineDesc()->Offset;
247 : getDescriptor(
Next)->Desc;
255 switch (StorageKind) {
257 return Int.Value == 0 && Offset == 0;
259 return BS.Pointee ==
nullptr;
270 return BS.Pointee && !
BS.Pointee->isDead();
289 return BS.Pointee->Desc;
307 if (
BS.Base == RootPtrMark) {
308 assert(Offset == PastEndMark &&
"cannot get base of a block");
311 unsigned NewBase =
BS.Base - getInlineDesc()->Offset;
312 return Pointer(
BS.Pointee, NewBase, NewBase);
316 if (
BS.Base == RootPtrMark) {
317 assert(Offset != 0 && Offset != PastEndMark &&
"not an array element");
320 assert(Offset !=
BS.Base &&
"not an array element");
331 return getInlineDesc()->Desc;
339 return Fn.getFunction()->getDecl()->getType();
345 return AT->getElementType();
347 return CT->getElementType();
349 return CT->getElementType();
361 return Int.Desc->getElemSize();
364 if (
BS.Base == RootPtrMark)
376 assert(Offset != PastEndMark &&
"invalid offset");
378 if (
BS.Base == RootPtrMark)
382 if (Offset !=
BS.Base) {
388 return Offset -
BS.Base - Adjust;
403 return getInlineDesc()->InUnion;
439 return (
BS.Base ==
BS.Pointee->getDescriptor()->getMetadataSize() ||
447 return BS.Pointee &&
BS.Base > 0;
477 return ElemDesc ? ElemDesc->
ElemRecord :
nullptr;
482 return FD->asFieldDecl();
489 return BS.Pointee &&
BS.Pointee->isExtern();
497 return BS.Pointee->isStatic();
503 return BS.Pointee->isTemporary();
511 return BS.Pointee->isDynamic();
522 return !
isRoot() && getInlineDesc()->IsFieldMutable;
532 return BS.Pointee->isWeak();
538 return isRoot() || getInlineDesc()->IsActive;
543 return isField() && getInlineDesc()->IsVirtualBase;
550 if (
const Block *Pointee =
BS.Pointee)
551 return Pointee->isDummy();
564 return isRoot() ?
false : getInlineDesc()->IsConstInMutable;
578 return BS.Pointee->getDeclID();
586 return Int.Value + Offset;
607 return BS.Pointee->rawData() + Offset;
646 return !
isZero() && Offset >
BS.Pointee->getSize();
657 return Desc->isZeroSizeArray();
663 assert(
isLive() &&
"Invalid pointer");
667 assert(Offset +
sizeof(
T) <=
BS.Pointee->getDescriptor()->getAllocSize());
670 return *
reinterpret_cast<T *
>(
BS.Pointee->rawData() +
BS.Base +
673 return *
reinterpret_cast<T *
>(
BS.Pointee->rawData() + Offset);
678 template <
typename T>
T &
elem(
unsigned I)
const {
679 assert(
isLive() &&
"Invalid pointer");
687 unsigned ReadOffset =
BS.Base +
sizeof(
InitMapPtr) + ElemByteOffset;
688 assert(ReadOffset +
sizeof(
T) <=
689 BS.Pointee->getDescriptor()->getAllocSize());
691 return *
reinterpret_cast<T *
>(
BS.Pointee->rawData() + ReadOffset);
728 return getInlineDesc()->LifeState;
752 if (Offset <
Other.Offset)
754 if (Offset >
Other.Offset)
767 static std::optional<std::pair<Pointer, Pointer>>
776 void print(llvm::raw_ostream &OS)
const;
796 assert(
BS.Base <=
BS.Pointee->getSize());
798 return getDescriptor(
BS.Base);
803 assert(Offset != 0 &&
"Not a nested pointer");
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Represents a member of a struct/union/class.
A (possibly-)qualified type.
Encodes a location in the source.
The base class of the type hierarchy.
A memory block, either on the stack or in the heap.
const Descriptor * getDescriptor() const
Returns the block's descriptor.
std::byte * rawData()
Returns a pointer to the raw data, including metadata.
Holds all information required to evaluate constexpr code in a module.
Descriptor for a dead block.
const Function * getFunction() const
const FunctionDecl * getDecl() const
Returns the original FunctionDecl.
A pointer to a memory block, live or dead.
static bool hasSameBase(const Pointer &A, const Pointer &B)
Checks if two pointers are comparable.
Pointer narrow() const
Restricts the scope of an array element pointer.
UnsignedOrNone getDeclID() const
Returns the declaration ID.
void deactivate() const
Deactivates an entire strurcutre.
bool isVolatile() const
Checks if an object or a subfield is volatile.
bool isInitialized() const
Checks if an object was initialized.
bool isStatic() const
Checks if the storage is static.
bool isDynamic() const
Checks if the storage has been dynamically allocated.
bool isZeroSizeArray() const
Checks if the pointer is pointing to a zero-size array.
bool isElementInitialized(unsigned Index) const
Like isInitialized(), but for primitive arrays.
Pointer atIndex(uint64_t Idx) const
Offsets a pointer inside an array.
bool isDummy() const
Checks if the pointer points to a dummy value.
Pointer atFieldSub(unsigned Off) const
Subtract the given offset from the current Base and Offset of the pointer.
bool inPrimitiveArray() const
Checks if the structure is a primitive array.
void print(llvm::raw_ostream &OS) const
Prints the pointer.
bool isExtern() const
Checks if the storage is extern.
int64_t getIndex() const
Returns the index into an array.
friend class MemberPointer
bool isActive() const
Checks if the object is active.
bool isConst() const
Checks if an object or a subfield is mutable.
Pointer atField(unsigned Off) const
Creates a pointer to a field.
T & deref() const
Dereferences the pointer, if it's live.
Pointer(IntPointer &&IntPtr)
bool isMutable() const
Checks if the field is mutable.
bool isConstInMutable() const
DeclTy getSource() const
Returns the expression or declaration the pointer has been created for.
unsigned getNumElems() const
Returns the number of elements.
Pointer getArray() const
Returns the parent array.
bool isUnknownSizeArray() const
Checks if the structure is an array of unknown size.
void activate() const
Activats a field.
static std::optional< std::pair< Pointer, Pointer > > computeSplitPoint(const Pointer &A, const Pointer &B)
const TypeidPointer & asTypeidPointer() const
bool isIntegralPointer() const
QualType getType() const
Returns the type of the innermost field.
bool operator==(const Pointer &P) const
Equality operators are just for tests.
bool isArrayElement() const
Checks if the pointer points to an array.
void initializeAllElements() const
Initialize all elements of a primitive array at once.
bool pointsToStringLiteral() const
bool isArrayRoot() const
Whether this array refers to an array, but not to the first element.
bool isLive() const
Checks if the pointer is live.
bool inArray() const
Checks if the innermost field is an array.
bool isStaticTemporary() const
Checks if the storage is a static temporary.
Pointer(const Type *TypePtr, const Type *TypeInfoType, uint64_t Offset=0)
T & elem(unsigned I) const
Dereferences the element at index I.
bool pointsToLiteral() const
Whether this points to a block that's been created for a "literal lvalue", i.e.
Pointer(uint64_t Address, const Descriptor *Desc, uint64_t Offset=0)
Pointer getBase() const
Returns a pointer to the object of which this pointer is a field.
uint64_t getByteOffset() const
Returns the byte offset from the start.
bool isTypeidPointer() const
std::string toDiagnosticString(const ASTContext &Ctx) const
Converts the pointer to a string usable in diagnostics.
bool isZero() const
Checks if the pointer is null.
Pointer & operator=(const Pointer &P)
ComparisonCategoryResult compare(const Pointer &Other) const
Compare two pointers.
const IntPointer & asIntPointer() const
bool isRoot() const
Pointer points directly to a block.
const Descriptor * getDeclDesc() const
Accessor for information about the declaration site.
const Record * getElemRecord() const
Returns the element record type, if this is a non-primive array.
static bool pointToSameBlock(const Pointer &A, const Pointer &B)
Checks if both given pointers point to the same block.
APValue toAPValue(const ASTContext &ASTCtx) const
Converts the pointer to an APValue.
unsigned getOffset() const
Returns the offset into an array.
friend class DynamicAllocator
bool isOnePastEnd() const
Checks if the index is one past end.
static bool hasSameArray(const Pointer &A, const Pointer &B)
Checks if two pointers can be subtracted.
uint64_t getIntegerRepresentation() const
bool isPastEnd() const
Checks if the pointer points past the end of the object.
Pointer(const Function *F, uint64_t Offset=0)
const FieldDecl * getField() const
Returns the field information.
Pointer expand() const
Expands a pointer to the containing array, undoing narrowing.
bool isElementPastEnd() const
Checks if the pointer is an out-of-bounds element pointer.
bool isDereferencable() const
Whether this block can be read from at all.
void startLifetime() const
bool isBlockPointer() const
bool operator!=(const Pointer &P) const
std::optional< APValue > toRValue(const Context &Ctx, QualType ResultType) const
Converts the pointer to an APValue that is an rvalue.
size_t getSize() const
Returns the total size of the innermost field.
bool isTemporary() const
Checks if the storage is temporary.
const FunctionPointer & asFunctionPointer() const
bool allElementsInitialized() const
SourceLocation getDeclLoc() const
const Block * block() const
bool isFunctionPointer() const
Pointer getDeclPtr() const
const Descriptor * getFieldDesc() const
Accessors for information about the innermost field.
bool isVirtualBaseClass() const
bool isBaseClass() const
Checks if a structure is a base class.
size_t elemSize() const
Returns the element size of the innermost field.
bool canBeInitialized() const
If this pointer has an InlineDescriptor we can use to initialize.
Lifetime getLifetime() const
size_t computeOffsetForComparison() const
Compute an integer that can be used to compare this pointer to another one.
const BlockPointer & asBlockPointer() const
void initialize() const
Initializes a field.
const std::byte * getRawAddress() const
If backed by actual data (i.e.
bool isField() const
Checks if the item is a field in an object.
void initializeElement(unsigned Index) const
Initialized the given element of a primitive array.
const Record * getRecord() const
Returns the record descriptor of a class.
Structure/Class descriptor.
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const Boolean &B)
std::optional< std::pair< bool, std::shared_ptr< InitMap > > > InitMapPtr
The JSON file list parser is used to communicate input to InstallAPI.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
const FunctionProtoType * T
@ Other
Other implicit parameter.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
Pointer * Prev
Previous link in the pointer chain.
Pointer * Next
Next link in the pointer chain.
unsigned Base
Start of the current subfield.
Block * Pointee
The block the pointer is pointing to.
Describes a memory block created by an allocation site.
const bool IsConst
Flag indicating if the block is mutable.
unsigned getSize() const
Returns the size of the object without metadata.
const DeclTy & getSource() const
const Decl * asDecl() const
const Descriptor *const ElemDesc
Descriptor of the array element.
SourceLocation getLocation() const
bool isUnknownSizeArray() const
Checks if the descriptor is of an array of unknown size.
unsigned getElemSize() const
returns the size of an element when the structure is viewed as an array.
const bool IsArray
Flag indicating if the block is an array.
bool isPrimitiveArray() const
Checks if the descriptor is of an array of primitives.
const Record *const ElemRecord
Pointer to the record, if block contains records.
Descriptor used for global variables.
Inline descriptor embedded in structures and arrays.
IntPointer baseCast(const ASTContext &ASTCtx, unsigned BaseOffset) const
IntPointer atOffset(const ASTContext &ASTCtx, unsigned Offset) const
const Type * TypeInfoType