aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Baeder <tbaeder@redhat.com>2025-08-20 09:23:19 +0200
committerGitHub <noreply@github.com>2025-08-20 09:23:19 +0200
commita9de444aa12c02c81f65e4e4e5262897b80c5a58 (patch)
tree53c7f93a60d8dbb2e7eb60e168bacbfa09f818ab
parent27f32831b9a854a525a7f494143769b93ce17c83 (diff)
downloadllvm-a9de444aa12c02c81f65e4e4e5262897b80c5a58.zip
llvm-a9de444aa12c02c81f65e4e4e5262897b80c5a58.tar.gz
llvm-a9de444aa12c02c81f65e4e4e5262897b80c5a58.tar.bz2
[clang][bytecode][NFC] Use an anonymous union in Pointer (#154405)
So we can save ourselves writing PointeeStorage all the time.
-rw-r--r--clang/lib/AST/ByteCode/DynamicAllocator.cpp2
-rw-r--r--clang/lib/AST/ByteCode/InterpBlock.cpp24
-rw-r--r--clang/lib/AST/ByteCode/Pointer.cpp135
-rw-r--r--clang/lib/AST/ByteCode/Pointer.h40
-rw-r--r--clang/lib/AST/ByteCode/Program.cpp5
5 files changed, 106 insertions, 100 deletions
diff --git a/clang/lib/AST/ByteCode/DynamicAllocator.cpp b/clang/lib/AST/ByteCode/DynamicAllocator.cpp
index 3874e4d..4fedac6 100644
--- a/clang/lib/AST/ByteCode/DynamicAllocator.cpp
+++ b/clang/lib/AST/ByteCode/DynamicAllocator.cpp
@@ -31,7 +31,7 @@ void DynamicAllocator::cleanup() {
if (B->hasPointers()) {
while (B->Pointers) {
Pointer *Next = B->Pointers->asBlockPointer().Next;
- B->Pointers->PointeeStorage.BS.Pointee = nullptr;
+ B->Pointers->BS.Pointee = nullptr;
B->Pointers = Next;
}
B->Pointers = nullptr;
diff --git a/clang/lib/AST/ByteCode/InterpBlock.cpp b/clang/lib/AST/ByteCode/InterpBlock.cpp
index fdaf112..ac6f01f 100644
--- a/clang/lib/AST/ByteCode/InterpBlock.cpp
+++ b/clang/lib/AST/ByteCode/InterpBlock.cpp
@@ -23,9 +23,9 @@ void Block::addPointer(Pointer *P) {
assert(!hasPointer(P));
#endif
if (Pointers)
- Pointers->PointeeStorage.BS.Prev = P;
- P->PointeeStorage.BS.Next = Pointers;
- P->PointeeStorage.BS.Prev = nullptr;
+ Pointers->BS.Prev = P;
+ P->BS.Next = Pointers;
+ P->BS.Prev = nullptr;
Pointers = P;
#ifndef NDEBUG
assert(hasPointer(P));
@@ -40,16 +40,16 @@ void Block::removePointer(Pointer *P) {
assert(hasPointer(P));
#endif
- BlockPointer &BP = P->PointeeStorage.BS;
+ BlockPointer &BP = P->BS;
if (Pointers == P)
Pointers = BP.Next;
if (BP.Prev)
- BP.Prev->PointeeStorage.BS.Next = BP.Next;
+ BP.Prev->BS.Next = BP.Next;
if (BP.Next)
- BP.Next->PointeeStorage.BS.Prev = BP.Prev;
- P->PointeeStorage.BS.Pointee = nullptr;
+ BP.Next->BS.Prev = BP.Prev;
+ P->BS.Pointee = nullptr;
#ifndef NDEBUG
assert(!hasPointer(P));
#endif
@@ -70,13 +70,13 @@ void Block::replacePointer(Pointer *Old, Pointer *New) {
assert(hasPointer(Old));
#endif
- BlockPointer &OldBP = Old->PointeeStorage.BS;
- BlockPointer &NewBP = New->PointeeStorage.BS;
+ BlockPointer &OldBP = Old->BS;
+ BlockPointer &NewBP = New->BS;
if (OldBP.Prev)
- OldBP.Prev->PointeeStorage.BS.Next = New;
+ OldBP.Prev->BS.Next = New;
if (OldBP.Next)
- OldBP.Next->PointeeStorage.BS.Prev = New;
+ OldBP.Next->BS.Prev = New;
NewBP.Prev = OldBP.Prev;
NewBP.Next = OldBP.Next;
if (Pointers == Old)
@@ -116,7 +116,7 @@ DeadBlock::DeadBlock(DeadBlock *&Root, Block *Blk)
// Transfer pointers.
B.Pointers = Blk->Pointers;
for (Pointer *P = Blk->Pointers; P; P = P->asBlockPointer().Next)
- P->PointeeStorage.BS.Pointee = &B;
+ P->BS.Pointee = &B;
Blk->Pointers = nullptr;
}
diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp
index 89d9829..821de3b 100644
--- a/clang/lib/AST/ByteCode/Pointer.cpp
+++ b/clang/lib/AST/ByteCode/Pointer.cpp
@@ -30,39 +30,62 @@ Pointer::Pointer(Block *Pointee)
Pointer::Pointer(Block *Pointee, uint64_t BaseAndOffset)
: Pointer(Pointee, BaseAndOffset, BaseAndOffset) {}
-Pointer::Pointer(const Pointer &P)
- : Offset(P.Offset), StorageKind(P.StorageKind),
- PointeeStorage(P.PointeeStorage) {
-
- if (isBlockPointer() && PointeeStorage.BS.Pointee)
- PointeeStorage.BS.Pointee->addPointer(this);
-}
-
Pointer::Pointer(Block *Pointee, unsigned Base, uint64_t Offset)
: Offset(Offset), StorageKind(Storage::Block) {
assert((Base == RootPtrMark || Base % alignof(void *) == 0) && "wrong base");
- PointeeStorage.BS = {Pointee, Base, nullptr, nullptr};
+ BS = {Pointee, Base, nullptr, nullptr};
if (Pointee)
Pointee->addPointer(this);
}
-Pointer::Pointer(Pointer &&P)
- : Offset(P.Offset), StorageKind(P.StorageKind),
- PointeeStorage(P.PointeeStorage) {
+Pointer::Pointer(const Pointer &P)
+ : Offset(P.Offset), StorageKind(P.StorageKind) {
+ switch (StorageKind) {
+ case Storage::Int:
+ Int = P.Int;
+ break;
+ case Storage::Block:
+ BS = P.BS;
+ if (BS.Pointee)
+ BS.Pointee->addPointer(this);
+ break;
+ case Storage::Fn:
+ Fn = P.Fn;
+ break;
+ case Storage::Typeid:
+ Typeid = P.Typeid;
+ break;
+ }
+}
- if (StorageKind == Storage::Block && PointeeStorage.BS.Pointee)
- PointeeStorage.BS.Pointee->replacePointer(&P, this);
+Pointer::Pointer(Pointer &&P) : Offset(P.Offset), StorageKind(P.StorageKind) {
+ switch (StorageKind) {
+ case Storage::Int:
+ Int = P.Int;
+ break;
+ case Storage::Block:
+ BS = P.BS;
+ if (BS.Pointee)
+ BS.Pointee->replacePointer(&P, this);
+ break;
+ case Storage::Fn:
+ Fn = P.Fn;
+ break;
+ case Storage::Typeid:
+ Typeid = P.Typeid;
+ break;
+ }
}
Pointer::~Pointer() {
if (!isBlockPointer())
return;
- if (Block *Pointee = PointeeStorage.BS.Pointee) {
+ if (Block *Pointee = BS.Pointee) {
Pointee->removePointer(this);
- PointeeStorage.BS.Pointee = nullptr;
+ BS.Pointee = nullptr;
Pointee->cleanup();
}
}
@@ -73,13 +96,13 @@ Pointer &Pointer::operator=(const Pointer &P) {
if (isBlockPointer()) {
if (P.isBlockPointer() && this->block() == P.block()) {
Offset = P.Offset;
- PointeeStorage.BS.Base = P.PointeeStorage.BS.Base;
+ BS.Base = P.BS.Base;
return *this;
}
- if (Block *Pointee = PointeeStorage.BS.Pointee) {
+ if (Block *Pointee = BS.Pointee) {
Pointee->removePointer(this);
- PointeeStorage.BS.Pointee = nullptr;
+ BS.Pointee = nullptr;
Pointee->cleanup();
}
}
@@ -88,16 +111,16 @@ Pointer &Pointer::operator=(const Pointer &P) {
Offset = P.Offset;
if (P.isBlockPointer()) {
- PointeeStorage.BS = P.PointeeStorage.BS;
+ BS = P.BS;
- if (PointeeStorage.BS.Pointee)
- PointeeStorage.BS.Pointee->addPointer(this);
+ if (BS.Pointee)
+ BS.Pointee->addPointer(this);
} else if (P.isIntegralPointer()) {
- PointeeStorage.Int = P.PointeeStorage.Int;
+ Int = P.Int;
} else if (P.isFunctionPointer()) {
- PointeeStorage.Fn = P.PointeeStorage.Fn;
+ Fn = P.Fn;
} else if (P.isTypeidPointer()) {
- PointeeStorage.Typeid = P.PointeeStorage.Typeid;
+ Typeid = P.Typeid;
} else {
assert(false && "Unhandled storage kind");
}
@@ -110,13 +133,13 @@ Pointer &Pointer::operator=(Pointer &&P) {
if (isBlockPointer()) {
if (P.isBlockPointer() && this->block() == P.block()) {
Offset = P.Offset;
- PointeeStorage.BS.Base = P.PointeeStorage.BS.Base;
+ BS.Base = P.BS.Base;
return *this;
}
- if (Block *Pointee = PointeeStorage.BS.Pointee) {
+ if (Block *Pointee = BS.Pointee) {
Pointee->removePointer(this);
- PointeeStorage.BS.Pointee = nullptr;
+ BS.Pointee = nullptr;
Pointee->cleanup();
}
}
@@ -125,16 +148,16 @@ Pointer &Pointer::operator=(Pointer &&P) {
Offset = P.Offset;
if (P.isBlockPointer()) {
- PointeeStorage.BS = P.PointeeStorage.BS;
+ BS = P.BS;
- if (PointeeStorage.BS.Pointee)
- PointeeStorage.BS.Pointee->addPointer(this);
+ if (BS.Pointee)
+ BS.Pointee->addPointer(this);
} else if (P.isIntegralPointer()) {
- PointeeStorage.Int = P.PointeeStorage.Int;
+ Int = P.Int;
} else if (P.isFunctionPointer()) {
- PointeeStorage.Fn = P.PointeeStorage.Fn;
+ Fn = P.Fn;
} else if (P.isTypeidPointer()) {
- PointeeStorage.Typeid = P.PointeeStorage.Typeid;
+ Typeid = P.Typeid;
} else {
assert(false && "Unhandled storage kind");
}
@@ -163,12 +186,11 @@ APValue Pointer::toAPValue(const ASTContext &ASTCtx) const {
}
if (isTypeidPointer()) {
- TypeInfoLValue TypeInfo(PointeeStorage.Typeid.TypePtr);
- return APValue(
- APValue::LValueBase::getTypeInfo(
- TypeInfo, QualType(PointeeStorage.Typeid.TypeInfoType, 0)),
- CharUnits::Zero(), {},
- /*OnePastTheEnd=*/false, /*IsNull=*/false);
+ TypeInfoLValue TypeInfo(Typeid.TypePtr);
+ return APValue(APValue::LValueBase::getTypeInfo(
+ TypeInfo, QualType(Typeid.TypeInfoType, 0)),
+ CharUnits::Zero(), {},
+ /*OnePastTheEnd=*/false, /*IsNull=*/false);
}
// Build the lvalue base from the block.
@@ -300,13 +322,13 @@ APValue Pointer::toAPValue(const ASTContext &ASTCtx) const {
void Pointer::print(llvm::raw_ostream &OS) const {
switch (StorageKind) {
case Storage::Block: {
- const Block *B = PointeeStorage.BS.Pointee;
+ const Block *B = BS.Pointee;
OS << "(Block) " << B << " {";
if (isRoot())
- OS << "rootptr(" << PointeeStorage.BS.Base << "), ";
+ OS << "rootptr(" << BS.Base << "), ";
else
- OS << PointeeStorage.BS.Base << ", ";
+ OS << BS.Base << ", ";
if (isElementPastEnd())
OS << "pastend, ";
@@ -321,8 +343,7 @@ void Pointer::print(llvm::raw_ostream &OS) const {
} break;
case Storage::Int:
OS << "(Int) {";
- OS << PointeeStorage.Int.Value << " + " << Offset << ", "
- << PointeeStorage.Int.Desc;
+ OS << Int.Value << " + " << Offset << ", " << Int.Desc;
OS << "}";
break;
case Storage::Fn:
@@ -412,18 +433,17 @@ bool Pointer::isInitialized() const {
if (!isBlockPointer())
return true;
- if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) {
+ if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor)) {
const GlobalInlineDescriptor &GD =
*reinterpret_cast<const GlobalInlineDescriptor *>(block()->rawData());
return GD.InitState == GlobalInitState::Initialized;
}
- assert(PointeeStorage.BS.Pointee &&
- "Cannot check if null pointer was initialized");
+ assert(BS.Pointee && "Cannot check if null pointer was initialized");
const Descriptor *Desc = getFieldDesc();
assert(Desc);
if (Desc->isPrimitiveArray()) {
- if (isStatic() && PointeeStorage.BS.Base == 0)
+ if (isStatic() && BS.Base == 0)
return true;
InitMapPtr &IM = getInitMap();
@@ -448,9 +468,9 @@ void Pointer::initialize() const {
if (!isBlockPointer())
return;
- assert(PointeeStorage.BS.Pointee && "Cannot initialize null pointer");
+ assert(BS.Pointee && "Cannot initialize null pointer");
- if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) {
+ if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor)) {
GlobalInlineDescriptor &GD = *reinterpret_cast<GlobalInlineDescriptor *>(
asBlockPointer().Pointee->rawData());
GD.InitState = GlobalInitState::Initialized;
@@ -461,7 +481,7 @@ void Pointer::initialize() const {
assert(Desc);
if (Desc->isPrimitiveArray()) {
// Primitive global arrays don't have an initmap.
- if (isStatic() && PointeeStorage.BS.Base == 0)
+ if (isStatic() && BS.Base == 0)
return;
// Nothing to do for these.
@@ -487,8 +507,7 @@ void Pointer::initialize() const {
}
// Field has its bit in an inline descriptor.
- assert(PointeeStorage.BS.Base != 0 &&
- "Only composite fields can be initialised");
+ assert(BS.Base != 0 && "Only composite fields can be initialised");
getInlineDesc()->IsInitialized = true;
}
@@ -507,10 +526,9 @@ void Pointer::initializeAllElements() const {
void Pointer::activate() const {
// Field has its bit in an inline descriptor.
- assert(PointeeStorage.BS.Base != 0 &&
- "Only composite fields can be activated");
+ assert(BS.Base != 0 && "Only composite fields can be activated");
- if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor))
+ if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor))
return;
if (!getInlineDesc()->InUnion)
return;
@@ -592,8 +610,7 @@ bool Pointer::pointToSameBlock(const Pointer &A, const Pointer &B) {
}
bool Pointer::hasSameArray(const Pointer &A, const Pointer &B) {
- return hasSameBase(A, B) &&
- A.PointeeStorage.BS.Base == B.PointeeStorage.BS.Base &&
+ return hasSameBase(A, B) && A.BS.Base == B.BS.Base &&
A.getFieldDesc()->IsArray;
}
diff --git a/clang/lib/AST/ByteCode/Pointer.h b/clang/lib/AST/ByteCode/Pointer.h
index 27659d7..96a11b6 100644
--- a/clang/lib/AST/ByteCode/Pointer.h
+++ b/clang/lib/AST/ByteCode/Pointer.h
@@ -28,8 +28,6 @@ class Block;
class DeadBlock;
class Pointer;
class Context;
-template <unsigned A, bool B> class Integral;
-enum PrimType : uint8_t;
class Pointer;
inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Pointer &P);
@@ -95,31 +93,23 @@ private:
static constexpr unsigned RootPtrMark = ~0u;
public:
- Pointer() {
- StorageKind = Storage::Int;
- PointeeStorage.Int.Value = 0;
- PointeeStorage.Int.Desc = nullptr;
- }
- Pointer(IntPointer &&IntPtr) : StorageKind(Storage::Int) {
- PointeeStorage.Int = std::move(IntPtr);
- }
+ Pointer() : StorageKind(Storage::Int), Int{nullptr, 0} {}
+ Pointer(IntPointer &&IntPtr)
+ : StorageKind(Storage::Int), Int(std::move(IntPtr)) {}
Pointer(Block *B);
Pointer(Block *B, uint64_t BaseAndOffset);
Pointer(const Pointer &P);
Pointer(Pointer &&P);
Pointer(uint64_t Address, const Descriptor *Desc, uint64_t Offset = 0)
- : Offset(Offset), StorageKind(Storage::Int) {
- PointeeStorage.Int.Value = Address;
- PointeeStorage.Int.Desc = Desc;
- }
+ : Offset(Offset), StorageKind(Storage::Int), Int{Desc, Address} {}
Pointer(const Function *F, uint64_t Offset = 0)
- : Offset(Offset), StorageKind(Storage::Fn) {
- PointeeStorage.Fn = FunctionPointer(F);
+ : Offset(Offset), StorageKind(Storage::Fn), Fn(F) {
+ Fn = FunctionPointer(F);
}
Pointer(const Type *TypePtr, const Type *TypeInfoType, uint64_t Offset = 0)
: Offset(Offset), StorageKind(Storage::Typeid) {
- PointeeStorage.Typeid.TypePtr = TypePtr;
- PointeeStorage.Typeid.TypeInfoType = TypeInfoType;
+ Typeid.TypePtr = TypePtr;
+ Typeid.TypeInfoType = TypeInfoType;
}
Pointer(Block *Pointee, unsigned Base, uint64_t Offset);
~Pointer();
@@ -350,7 +340,7 @@ public:
/// Returns the type of the innermost field.
QualType getType() const {
if (isTypeidPointer())
- return QualType(PointeeStorage.Typeid.TypeInfoType, 0);
+ return QualType(Typeid.TypeInfoType, 0);
if (inPrimitiveArray() && Offset != asBlockPointer().Base) {
// Unfortunately, complex and vector types are not array types in clang,
@@ -468,19 +458,19 @@ public:
[[nodiscard]] const BlockPointer &asBlockPointer() const {
assert(isBlockPointer());
- return PointeeStorage.BS;
+ return BS;
}
[[nodiscard]] const IntPointer &asIntPointer() const {
assert(isIntegralPointer());
- return PointeeStorage.Int;
+ return Int;
}
[[nodiscard]] const FunctionPointer &asFunctionPointer() const {
assert(isFunctionPointer());
- return PointeeStorage.Fn;
+ return Fn;
}
[[nodiscard]] const TypeidPointer &asTypeidPointer() const {
assert(isTypeidPointer());
- return PointeeStorage.Typeid;
+ return Typeid;
}
bool isBlockPointer() const { return StorageKind == Storage::Block; }
@@ -665,7 +655,7 @@ public:
if (isIntegralPointer())
return false;
- return !isZero() && Offset > PointeeStorage.BS.Pointee->getSize();
+ return !isZero() && Offset > BS.Pointee->getSize();
}
/// Checks if the pointer is an out-of-bounds element pointer.
@@ -842,7 +832,7 @@ private:
BlockPointer BS;
FunctionPointer Fn;
TypeidPointer Typeid;
- } PointeeStorage;
+ };
};
inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Pointer &P) {
diff --git a/clang/lib/AST/ByteCode/Program.cpp b/clang/lib/AST/ByteCode/Program.cpp
index 755e5de..5d72044 100644
--- a/clang/lib/AST/ByteCode/Program.cpp
+++ b/clang/lib/AST/ByteCode/Program.cpp
@@ -227,10 +227,9 @@ std::optional<unsigned> Program::createGlobal(const ValueDecl *VD,
Globals[PIdx] = NewGlobal;
// All pointers pointing to the previous extern decl now point to the
// new decl.
- for (Pointer *Ptr = RedeclBlock->Pointers; Ptr;
- Ptr = Ptr->PointeeStorage.BS.Next) {
+ for (Pointer *Ptr = RedeclBlock->Pointers; Ptr; Ptr = Ptr->BS.Next) {
RedeclBlock->removePointer(Ptr);
- Ptr->PointeeStorage.BS.Pointee = NewGlobal->block();
+ Ptr->BS.Pointee = NewGlobal->block();
NewGlobal->block()->addPointer(Ptr);
}
}