13 #ifndef LLVM_CLANG_AST_INTERP_POINTER_H
14 #define LLVM_CLANG_AST_INTERP_POINTER_H
23 #include "llvm/Support/raw_ostream.h"
31 template <
unsigned A,
bool B>
class Integral;
84 static constexpr
unsigned PastEndMark = ~0u;
85 static constexpr
unsigned RootPtrMark = ~0u;
90 PointeeStorage.Int.Value = 0;
91 PointeeStorage.Int.Desc =
nullptr;
94 PointeeStorage.Int = std::move(IntPtr);
102 PointeeStorage.Int.Value = Address;
103 PointeeStorage.Int.Desc = Desc;
106 : Offset(Offset), StorageKind(
Storage::
Fn) {
116 if (
P.StorageKind != StorageKind)
170 unsigned Field = Offset + Off;
177 assert(Offset >= Off);
178 unsigned O = Offset - Off;
194 Offset == 0 ? Offset : PastEndMark);
246 return Pointer(Pointee, RootPtrMark, 0);
253 : getDescriptor(Next)->
Desc;
256 return Pointer(Pointee, Next, Offset);
310 assert(Offset == PastEndMark &&
"cannot get base of a block");
319 assert(Offset != 0 && Offset != PastEndMark &&
"not an array element");
334 return getInlineDesc()->
Desc;
343 return AT->getElementType();
345 return CT->getElementType();
347 return CT->getElementType();
376 assert(Offset != PastEndMark &&
"invalid offset");
405 return getInlineDesc()->
InUnion;
445 return PointeeStorage.BS;
449 return PointeeStorage.Int;
453 return PointeeStorage.Fn;
465 return ElemDesc ? ElemDesc->
ElemRecord :
nullptr;
609 return !
isZero() && Offset > PointeeStorage.BS.Pointee->getSize();
618 return Desc->isZeroSizeArray();
624 assert(
isLive() &&
"Invalid pointer");
628 assert(Offset +
sizeof(
T) <=
639 template <
typename T>
T &
elem(
unsigned I)
const {
670 if (Offset <
Other.Offset)
672 else if (Offset >
Other.Offset)
686 void print(llvm::raw_ostream &OS)
const;
707 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.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
A memory block, either on the stack or in the heap.
bool isExtern() const
Checks if the block is extern.
std::byte * data()
Returns a pointer to the stored data.
bool isStatic() const
Checks if the block has static storage duration.
bool isTemporary() const
Checks if the block is temporary.
std::optional< unsigned > getDeclID() const
Returns the declaration ID.
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.
Manages dynamic memory allocations done during bytecode interpretation.
const Function * getFunction() const
uint64_t getIntegerRepresentation() 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.
void deactivate() const
Deactivates an entire strurcutre.
const IntPointer & asIntPointer() const
bool isInitialized() const
Checks if an object was initialized.
bool isStatic() const
Checks if the storage is static.
bool isZeroSizeArray() const
Checks if the pointer is pointing to a zero-size array.
const Descriptor * getFieldDesc() const
Accessors for information about the innermost field.
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.
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.
bool isUnion() const
Checks if the object is a union.
Pointer(IntPointer &&IntPtr)
bool isMutable() const
Checks if the field is mutable.
DeclTy getSource() const
Returns the expression or declaration the pointer has been created for.
const Record * getRecord() const
Returns the record descriptor of a class.
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.
void operator=(const Pointer &P)
const Descriptor * getDeclDesc() const
Accessor for information about the declaration site.
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.
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.
T & deref() const
Dereferences the pointer, if it's live.
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.
std::string toDiagnosticString(const ASTContext &Ctx) const
Converts the pointer to a string usable in diagnostics.
const Record * getElemRecord() const
Returns the element record type, if this is a non-primive array.
bool isZero() const
Checks if the pointer is null.
ComparisonCategoryResult compare(const Pointer &Other) const
Compare two pointers.
bool isRoot() const
Pointer points directly to a block.
const FunctionPointer & asFunctionPointer() const
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.
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)
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.
bool isBlockPointer() const
bool operator!=(const Pointer &P) const
const BlockPointer & asBlockPointer() const
const Block * block() 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.
std::optional< unsigned > getDeclID() const
Returns the declaration ID.
T & elem(unsigned I) const
Dereferences a primitive element.
SourceLocation getDeclLoc() const
const FieldDecl * getField() const
Returns the field information.
bool isFunctionPointer() const
Pointer getDeclPtr() const
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.
void initialize() const
Initializes a field.
bool isField() const
Checks if the item is a field in an object.
unsigned getByteOffset() const
Returns the byte offset from the start.
Structure/Class descriptor.
std::optional< std::pair< bool, std::shared_ptr< InitMap > >> InitMapPtr
unsigned llvm::PointerUnion< const Decl *, const Expr * > DeclTy
PrimType
Enumeration of the primitive types of the VM.
llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const Boolean &B)
The JSON file list parser is used to communicate input to InstallAPI.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
const FunctionProtoType * T
@ Other
Other implicit parameter.
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 Decl * asDecl() const
const FieldDecl * asFieldDecl() const
const Descriptor *const ElemDesc
Descriptor of the array element.
bool isDummy() const
Checks if this is a dummy descriptor.
unsigned getMetadataSize() const
Returns the size of the metadata.
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.
const DeclTy & getSource() const
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.
Bitfield tracking the initialisation status of elements of primitive arrays.
Inline descriptor embedded in structures and arrays.
unsigned IsActive
Flag indicating if the field is the active member of a union.
unsigned IsBase
Flag indicating if the field is an embedded base class.
unsigned IsVirtualBase
Flag inidcating if the field is a virtual base class.
unsigned InUnion
Flat indicating if this field is in a union (even if nested).
unsigned Offset
Offset inside the structure/array.
unsigned IsConst
Flag indicating if the storage is constant or not.
unsigned IsFieldMutable
Flag indicating if the field is mutable (if in a record).
IntPointer atOffset(const ASTContext &ASTCtx, unsigned Offset) const