https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/183494
And things around it. Remove the `FieldMap`, since we can use the field's index instead and only keep an array around. `reserve()` the sizes and use `emplace_back()`. >From 076978bb060006744af00b4fe80dc24367d735f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]> Date: Sun, 15 Feb 2026 15:26:47 +0100 Subject: [PATCH] asdf --- clang/lib/AST/ByteCode/Program.cpp | 8 +++++--- clang/lib/AST/ByteCode/Record.cpp | 10 +--------- clang/lib/AST/ByteCode/Record.h | 22 +++++++++++++++------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/clang/lib/AST/ByteCode/Program.cpp b/clang/lib/AST/ByteCode/Program.cpp index 76fec63a8920d..3cb383c431f46 100644 --- a/clang/lib/AST/ByteCode/Program.cpp +++ b/clang/lib/AST/ByteCode/Program.cpp @@ -319,6 +319,7 @@ Record *Program::getOrCreateRecord(const RecordDecl *RD) { Record::BaseList Bases; Record::VirtualBaseList VirtBases; if (const auto *CD = dyn_cast<CXXRecordDecl>(RD)) { + Bases.reserve(CE->getNumBases()); for (const CXXBaseSpecifier &Spec : CD->bases()) { if (Spec.isVirtual()) continue; @@ -334,7 +335,7 @@ Record *Program::getOrCreateRecord(const RecordDecl *RD) { return nullptr; BaseSize += align(sizeof(InlineDescriptor)); - Bases.push_back({BD, BaseSize, Desc, BR}); + Bases.emplace_back(BD, Desc, BR, BaseSize); BaseSize += align(BR->getSize()); } @@ -347,13 +348,14 @@ Record *Program::getOrCreateRecord(const RecordDecl *RD) { return nullptr; VirtSize += align(sizeof(InlineDescriptor)); - VirtBases.push_back({BD, VirtSize, Desc, BR}); + VirtBases.emplace_back(BD, Desc, BR, VirtSize); VirtSize += align(BR->getSize()); } } // Reserve space for fields. Record::FieldList Fields; + Fields.reserve(RD->getNumFields()); for (const FieldDecl *FD : RD->fields()) { FD = FD->getFirstDecl(); // Note that we DO create fields and descriptors @@ -378,7 +380,7 @@ Record *Program::getOrCreateRecord(const RecordDecl *RD) { } if (!Desc) return nullptr; - Fields.push_back({FD, BaseSize, Desc}); + Fields.emplace_back(FD, Desc, BaseSize); BaseSize += align(Desc->getAllocSize()); } diff --git a/clang/lib/AST/ByteCode/Record.cpp b/clang/lib/AST/ByteCode/Record.cpp index ff5c82d244574..a44508e17b8ba 100644 --- a/clang/lib/AST/ByteCode/Record.cpp +++ b/clang/lib/AST/ByteCode/Record.cpp @@ -19,12 +19,10 @@ Record::Record(const RecordDecl *Decl, BaseList &&SrcBases, BaseSize(BaseSize), VirtualSize(VirtualSize), IsUnion(Decl->isUnion()), IsAnonymousUnion(IsUnion && Decl->isAnonymousStructOrUnion()) { for (Base &V : SrcVirtualBases) - VirtualBases.push_back({V.Decl, V.Offset + BaseSize, V.Desc, V.R}); + VirtualBases.push_back({V.Decl, V.Desc, V.R, V.Offset + BaseSize}); for (Base &B : Bases) BaseMap[B.Decl] = &B; - for (Field &F : Fields) - FieldMap[F.Decl] = &F; for (Base &V : VirtualBases) VirtualBaseMap[V.Decl] = &V; } @@ -44,12 +42,6 @@ bool Record::hasTrivialDtor() const { return !Dtor || Dtor->isTrivial(); } -const Record::Field *Record::getField(const FieldDecl *FD) const { - auto It = FieldMap.find(FD->getFirstDecl()); - assert(It != FieldMap.end() && "Missing field"); - return It->second; -} - const Record::Base *Record::getBase(const RecordDecl *FD) const { auto It = BaseMap.find(FD); assert(It != BaseMap.end() && "Missing base"); diff --git a/clang/lib/AST/ByteCode/Record.h b/clang/lib/AST/ByteCode/Record.h index 7b66c3b263e38..29c500b9c29d5 100644 --- a/clang/lib/AST/ByteCode/Record.h +++ b/clang/lib/AST/ByteCode/Record.h @@ -13,13 +13,13 @@ #ifndef LLVM_CLANG_AST_INTERP_RECORD_H #define LLVM_CLANG_AST_INTERP_RECORD_H -#include "Descriptor.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" namespace clang { namespace interp { class Program; +struct Descriptor; /// Structure/Class descriptor. class Record final { @@ -27,18 +27,26 @@ class Record final { /// Describes a record field. struct Field { const FieldDecl *Decl; - unsigned Offset; const Descriptor *Desc; + unsigned Offset; + bool isBitField() const { return Decl->isBitField(); } bool isUnnamedBitField() const { return Decl->isUnnamedBitField(); } + + Field(const FieldDecl *D, const Descriptor *Desc, unsigned Offset) + : Decl(D), Desc(Desc), Offset(Offset) {} }; /// Describes a base class. struct Base { const RecordDecl *Decl; - unsigned Offset; const Descriptor *Desc; const Record *R; + unsigned Offset; + + Base(const RecordDecl *D, const Descriptor *Desc, const Record *R, + unsigned Offset) + : Decl(D), Desc(Desc), R(R), Offset(Offset) {} }; /// Mapping from identifiers to field descriptors. @@ -46,7 +54,7 @@ class Record final { /// Mapping from identifiers to base classes. using BaseList = llvm::SmallVector<Base, 8>; /// List of virtual base classes. - using VirtualBaseList = llvm::SmallVector<Base, 2>; + using VirtualBaseList = llvm::SmallVector<Base, 0>; public: /// Returns the underlying declaration. @@ -80,7 +88,9 @@ class Record final { unsigned getNumFields() const { return Fields.size(); } const Field *getField(unsigned I) const { return &Fields[I]; } /// Returns a field. - const Field *getField(const FieldDecl *FD) const; + const Field *getField(const FieldDecl *FD) const { + return &Fields[FD->getFieldIndex()]; + } using const_base_iter = BaseList::const_iterator; llvm::iterator_range<const_base_iter> bases() const { @@ -131,8 +141,6 @@ class Record final { /// Mapping from declarations to bases. llvm::DenseMap<const RecordDecl *, const Base *> BaseMap; - /// Mapping from field identifiers to descriptors. - llvm::DenseMap<const FieldDecl *, const Field *> FieldMap; /// Mapping from declarations to virtual bases. llvm::DenseMap<const RecordDecl *, Base *> VirtualBaseMap; /// Size of the structure. _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
